14 советов по снижению задержки поиска в Elasticsearch и оптимизации производительности поиска.
Параметр size
Присвоение параметру size огромного значения заставляет Elasticsearch вычислять огромное количество хитов, что приводит к серьезным проблемам с производительностью. Вместо того чтобы задавать огромный размер, следует выполнять пакетные запросы небольшого размера.
Осколки (шарды) и реплики
Оптимизируйте необходимые параметры индекса, которые играют решающую роль в производительности Elasticsearch, например, количество шардов и реплик. Во многих случаях увеличение числа реплик позволяет повысить производительность поиска.
Удаленные документы
Наличие большого количества удаленных документов в индексе Elasticsearch также приводит к проблемам с производительностью поиска, о чем говорится в этом официальном документе. Для удаления большого количества удаленных документов и оптимизации работы шардов можно использовать API Force merge.
Фильтры поиска
Эффективное использование фильтров в запросах Elasticsearch может значительно повысить производительность поиска, поскольку положения фильтра
- Кэшируются
- Позволяют уменьшить количество целевых документов для поиска в положении запроса.
Запросы с подстановочными знаками
Избегайте подстановочных знаков, особенно ведущих подстановочных знаков, которые приводят к сканированию всего индекса Elasticsearch.
Regex и parent-child
Обратите внимание, что Regex-запросы и parent-child могут вызывать задержки при поиске.
Реализация функций
Существует несколько способов реализации определенной функции в Elasticsearch. Например, автозаполнение может быть реализовано в различных стилях.
Множество мелких шардов
Наличие множества мелких шардов может привести к большому количеству сетевых вызовов и потоков, что сильно сказывается на производительности поиска.
Тяжелые агрегации
Избегайте тяжелых агрегаций, включающих уникальные идентификаторы.
Таймаут и завершение
Параметр timeout и terminate after param могут быть полезны при выполнении тяжелых поисковых запросов или при большом объеме данных о результатах. В этом может помочь данное официальное руководство.
Шаблоны поиска
Использование шаблонов поиска позволяет добиться лучшей абстракции, то есть не раскрывать синтаксис запроса пользователям. Шаблоны поиска также помогают передавать меньше данных по сети, что особенно полезно при больших запросах к Elasticsearch.
API мультипоиска
Используйте msearch всегда, когда это возможно. В большинстве приложений требуется запрашивать несколько индексов Elasticsearch для одной транзакции, а иногда пользователи делают это в последовательном порядке, даже когда это не требуется. В обоих случаях, когда необходимо запросить несколько индексов для одной транзакции и когда результаты этих запросов независимы, всегда следует использовать msearch для параллельного выполнения запросов в Elasticsearch.
Термические запросы
Термические запросы используются в тех случаях, когда необходимо точное совпадение и по ключевым словам. По умолчанию Elasticsearch генерирует текстовые поля и поля с ключевыми словами для каждого поля, состоящего из строкового значения, если не задано явное сопоставление. Пользователи склонны использовать запрос соответствия даже для таких типов данных с ключевыми словами, как product-ids, что связано с большими затратами, поскольку запрос соответствия проходит через операцию анализа. Ознакомьтесь с разницей между запросами Term и Match и всегда используйте запрос term для типов данных с ключевыми словами и везде, где требуется точный поиск, для повышения производительности.
Фильтрация по источнику
Фильтрация источника - это отличный способ повысить производительность запросов Elasticsearch при получении большого количества документов или документов большого размера. По умолчанию Elasticsearch возвращает полный источник соответствующих документов. Если вам не нужен _source вообще или нужны только значения определенных полей, вы можете добиться этого с помощью фильтрации _source.