GroupDocs.Search for .NET 23.10 Release Notes

Major Features

There are the following features, enhancements, and fixes in this release:

  • Implement scaling of search index
  • Implement a search option to get attributes in search results

Full List of Issues Covering all Changes in this Release

KeySummaryCategory
SEARCHNET-2088Implement scaling of search indexFeature
SEARCHNET-2910Implement a search option to get attributes in search resultsEnhancement
SEARCHNET-2957Remove indexing options from index settingsBreaking change

Public API and Backward Incompatible Changes

Implement scaling of search index

This feature implements the ability to scale the search index to increase indexing performance and search performance.

Public API changes

Class ChangeAttributesOptions has been added to GroupDocs.Search.Options namespace.
Constructor ChangeAttributesOptions() has been added to GroupDocs.Search.Options.ChangeAttributesOptions class.
Property Boolean IsAsync has been added to GroupDocs.Search.Options.ChangeAttributesOptions class.

Class Configuration has been added to GroupDocs.Search.Scaling.Configuring namespace.

Class Configurator has been added to GroupDocs.Search.Scaling.Configuring namespace.
Method GroupDocs.Search.Scaling.Configuring.NodeConfigurator AddNode(Int32) has been added to GroupDocs.Search.Scaling.Configuring.Configurator class.
Method GroupDocs.Search.Scaling.Configuring.Configuration CompleteConfiguration() has been added to GroupDocs.Search.Scaling.Configuring.Configurator class.
Constructor Configurator() has been added to GroupDocs.Search.Scaling.Configuring.Configurator class.
Method GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator SetIndexSettings() has been added to GroupDocs.Search.Scaling.Configuring.Configurator class.

Class DataExtractedEventArgs has been added to GroupDocs.Search.Scaling.Events namespace.
Property System.String DocumentKey has been added to GroupDocs.Search.Scaling.Events.DataExtractedEventArgs class.
Property Int32 ExtractorIndex has been added to GroupDocs.Search.Scaling.Events.DataExtractedEventArgs class.

Class DeleteOptions has been added to GroupDocs.Search.Options namespace.
Constructor DeleteOptions() has been added to GroupDocs.Search.Options.DeleteOptions class.
Property Boolean IsAsync has been added to GroupDocs.Search.Options.DeleteOptions class.

Enum DictionaryType has been added to GroupDocs.Search.Dictionaries namespace.
Field GroupDocs.Search.Dictionaries.DictionaryType AliasDictionary has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.
Field GroupDocs.Search.Dictionaries.DictionaryType Alphabet has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.
Field GroupDocs.Search.Dictionaries.DictionaryType CharacterReplacementDictionary has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.
Field GroupDocs.Search.Dictionaries.DictionaryType HomophoneDictionary has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.
Field GroupDocs.Search.Dictionaries.DictionaryType PasswordDictionary has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.
Field GroupDocs.Search.Dictionaries.DictionaryType SpellingCorrector has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.
Field GroupDocs.Search.Dictionaries.DictionaryType StopWordDictionary has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.
Field GroupDocs.Search.Dictionaries.DictionaryType SynonymDictionary has been added to GroupDocs.Search.Dictionaries.DictionaryType enum.

Class DocumentDeletedEventArgs has been added to GroupDocs.Search.Scaling.Events namespace.
Property System.String DocumentKey has been added to GroupDocs.Search.Scaling.Events.DocumentDeletedEventArgs class.
Property Int32 ShardIndex has been added to GroupDocs.Search.Scaling.Events.DocumentDeletedEventArgs class.

Class DocumentIndexedEventArgs has been added to GroupDocs.Search.Scaling.Events namespace.
Property System.String DocumentKey has been added to GroupDocs.Search.Scaling.Events.DocumentIndexedEventArgs class.
Property Int32 ShardIndex has been added to GroupDocs.Search.Scaling.Events.DocumentIndexedEventArgs class.

Class ErrorOccurredEventArgs has been added to GroupDocs.Search.Scaling.Events namespace.
Property System.String Message has been added to GroupDocs.Search.Scaling.Events.ErrorOccurredEventArgs class.
Property Int32 NodeIndex has been added to GroupDocs.Search.Scaling.Events.ErrorOccurredEventArgs class.
Property Int32 ServiceIndex has been added to GroupDocs.Search.Scaling.Events.ErrorOccurredEventArgs class.

Class Indexer has been added to GroupDocs.Search.Scaling namespace.
Method Void Add(GroupDocs.Search.Common.Document[], System.String[], GroupDocs.Search.Options.IndexingOptions) has been added to GroupDocs.Search.Scaling.Indexer class.
Method Void ChangeAttributes(GroupDocs.Search.Common.AttributeChangeBatch, GroupDocs.Search.Options.ChangeAttributesOptions) has been added to GroupDocs.Search.Scaling.Indexer class.
Method Void Delete(System.String[], GroupDocs.Search.Options.DeleteOptions) has been added to GroupDocs.Search.Scaling.Indexer class.
Method Void DeleteAllData() has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.AliasDictionary GetAliasDictionary(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.Alphabet GetAlphabet(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method System.String[] GetAttributes(System.String) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.CharacterReplacementDictionary GetCharacterReplacementDictionary(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.DictionaryBase GetDictionary(GroupDocs.Search.Dictionaries.DictionaryType, Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.HomophoneDictionary GetHomophoneDictionary(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.PasswordDictionary GetPasswordDictionary(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.SpellingCorrector GetSpellingCorrector(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.StopWordDictionary GetStopWordDictionary(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method GroupDocs.Search.Dictionaries.SynonymDictionary GetSynonymDictionary(Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method Void Optimize(GroupDocs.Search.Options.OptimizeOptions) has been added to GroupDocs.Search.Scaling.Indexer class.
Method Void SetDictionary(GroupDocs.Search.Dictionaries.DictionaryBase, Int32) has been added to GroupDocs.Search.Scaling.Indexer class.
Method Void SetDictionary(GroupDocs.Search.Dictionaries.DictionaryBase) has been added to GroupDocs.Search.Scaling.Indexer class.
Method Void Synchronize(GroupDocs.Search.Options.SynchronizeOptions) has been added to GroupDocs.Search.Scaling.Indexer class.

Class IndexSettingsConfigurator has been added to GroupDocs.Search.Scaling.Configuring namespace.
Method GroupDocs.Search.Scaling.Configuring.Configurator CompleteIndexSettings() has been added to GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator SetIndexType(GroupDocs.Search.Options.IndexType) has been added to GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator SetSearchThreads(GroupDocs.Search.Options.NumberOfThreads) has been added to GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator SetTextStorageSettings(Boolean, GroupDocs.Search.Options.Compression) has been added to GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator SetUseCharacterReplacements(Boolean) has been added to GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator SetUseStopWords(Boolean) has been added to GroupDocs.Search.Scaling.Configuring.IndexSettingsConfigurator class.

Interface INetworkSettings has been added to GroupDocs.Search.Scaling.Configuring namespace.

Class NetworkDocumentInfo has been added to GroupDocs.Search.Scaling.Results namespace.
Property GroupDocs.Search.Results.DocumentInfo DocumentInfo has been added to GroupDocs.Search.Scaling.Results.NetworkDocumentInfo class.
Property Int32 ShardIndex has been added to GroupDocs.Search.Scaling.Results.NetworkDocumentInfo class.

Class NetworkFoundDocument has been added to GroupDocs.Search.Scaling.Results namespace.
Property GroupDocs.Search.Results.FoundDocument FoundDocument has been added to GroupDocs.Search.Scaling.Results.NetworkFoundDocument class.
Property Int32 ShardIndex has been added to GroupDocs.Search.Scaling.Results.NetworkFoundDocument class.

Class NetworkImageSearchResult has been added to GroupDocs.Search.Scaling.Results namespace.
Method GroupDocs.Search.Results.FoundImageFrame GetFoundImage(Int32) has been added to GroupDocs.Search.Scaling.Results.NetworkImageSearchResult class.
Property Int32 ImageCount has been added to GroupDocs.Search.Scaling.Results.NetworkImageSearchResult class.
Property GroupDocs.Search.Scaling.Results.NetworkImageSearchToken NetworkImageSearchToken has been added to GroupDocs.Search.Scaling.Results.NetworkImageSearchResult class.
Property Int32 NodeIndex has been added to GroupDocs.Search.Scaling.Results.NetworkImageSearchResult class.
Property Int32 ShardIndex has been added to GroupDocs.Search.Scaling.Results.NetworkImageSearchResult class.

Class NetworkImageSearchToken has been added to GroupDocs.Search.Scaling.Results namespace.

Class NetworkIndexingProgressEventArgs has been added to GroupDocs.Search.Scaling.Events namespace.
Property Int32 NodeIndex has been added to GroupDocs.Search.Scaling.Events.NetworkIndexingProgressEventArgs class.
Property Int32 ProcessedDocuments has been added to GroupDocs.Search.Scaling.Events.NetworkIndexingProgressEventArgs class.
Property Double ProgressPercentage has been added to GroupDocs.Search.Scaling.Events.NetworkIndexingProgressEventArgs class.
Property Int32 ServiceIndex has been added to GroupDocs.Search.Scaling.Events.NetworkIndexingProgressEventArgs class.
Property Int32 TotalDocuments has been added to GroupDocs.Search.Scaling.Events.NetworkIndexingProgressEventArgs class.

Class NetworkOptimizationProgressEventArgs has been added to GroupDocs.Search.Scaling.Events namespace.
Property Int32 NodeIndex has been added to GroupDocs.Search.Scaling.Events.NetworkOptimizationProgressEventArgs class.
Property Int32 ProcessedSegments has been added to GroupDocs.Search.Scaling.Events.NetworkOptimizationProgressEventArgs class.
Property Double ProgressPercentage has been added to GroupDocs.Search.Scaling.Events.NetworkOptimizationProgressEventArgs class.
Property Int32 ServiceIndex has been added to GroupDocs.Search.Scaling.Events.NetworkOptimizationProgressEventArgs class.
Property Int32 TotalSegments has been added to GroupDocs.Search.Scaling.Events.NetworkOptimizationProgressEventArgs class.

Class NetworkSearchResult has been added to GroupDocs.Search.Scaling.Results namespace.
Property Int32 DocumentCount has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property System.DateTime EndTime has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Method System.Collections.Generic.IEnumerator<GroupDocs.Search.Scaling.Results.NetworkFoundDocument> GetEnumerator() has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Method GroupDocs.Search.Scaling.Results.NetworkFoundDocument GetFoundDocument(Int32) has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property GroupDocs.Search.Scaling.Results.NetworkSearchToken NextChunkSearchToken has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property Int32 NodeIndex has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property Int32 OccurrenceCount has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property System.TimeSpan SearchDuration has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property System.DateTime StartTime has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property Boolean Truncated has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.
Property System.String Warnings has been added to GroupDocs.Search.Scaling.Results.NetworkSearchResult class.

Class NetworkSearchToken has been added to GroupDocs.Search.Scaling.Results namespace.

Class NodeConfigurator has been added to GroupDocs.Search.Scaling.Configuring namespace.
Method GroupDocs.Search.Scaling.Configuring.NodeConfigurator AddExtractor(System.String) has been added to GroupDocs.Search.Scaling.Configuring.NodeConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.NodeConfigurator AddIndexer(System.String) has been added to GroupDocs.Search.Scaling.Configuring.NodeConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.NodeConfigurator AddLogSink() has been added to GroupDocs.Search.Scaling.Configuring.NodeConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.NodeConfigurator AddSearcher(System.String) has been added to GroupDocs.Search.Scaling.Configuring.NodeConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.NodeConfigurator AddShard(System.String) has been added to GroupDocs.Search.Scaling.Configuring.NodeConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.Configurator CompleteNode() has been added to GroupDocs.Search.Scaling.Configuring.NodeConfigurator class.
Method GroupDocs.Search.Scaling.Configuring.NodeConfigurator SetTcpEndpoint(System.String, Int32) has been added to GroupDocs.Search.Scaling.Configuring.NodeConfigurator class.

Class NodeEventHub has been added to GroupDocs.Search.Scaling.Events namespace.
Event System.EventHandler AttributeChangesCompleted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler ConfigurationCompleted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler<GroupDocs.Search.Scaling.Events.DataExtractedEventArgs> DataExtracted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler DeletionCompleted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler<GroupDocs.Search.Scaling.Events.DocumentDeletedEventArgs> DocumentDeleted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler<GroupDocs.Search.Scaling.Events.DocumentIndexedEventArgs> DocumentIndexed has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler<GroupDocs.Search.Scaling.Events.ErrorOccurredEventArgs> ErrorOccurred has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler IndexingCompleted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler<GroupDocs.Search.Scaling.Events.NetworkIndexingProgressEventArgs> IndexingProgressChanged has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler OptimizationCompleted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler<GroupDocs.Search.Scaling.Events.NetworkOptimizationProgressEventArgs> OptimizationProgressChanged has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler<GroupDocs.Search.Scaling.Events.StatusChangedEventArgs> StatusChanged has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.
Event System.EventHandler SynchronizationCompleted has been added to GroupDocs.Search.Scaling.Events.NodeEventHub class.

Class OptimizeOptions has been added to GroupDocs.Search.Options namespace.
Property Boolean IsAsync has been added to GroupDocs.Search.Options.OptimizeOptions class.
Constructor OptimizeOptions() has been added to GroupDocs.Search.Options.OptimizeOptions class.

Class PlatformHelper has been added to GroupDocs.Foundation.Internal.Utils.Common namespace.
Property Boolean IsLinux has been added to GroupDocs.Foundation.Internal.Utils.Common.PlatformHelper class.
Property Boolean IsWindows has been added to GroupDocs.Foundation.Internal.Utils.Common.PlatformHelper class.

Class Searcher has been added to GroupDocs.Search.Scaling namespace.
Method Void GetDocumentText(GroupDocs.Search.Scaling.Results.NetworkDocumentInfo, GroupDocs.Search.Common.OutputAdapter) has been added to GroupDocs.Search.Scaling.Searcher class.
Method GroupDocs.Search.Scaling.Results.NetworkDocumentInfo[] GetIndexedDocumentItems(GroupDocs.Search.Scaling.Results.NetworkDocumentInfo) has been added to GroupDocs.Search.Scaling.Searcher class.
Method GroupDocs.Search.Scaling.Results.NetworkDocumentInfo[] GetIndexedDocuments(Int32) has been added to GroupDocs.Search.Scaling.Searcher class.
Method Void Highlight(GroupDocs.Search.Scaling.Results.NetworkFoundDocument, GroupDocs.Search.Highlighters.Highlighter, GroupDocs.Search.Options.HighlightOptions) has been added to GroupDocs.Search.Scaling.Searcher class.
Method GroupDocs.Search.Scaling.Results.NetworkSearchResult SearchFirst(GroupDocs.Search.SearchQuery, GroupDocs.Search.Options.SearchOptions) has been added to GroupDocs.Search.Scaling.Searcher class.
Method GroupDocs.Search.Scaling.Results.NetworkImageSearchResult SearchFirst(GroupDocs.Search.Common.SearchImage, GroupDocs.Search.Options.ImageSearchOptions) has been added to GroupDocs.Search.Scaling.Searcher class.
Method GroupDocs.Search.Scaling.Results.NetworkSearchResult SearchNext(GroupDocs.Search.Scaling.Results.NetworkSearchToken) has been added to GroupDocs.Search.Scaling.Searcher class.
Method GroupDocs.Search.Scaling.Results.NetworkImageSearchResult SearchNext(GroupDocs.Search.Scaling.Results.NetworkImageSearchToken) has been added to GroupDocs.Search.Scaling.Searcher class.

Class SearchNetworkNode has been added to GroupDocs.Search.Scaling namespace.
Method Void ConfigureAllNodes() has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Method Void ConfigureNode(Int32) has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Property GroupDocs.Search.Common.CustomExtractorCollection CustomExtractors has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Method Void Dispose() has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Property GroupDocs.Search.Scaling.Events.NodeEventHub Events has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Method Int32 GetNodeIndex(Int32) has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Method Int32[] GetShardIndices() has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Property GroupDocs.Search.Scaling.Indexer Indexer has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Property Int32 NodeIndex has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Property GroupDocs.Search.Scaling.Searcher Searcher has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Constructor SearchNetworkNode(Int32, System.String, GroupDocs.Search.Scaling.Configuring.INetworkSettings) has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Constructor SearchNetworkNode(Int32, System.String, GroupDocs.Search.Scaling.Configuring.INetworkSettings, GroupDocs.Search.Common.ILogger) has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Constructor SearchNetworkNode(Int32, System.String, GroupDocs.Search.Scaling.Configuring.INetworkSettings, GroupDocs.Search.Common.ILogger, GroupDocs.Search.Scaling.Configuring.Configuration) has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Method Void SetOcrConnector(GroupDocs.Search.Options.IOcrConnector) has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Method Void SetWordFormsProvider(GroupDocs.Search.Dictionaries.IWordFormsProvider) has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.
Method Void Start() has been added to GroupDocs.Search.Scaling.SearchNetworkNode class.

Enum SearchNetworkStatus has been added to GroupDocs.Search.Scaling namespace.
Field GroupDocs.Search.Scaling.SearchNetworkStatus ChangingAttributes has been added to GroupDocs.Search.Scaling.SearchNetworkStatus enum.
Field GroupDocs.Search.Scaling.SearchNetworkStatus Configuring has been added to GroupDocs.Search.Scaling.SearchNetworkStatus enum.
Field GroupDocs.Search.Scaling.SearchNetworkStatus Deleting has been added to GroupDocs.Search.Scaling.SearchNetworkStatus enum.
Field GroupDocs.Search.Scaling.SearchNetworkStatus Indexing has been added to GroupDocs.Search.Scaling.SearchNetworkStatus enum.
Field GroupDocs.Search.Scaling.SearchNetworkStatus Optimizing has been added to GroupDocs.Search.Scaling.SearchNetworkStatus enum.
Field GroupDocs.Search.Scaling.SearchNetworkStatus Ready has been added to GroupDocs.Search.Scaling.SearchNetworkStatus enum.
Field GroupDocs.Search.Scaling.SearchNetworkStatus Synchronizing has been added to GroupDocs.Search.Scaling.SearchNetworkStatus enum.

Class StatusChangedEventArgs has been added to GroupDocs.Search.Scaling.Events namespace.
Property GroupDocs.Search.Scaling.SearchNetworkStatus NewStatus has been added to GroupDocs.Search.Scaling.Events.StatusChangedEventArgs class.
Property GroupDocs.Search.Scaling.SearchNetworkStatus OldStatus has been added to GroupDocs.Search.Scaling.Events.StatusChangedEventArgs class.

Class SynchronizeOptions has been added to GroupDocs.Search.Options namespace.
Property Boolean IsAsync has been added to GroupDocs.Search.Options.SynchronizeOptions class.
Constructor SynchronizeOptions() has been added to GroupDocs.Search.Options.SynchronizeOptions class.

Class TcpSettings has been added to GroupDocs.Search.Scaling.Configuring namespace.
Property Int32 ListeningPort has been added to GroupDocs.Search.Scaling.Configuring.TcpSettings class.
Property Int32 ReceiveTimeout has been added to GroupDocs.Search.Scaling.Configuring.TcpSettings class.
Property Int32 SendTimeout has been added to GroupDocs.Search.Scaling.Configuring.TcpSettings class.
Constructor TcpSettings(Int32, Int32, Int32) has been added to GroupDocs.Search.Scaling.Configuring.TcpSettings class.

Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.AliasDictionary class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.Alphabet class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.CharacterReplacementDictionary class.
Method Void Clear() has been added to GroupDocs.Search.Dictionaries.DictionaryBase class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.DictionaryBase class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.HomophoneDictionary class.
Property System.String Encoding has been added to GroupDocs.Search.Options.IndexingOptions class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.PasswordDictionary class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.SpellingCorrector class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.StopWordDictionary class.
Property GroupDocs.Search.Dictionaries.DictionaryType DictionaryType has been added to GroupDocs.Search.Dictionaries.SynonymDictionary class.
Property System.String Encoding has been added to GroupDocs.Search.Options.UpdateOptions class.

Use cases

The following example demonstrates how to configure a search network and run a main node.

private static SearchNetworkNode Configure()
{
    int basePort = 49901;
    Configuration configuration = new Configurator()
        .SetIndexSettings()
            .SetUseStopWords(false)
            .SetUseCharacterReplacements(false)
            .SetTextStorageSettings(true, Compression.High)
            .SetIndexType(IndexType.NormalIndex)
            .SetSearchThreads(NumberOfThreads.Default)
            .CompleteIndexSettings()
        .AddNode(0)
            .SetTcpEndpoint("192.168.1.76", basePort)
            .AddLogSink()
            .AddIndexer(@"C:\Indexer0")
            .AddSearcher(@"C:\Searcher0")
            .CompleteNode()
        .AddNode(1)
            .SetTcpEndpoint("192.168.1.143", basePort)
            .AddShard(@"C:\Shard1")
            .AddExtractor(@"C:\Extractor1")
            .CompleteNode()
        .CompleteConfiguration();

    int sendTimeout = 3000;
    int receiveTimeout = 3000;
    var tcpSettings = new TcpSettings(basePort, sendTimeout, receiveTimeout);
    SearchNetworkNode node = new SearchNetworkNode(0, @"C:\Node0", tcpSettings, new ConsoleLogger(), configuration);

    Console.WriteLine("Configuring");
    node.ConfigureAllNodes();
    node.Start();

    return node;
}

The following example demonstrates how to subscribe to events on the main node.

private static void Subscibe(SearchNetworkNode node)
{
    node.Events.IndexingCompleted += (s, e) =>
    {
        Console.WriteLine();
        Console.WriteLine("Indexing complete");
    };
    node.Events.DeletionCompleted += (s, e) =>
    {
        Console.WriteLine();
        Console.WriteLine("Deleting complete");
    };
    node.Events.OptimizationCompleted += (s, e) =>
    {
        Console.WriteLine();
        Console.WriteLine("Optimization complete");
    };
    node.Events.AttributeChangesCompleted += (s, e) =>
    {
        Console.WriteLine();
        Console.WriteLine("Attribute changes complete");
    };
    node.Events.ConfigurationCompleted += (s, e) =>
    {
        Console.WriteLine();
        Console.WriteLine("Configuration complete");
    };
    node.Events.StatusChanged += (s, e) =>
    {
        Console.WriteLine();
        Console.WriteLine(e.OldStatus + " -> " + e.NewStatus);
    };
    node.Events.DataExtracted += (s, e) =>
    {
        Console.WriteLine("Extracted " + e.ExtractorIndex + ": " + e.DocumentKey);
    };
    node.Events.DocumentIndexed += (s, e) =>
    {
        Console.WriteLine("Indexed " + e.ShardIndex + ": " + e.DocumentKey);
    };
}

The following example demonstrates how to add documents to the distributed index on the main node.

private static void AddToIndex(SearchNetworkNode node, params string[] filePaths)
{
    Stream[] streams = new Stream[filePaths.Length];
    Document[] documents = new Document[filePaths.Length];
    string[] passwords = new string[filePaths.Length];
    for (int i = 0; i < filePaths.Length; i++)
    {
        string filePath = filePaths[i];
        DateTime modificationDate = File.GetLastWriteTime(filePath);
        string fileName = Path.GetFileName(filePath);
        string extension = Path.GetExtension(filePath);
        Stream stream = File.OpenRead(filePath);
        streams[i] = stream;
        Document document = Document.CreateFromStream(
            fileName,
            modificationDate,
            extension,
            stream);
        documents[i] = document;
    }

    Indexer indexer = node.Indexer;
    IndexingOptions options = new IndexingOptions();
    options.IsAsync = false;
    indexer.Add(documents, passwords, options);

    for (int i = 0; i < streams.Length; i++)
    {
        streams[i].Close();
    }
}

The following example demonstrates how to search in the distributed index on the main node.

private static void SearchInIndex(
    SearchNetworkNode node,
    string word)
{
    SearchQuery query = SearchQuery.CreateWordQuery(word);
    Console.WriteLine("Search first for: " + query);
    Searcher searcher = node.Searcher;
    SearchOptions options = new SearchOptions();
    options.IsChunkSearch = true;
    int hits = 0;
    List<NetworkFoundDocument> docs = new List<NetworkFoundDocument>();

    NetworkSearchResult result = searcher.SearchFirst(query, options);

    AddDocsFromResult(docs, result);
    hits += result.OccurrenceCount;
    TraceResult(result);

    while (result.NextChunkSearchToken != null)
    {
        Console.WriteLine("Search next");

        result = searcher.SearchNext(result.NextChunkSearchToken);

        AddDocsFromResult(docs, result);
        hits += result.OccurrenceCount;
        TraceResult(result);
    }
    Console.WriteLine("Total documents: " + docs.Count);
    Console.WriteLine("Total occurrences: " + hits);
}

The following example shows how to put it all together on the main node.

public static void Run()
{
    var licensePath = @"C:\License.lic";
    new License().SetLicense(licensePath);

    var directory = @"C:\Documents";
    var paths = Directory.GetFiles(directory);
    Console.WriteLine("Total files: " + paths.Length);

    SearchNetworkNode node = Configure();

    Subscibe(node);

    var sw = Stopwatch.StartNew();
    AddToIndex(node, paths);
    sw.Stop();
    Console.WriteLine("Indexing time: " + sw.Elapsed);

    sw = Stopwatch.StartNew();
    SearchInIndex(node, "house");
    sw.Stop();
    Console.WriteLine("Search time: " + sw.Elapsed);

    Console.WriteLine("Done");
    Console.ReadKey();
}

private static void TraceResult(NetworkSearchResult result)
{
    Console.WriteLine("From node " + result.NodeIndex + ": occurrence count - " + result.OccurrenceCount);
}

private static void AddDocsFromResult(List<NetworkFoundDocument> docs, NetworkSearchResult result)
{
    for (int i = 0; i < result.DocumentCount; i++)
    {
        docs.Add(result.GetFoundDocument(i));
    }
}

The following example shows how to create a simple logger for a remote node.

public class ConsoleLogger : ILogger
{
    public void Error(string message)
    {
        Console.WriteLine("Error: " + message);
    }

    public void Trace(string message)
    {
        Console.WriteLine("Trace: " + message);
    }
}

The following example shows how to set up a remote node.

static void Main(string[] args)
{
    var licensePath = @"C:\License.lic";
    new License().SetLicense(licensePath);

    Console.WriteLine("Initializing");
    int sendTimeout = 3000;
    int receiveTimeout = 3000;
    var tcpSettings = new TcpSettings(49901, sendTimeout, receiveTimeout);
    SearchNetworkNode node1 = new SearchNetworkNode(1, @"C:\Node1", tcpSettings, new ConsoleLogger());

    Console.WriteLine("Configuring");
    node1.Start();

    while (true)
    {
        Console.WriteLine("Press Q to exit.");
        var key = Console.ReadKey();
        if (key.Key == ConsoleKey.Q)
        {
            break;
        }
    }
}

Implement a search option to get attributes in search results

This enhancement implements the option to retrieve document attributes in search results.

Public API changes

Property System.String[] Attributes has been added to GroupDocs.Search.Results.FoundDocument class.
Property Boolean RetrieveAttributes has been added to GroupDocs.Search.Options.SearchOptions class.

Use cases

The following example demonstrates how to retrieve document attributes in search results.

string indexFolder = @"c:\MyIndex\";
string documentsFolder = @"c:\MyDocuments\";

// Creating an index in the specified folder
Index index = new Index(indexFolder);

// Indexing documents from the specified folder
index.Add(documentsFolder);

// Setting document attributes
AttributeChangeBatch batch = new AttributeChangeBatch();
batch.AddToAll("Marked");
index.ChangeAttributes(batch);

// Search with retrieving attributes
SearchOptions options = new SearchOptions();
options.RetrieveAttributes = true;
SearchResult result = index.Search("relativity", options);

for (int i = 0; i < result.DocumentCount; i++)
{
    FoundDocument document = result.GetFoundDocument(i);
    Console.WriteLine(document.DocumentInfo.FilePath);
    for (int j = 0; j < document.Attributes.Length; j++)
    {
        Console.WriteLine("\t" + document.Attributes[j]);
    }
}

Remove indexing options from index settings

This breaking change moves indexing options from index settings to option classes.

Public API changes

Property Boolean AutoDetectEncoding has been removed from GroupDocs.Search.IndexSettings class.
Property Boolean UseRawTextExtraction has been removed from GroupDocs.Search.IndexSettings class.

Property Boolean AutoDetectEncoding has been added to GroupDocs.Search.Options.ExtractionOptions class.
Property Boolean AutoDetectEncoding has been added to GroupDocs.Search.Options.IndexingOptions class.
Property Boolean AutoDetectEncoding has been added to GroupDocs.Search.Options.UpdateOptions class.
Property Boolean UseRawTextExtraction has been added to GroupDocs.Search.Options.IndexingOptions class.
Property Boolean UseRawTextExtraction has been added to GroupDocs.Search.Options.TextOptions class.
Property Boolean UseRawTextExtraction has been added to GroupDocs.Search.Options.UpdateOptions class.

Use cases

The following example demonstrates the use of moved options.

string indexFolder = @"c:\MyIndex";
string documentFilePath = @"c:\MyDocuments\ExampleDocument.txt";

// Creating an index
IndexSettings settings = new IndexSettings();
Index index = new Index(indexFolder, settings);

// Indexing document from the file
IndexingOptions options = new IndexingOptions();
options.AutoDetectEncoding = true;
options.UseRawTextExtraction = false;
index.Add(documentFilePath, options);