Ключевые аспекты работы и практические примеры использования Elasticsearch
25 апреля 2024

Ключевые аспекты работы и практические примеры использования Elasticsearch

Сходства и различия Elasticsearch и OpenSearch. Вы можете посмотреть полную видеозапись лекции внизу страницы.




Сергей Белозеров
Инженер-разработчик ПО
  • все проекты выполнены в плановые сроки, а результаты приняты Заказчиками;
  • корпоративная награда Logrocon. "Команда года - 2022";
  • повышение квалификации:
    обучение методологии разработки учётной системы ERP Ultima 2C и интеграции её с внешними системами.

Навыки

Разработка ПО:
  • Стек технологий .NET - C#, ASP .NET MVC, LINQ, Entity Framework, Dapper, .NET Core;
  • PHP (YII, Cake PHP);
  • 1С;
  • DI контейнеры – Autofac, MEF, Castle Windsor, .NET Core встроенный;
  • Стек технологий frontend – HTML, CSS, SAAS, Bootstrap, AngularJS, ReactJS, Redux, Javascript native, Webpack, NodeJS;
  • написание тестов: NUnit, xUnit;
  • навыки проектирования и реализации БД (SQL / T-SQL).
Опыт использования продуктов:
  • системыконтроля версий - Git, TFS, SVN;
  • среды разработки - MS Visual Studio, VS Code, PgAdmin, MS SQL Management studio, Oracle sql developer;
  • базыданных – PostgreSQL, MSSQL Server, Oracle, MySql, MongoDb, ElasticSearch, OpenSearch;
  • коммуникационные шины – RabbitMQ;
  • хранилища в памяти – Redis;
  • логирование – Nlog, Serilog, Loki + Grafana;
  • валидация - FluentValidation.
Развертывание: · Docker.
Задача

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

Поиск должен производиться по названию товаров и их категорий.
Источник – база данных, таблицы products и categories.


Поиск в БД с помощью LIKE

SELECT ... FROM ... WHERE [поле] ILIKE '%[поиск]%'
Нет лингвистической поддержки ('ложка' => 'ложки').
Отсутствие ранжирования (релевантность).
Медленные запросы (не имеют индексной поддержки).
Полный перебор значений.


Полнотекстовый поиск в БД

Документ — текстовый атрибут или их комбинация.
Разбиение парсером на слова (токены), выделение стеммы — основы слова.
Индексированный токен — лексема.
tsvector — тип для хранения лексем документа + вес (ранжирование).
tsquery — тип для запроса с поддержкой логических операций.
Полнотекстовый оператор @@ с индексной поддержкой GIN, GIST.


tsvector

to_tsvector (.) удаляет стоп-слова (предлоги и др.), которые не несут смысловой нагрузки и определяет позицию токена.

tsquery и websearch_to_tsquery

websearch_to_tsquery — нормализация запроса удаление стоп-слов, получение токенов.

Оператор @@
Минусы full-text-search в БД

Необходимо создавать дополнительное поле tsvector + индекс.
Операция to_tsvector (.) трудоёмкая.

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


Lucene.NET

Библиотека для полнотекстового поиска на основе Apache Lucene.

Индекс — хранилище документов, аналог базы данных.

Сохраняет оригинальный документ + строит обратный индекс, содержащий для каждого терма (лексемы) список документов где он встречается и порядок его использования (ранжирование).


Обратный индекс
Аналогия — указатель в конце книги.


Elasticsearch

https://www.elastic.co/downloads/elasticsearch
Shay Banon, Elastic NV, первый релиз — февраль 2010

Документо-ориентированная, распределённая NoSQL (не поддерживает классический ACID) база данных, предоставляющая JSON REST API.

Индекс Elasticsearch состоит из одного или более shard (осколок), каждый из которых является инстансом Apache Lucene, что позволяет поддерживать полнотекстовый поиск и обеспечивать масштабируемость.

Индекс Elasticsearch — логическое пространство.


Сравнение индекса с SQL БД
Field может быть вложенным объектом.
С 6-ой версии один индекс => один тип документа.


Шардирование (sharding)

Позволяет разбить индекс на части (shard) и работать с ними в кластере с помощью нескольких нод, что увеличивает производительность засчёт распараллеливания операций.


Ноды, шарды, реплики

При достижении размера шарда 50Гб производительность значительно падает, однако слишком большое кол-во шардов также является неоптимальным.

Для каждого шарда можно создать его копию — реплику и разместить её на другой ноде, что обеспечит надёжность хранения данных (primary shard, replica shard).

Нода (отдельный узел) — каждый запущенный экземпляр Elasticsearch.
Ноды могут находиться на одной машине имея разные порты.
Ноды делятся на data-node (hot, warm, cold) и coordinating-node.
Ноды одного кластера должны иметь одну версию и одно claster.name в конфигурации.


Создание индекса
Практические примеры, а также больше об Elasticsearch в записи лекции ниже.


Содержание:

00:00:00 — Вступление. Задача.
00:11:04 — Поиск в БД с помощью LIKE. Полнотекстовый поиск в БД
00:14:54 — tsvector. tsquery и websearch_to_tsquery
00:21:39 — Оператор @@. Минусы full-text-search в БД. Lucene.NET
00:26:12 — Обратный индекс
00:34:43 — Переходим к Elasticsearch. Основная идея. Сравнение индекса с SQL БД. Шардирование (sharding). Ноды, шарды, реплики
00:42:34 — Создание индекса. Практика
00:54:43 — Пример динамической типизации. Пример явной типизации. Механизмы анализа текста
01:00:15 — Char Filter. Tokenizer. Token filter. Analyze API
01:05:04 — Анализатор по умолчанию. Пользовательский анализатор
01:20:13 — Query DSL — язык поиска. Простые запросы. Составные запросы. Запросы к вложенным объектам
01:30:43 — Модификация _score, scripting
01:34:15 — Алиасы, минимизация downtime
01:37:02 — Улучшение производительности
01:42:44 — ELK-stack. Elasticsearch VS OpenSearch
Вам также может быть интересно