Узнайте, как читать и писать документы с помощью настраиваемых полнотекстовых запросов на C # с помощью NEST.

В этом простом руководстве я предоставлю простую демонстрацию для чтения и записи документов в Elasticsearch и добавлю функцию полнотекстового поиска в приложения C #. Весь исходный код доступен на GitHub.

Почему именно Elasticsearch?

Elasticsearch - это распределенная поисковая система с открытым исходным кодом, которая управляет всеми видами данных. Но почему Elasticsarch - лучшее решение для полнотекстового поиска?

Я начал играть с полнотекстовым поиском в своей диссертации в 2009 году, когда мне пришлось реализовать алгоритм поиска для системы рекомендаций по данным. Опыт был очень познавательным, но начинать с нуля было кровопролитием. При первой возможности использовать библиотеку я попробовал реализовать полнотекстовый поиск в Apache Lucene. По мере усложнения архитектуры приложения (т.е. нескольких серверов, которым необходимо совместно использовать индексированные данные) Solr предоставила масштабируемое решение. Это поисковая система на основе API с открытым исходным кодом (на основе Lucene). После использования этих библиотек я использовал Elastiserach, который сейчас является лидером в области маркетинга. Он поставляется с локальной бесплатной версией и доступен в облаке. Он масштабируется от простых установок до огромных сред. Возникает вопрос: а почему бы и нет?

Пример приложения

Чтобы показать, как работает Elasticsearch, я создал пример приложения, в котором реализованы две основные функции:

  • Создание индекса и добавление в него данных
  • Чтение данных с помощью полнотекстовых запросов

Пример кода доступен на GitHub. Чтобы запустить и протестировать его, просто скачайте, скомпилируйте и выполните:

Консольное приложение использует библиотеку ConsoleLineParser для человеческого анализа ввода. Поэтому я просто добавил два класса для атрибутов глагола и сопоставление между глаголами консоли и запускаемым кодом.

На основе введенного пользователем глагола (поиск или создание) запускается соответствующая процедура с передачей аргументов.

Как писать документы

Письменная часть довольно проста. На самом деле для Elasticsearch есть два варианта. Используя низкоуровневую структуру, вы можете просто получить упакованную реализацию эластичного API. Это помогает избежать ручной привязки и составления полезных данных JSON. Однако, если вы хотите поиграть с данными, хороший вариант - NEST. NEST - это высокоуровневый фреймворк, и если вы эксперт в ORM, это не должно быть сюрпризом.

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

Я не думаю, что это слишком сложно, и это больше похоже на обычную рутину. Вот фрагмент кода для определения класса. В этом примере я использовал только одно поле для каждого документа, содержащего строку текста.

Следующим шагом будет создание индекса. На этом этапе мы связываем индекс с классом. Это можно сделать вручную, указав параметры сохранения или используя автоматическое сопоставление. В нашем примере поле «Id» автоматически сопоставляется с уникальным идентификатором документа.

Наконец, у нас есть самая глупая часть кода: запись данных. Поскольку мы хотим сохранить все строки стихотворения во многих документах, по одной на строку, у нас есть только итерация.

Обратите внимание, что, используя API во внешней системе, мы можем использовать параллельную конструкцию для повышения производительности.

Как запрашивать документы

Эта часть довольно проста и очень понятна - по крайней мере, я надеюсь. Основной способ доступа к документам - использование обычного свободного синтаксиса LINQ. Это базовое использование, и я предпочитаю сосредоточить эту демонстрацию на не очень хорошо документированном варианте использования поиска полнотекстовых данных.

Elastic позволяет использовать необработанный запрос для поиска данных по полям. Для этого вы можете использовать правильную перегрузку метода поиска, настроив необработанный запрос:

Что взять домой

Elasticsearch - ведущее решение для поисковых систем. Он предоставляет приложениям широкие возможности, такие как полнотекстовый поиск или индексирование документов. Его можно использовать как услугу или локально. В любом случае его довольно просто настроить для базового использования.

Фреймворк NEST позволяет нам хранить и получать доступ к Elasticsearch, как к простой базе данных, через LINQ, и это делает все очень простым.

Для сложного сценария, когда вы хотите позволить конечным пользователям писать свои запросы, вы можете использовать необработанный запрос и сопоставить результаты с классами.

Ресурсы

Эта статья оказалась полезной? Подпишитесь на меня (Даниэле Фонтани) на Medium и ознакомьтесь с моими самыми популярными статьями ниже! Пожалуйста, поделитесь этой статьей!