Полнотекстовый поиск документов

Нам часто нужен API полнотекстового поиска, который позволяет нашим приложениям искать в документах определенную информацию, указанную в виде запроса текстового поиска. Документы могут быть в любом формате, таком как Word (Doc, Docx), PDF, HTML, EPUB, электронная таблица (XLS, XLSX), презентация (PPT, PPTX), изображения и видео.

GroupDocs.Search – это мощный API полнотекстового поиска, который позволяет выполнять поиск в более 70 форматах документов в ваших приложениях. Чтобы сделать возможным мгновенный поиск по тысячам документов, их необходимо добавить в индекс.

Зачем использовать GroupDocs.Search разработчику?

  • Для поиска документов поддерживаемых форматов не требуется дополнительное программное обеспечение.
  • Большое разнообразие вариантов индексации и поиска для удовлетворения любых требований.
  • Широкий выбор типов поиска доступен в текстовых или объектных формах запросов.
  • Высокая производительность индексации и поиска достигается за счет уникальных алгоритмов и структур данных, оптимизаций и многопоточного выполнения.
  • Поддерживаются различные способы визуализации результатов поиска в тексте документов.

Пожалуйста, прочтите статью О поисковых системах, чтобы узнать, какое место GroupDocs.Search API занимает в классификации поисковых систем.

Монтаж

GroupDocs.Search для .NET размещается на NuGet и может быть легко установлен с помощью диспетчера пакетов NuGet. Кроме того, вы можете загрузить DLL API из раздела Загрузки.

Поиск в документах Office с помощью C#

Следующие шаги объясняют, как искать слова или фразы в нескольких документах (Word, Excel, PDF и других форматах документов).

  • Создать новый индекс: Прежде всего, вам необходимо создать индекс. Индекс может быть создан в памяти или на диске. Индекс, созданный в памяти, не может быть сохранен после выхода из вашей программы. Напротив, индекс, созданный на диске, может быть загружен в будущем для продолжения работы. Подробности создания индекса описаны в разделе Создание индекса.
  • Подпишитесь на события индексации: После создания индекса вам необходимо добавить документы в индекс для индексации. Индексация документов может быть успешной или неудачной по разным причинам, например, из-за ошибок чтения с диска или наличия пароля для доступа к документу. Чтобы получать информацию об ошибках индексации, вы можете подписаться на событие ErrorOccurred. Для работы с событиями см. раздел События поискового индекса.
  • Индексировать документы: индексирование документов может выполняться синхронно или асинхронно. Синхронное индексирование означает, что поток, запустивший процесс индексирования, будет занят до завершения операции. Однако чаще необходимо выполнять индексирование асинхронно, с возможностью выполнения других задач в потоке, запустившем операцию. Подробное описание всех аспектов процесса индексации представлено в разделе Индексирование.
  • Выполнить поиск: Когда документы проиндексированы, индекс готов к обработке поисковых запросов. Поддерживаются следующие типы поисковых запросов: простые, нечеткие, с учетом регистра, логические, фразовые, фасетные, с подстановочными знаками и другие. Описание поисковых запросов различных типов представлено в разделе Поиск.
  • Использовать результаты поиска: Когда поиск завершен, вам нужно как-то интерпретировать результат. Результат может быть представлен простым списком найденных документов, либо найденные слова и словосочетания могут быть выделены в тексте документа. Дополнительную информацию об обработке результатов поиска см. в разделе Результаты поиска.
string indexFolder = @"/Users/muhammadsohailismail/MyIndex/"; // Specify the path to the index folder
string documentsFolder = @"/Users/muhammadsohailismail/MyDocuments/"; // Specify the path to a folder containing documents to search

// a) Create new index or
// b) Open existing index
Index index = new Index(indexFolder);

// c) Subscribe to index events
index.Events.ErrorOccurred += (sender, args) =>
{
    Console.WriteLine(args.Message); // Writing error messages to the console
};

// d) Add files synchronously
index.Add(documentsFolder); // Synchronous indexing documents from the specified folder

// f) Perform search
string query = "Worthy"; // Specify a search query
SearchResult result = index.Search(query); // Searching in the index

// g) Use search results
// Printing the result
Console.WriteLine("Documents found: " + result.DocumentCount);
Console.WriteLine("Total occurrences found: " + result.OccurrenceCount);
for (int i = 0; i < result.DocumentCount; i++)
{
    FoundDocument document = result.GetFoundDocument(i);
    Console.WriteLine("\\tDocument: " + document.DocumentInfo.FilePath);
    Console.WriteLine("\\tOccurrences: " + document.OccurrenceCount);
}

// Highlight occurrences in text
if (result.DocumentCount > 0)
{
    FoundDocument document = result.GetFoundDocument(0); // Getting the first found document
    string path = @"/Users/muhammadsohailismail/Output/Highlighted.html";
    OutputAdapter outputAdapter = new FileOutputAdapter(path); // Creating the output adapter to a file
    HtmlHighlighter highlighter = new HtmlHighlighter(outputAdapter); // Creating the highlighter object
    index.Highlight(document, highlighter); // Generating output HTML formatted document with highlighted search results

    Console.WriteLine();
    Console.WriteLine("Generated HTML file can be opened with Internet browser.");
    Console.WriteLine("The file can be found by the following path:");
    Console.WriteLine(Path.GetFullPath(path));
}

Приведенный выше код генерирует следующий вывод и HTML-файл.

Поиск в полях документов с использованием C#

Фасетный поиск — это фильтрация результатов поиска путем установки допустимых имен полей документа для поиска. Фасетный поиск позволяет искать только в определенных полях документов, например, только в поле содержимого или в поле имени файла. Ниже представлен пример простого многогранного поиска с запросами в текстовой и объектной форме.

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);
 
// Search in the content field with text query
SearchResult result1 = index.Search("content: Einstein");
 
// Search in the content field with object query
SearchQuery wordQuery = SearchQuery.CreateWordQuery("Einstein");
SearchQuery fieldQuery = SearchQuery.CreateFieldQuery(CommonFieldNames.Content, wordQuery);
SearchResult result2 = index.Search(fieldQuery);

Использование полей, специфичных для формата

Для каждого формата документа существуют стандартные поля, которые могут присутствовать в документах данного типа. Библиотека предоставляет следующие классы, содержащие константы с именами стандартных полей документа: EpubFieldNames, FictionBookFieldNames, MailFieldNames, PresentationFieldNames, SpreadsheetFieldNames. , WordsFieldNames.

Также есть поля, которые могут присутствовать в документах любого типа. Имена таких полей представлены в классе CommonFieldNames.

Пример использования стандартных имен полей документов представлен в следующем примере.

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);
 
// Search in the content field with text query
string query1 = WordsFieldNames.Company + ": Dycum";
SearchResult result1 = index.Search(query1);
 
// Search in the content field with object query
SearchQuery wordQuery = SearchQuery.CreateWordQuery("Dycum");
SearchQuery fieldQuery = SearchQuery.CreateFieldQuery(WordsFieldNames.Company, wordQuery);
SearchResult result2 = index.Search(fieldQuery);

Подробная информация о фасетном поиске представлена на странице Фасетный поиск.

Вывод

В этой статье объясняется, как искать в документах (DOCX, PDF, Excel, текстовые файлы) определенную информацию на C#. Также объяснялось, как искать в полях документов. GroupDocs.Search содержит несколько других функций, пожалуйста, ознакомьтесь с документацией, чтобы узнать о них больше.