Скрипты, кэширование и скорость поиска
Elasticsearch выполняет ряд оптимизаций, чтобы использование скриптов было максимально быстрым. Одна из важных оптимизаций — кэш скриптов. Скомпилированный скрипт помещается в кэш, так что запросы, ссылающиеся на этот скрипт, не несут накладных расходов на компиляцию.
Размер кэша важен. Кэш скриптов должен быть достаточно большим, чтобы содержать все скрипты, к которым пользователи могут обращаться одновременно.
Если вы видите большое количество удалений из кэша скриптов и растущее количество компиляций в статистике узлов, ваш кэш, возможно, слишком мал.
Все скрипты кэшируются по умолчанию, так что их нужно перекомпилировать только при обновлениях. По умолчанию у скриптов нет временного ограничения срока действия. Вы можете изменить это поведение, используя параметр script.cache.expire. Используйте параметр script.cache.max_size для настройки размера кэша.
Размер скриптов ограничен 65 535 байтами. Установите значение параметра script.max_size_in_bytes, чтобы увеличить этот мягкий лимит. Если ваши скрипты действительно большие, рассмотрите использование нативного движка скриптов.
Улучшение скорости поиска
Скрипты невероятно полезны, но они не могут использовать структуры индексов Elasticsearch или связанные с ними оптимизации. Эта взаимосвязь иногда приводит к замедлению скорости поиска.
Если вы часто используете скрипты для преобразования индексированных данных, вы можете ускорить поиск, преобразовав данные во время загрузки вместо этого. Однако это часто означает замедление скорости индексации. Давайте рассмотрим практический пример, чтобы проиллюстрировать, как можно увеличить скорость поиска.
При выполнении запросов часто сортируют результаты по сумме двух значений. Например, рассмотрим индекс под названием my_test_scores, содержащий данные о результатах тестов. В этом индексе есть два поля типа long:
-
math_score -
verbal_score
Вы можете выполнить запрос со скриптом, который складывает эти значения. В этом подходе нет ничего плохого, но запрос будет медленнее, потому что вычисление скрипта выполняется в рамках запроса. Следующий запрос возвращает документы, где grad_year равно 2099, и сортирует результаты по результатам вычисления скрипта.
GET /my_test_scores/_search
{
"query": {
"term": {
"grad_year": "2099"
}
},
"sort": [
{
"_script": {
"type": "number",
"script": {
"source": "doc['math_score'].value + doc['verbal_score'].value"
},
"order": "desc"
}
}
]
} Если вы ищете в небольшом индексе, то включение скрипта в запрос поиска может быть хорошим решением. Если вы хотите ускорить поиск, вы можете выполнить это вычисление во время загрузки и индексировать сумму в отдельное поле вместо этого.
Сначала мы добавим новое поле в индекс под названием total_score, которое будет содержать сумму значений полей math_score и verbal_score.
PUT /my_test_scores/_mapping
{
"properties": {
"total_score": {
"type": "long"
}
}
} Далее, используйте плагин обработки данных содержащий обработчик скриптов, чтобы вычислить сумму math_score и verbal_score и индексировать её в поле total_score.
PUT _ingest/pipeline/my_test_scores_pipeline
{
"description": "Calculates the total test score",
"processors": [
{
"script": {
"source": "ctx.total_score = (ctx.math_score + ctx.verbal_score)"
}
}
]
} Для обновления существующих данных используйте этот плагин для переиндексации любых документов из my_test_scores в новый индекс под названием my_test_scores_2.
POST /_reindex
{
"source": {
"index": "my_test_scores"
},
"dest": {
"index": "my_test_scores_2",
"pipeline": "my_test_scores_pipeline"
}
} Продолжайте использовать этот плагин для индексации любых новых документов в my_test_scores_2.
POST /my_test_scores_2/_doc/?pipeline=my_test_scores_pipeline
{
"student": "kimchy",
"grad_year": "2099",
"math_score": 1200,
"verbal_score": 800
} Эти изменения замедляют процесс индексации, но позволяют ускорить поиск. Вместо использования скрипта вы можете сортировать поиски, выполненные на my_test_scores_2, используя поле total_score. Ответ практически в реальном времени! Хотя этот процесс замедляет время загрузки, он значительно увеличивает скорость выполнения запросов при поиске.
GET /my_test_scores_2/_search
{
"query": {
"term": {
"grad_year": "2099"
}
},
"sort": [
{
"total_score": {
"order": "desc"
}
}
]
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/scripts-and-search-speed.html