Скрипты Elasticsearch - это универсальная функция, которая позволяет пользователям выполнять пользовательские сценарии для различных целей, таких как манипулирование данными, фильтрация и подсчет баллов. Сценарии могут быть написаны на разных языках, включая Painless, который является языком сценариев Elasticsearch по умолчанию. В этой статье мы расскажем о расширенном использовании и лучших практиках написания сценариев Elasticsearch, приведем примеры и пошаговые инструкции для конкретных случаев использования.
Встроенные и хранимые скрипты
Elasticsearch поддерживает два типа скриптов: встроенные и хранимые. Встроенные скрипты определяются в API-запросе, а хранимые скрипты сохраняются в состоянии кластера и могут быть использованы повторно при нескольких запросах.
Встроенные скрипты полезны для быстрого выполнения одноразовых операций, но они могут быть менее эффективны при многократном использовании. С другой стороны, хранимые сценарии более эффективны для многократного использования, поскольку они компилируются только один раз и кэшируются для последующих исполнений. Чтобы создать хранимый сценарий, используйте следующий API-запрос:
1 2 3 4 5 6 7 | PUT _scripts/my_stored_script { "script": { "lang": "painless", "source": "params.my_field * params.my_factor" } } |
Чтобы использовать хранимый сценарий в запросе, обратитесь к нему по его идентификатору:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | GET my_index/_search { "query": { "script_score": { "query": { "match_all": {} }, "script": { "id": "my_stored_script", "params": { "my_field": "field_name", "my_factor": 2 } } } } } |
Контексты сценариев
Elasticsearch предоставляет различные контексты сценариев в зависимости от выполняемой операции. Некоторые общие контексты включают:
- Контекст Filter : Используется в предложениях запроса для фильтрации документов.
- Контекст Score: Используется в запросах script_score для изменения оценки релевантности документов.
- Контекст Ingest: Используется в конвейерах ввода для манипулирования входящими документами.
Понимание контекста, в котором выполняется сценарий, очень важно для написания эффективных и действенных сценариев.
Доступ к полям документов
В сценариях Elasticsearch вы можете получить доступ к полям документа с помощью объекта doc. Например, чтобы получить доступ к полю price, используйте doc['price'].value. Обратите внимание, что такой способ доступа к полям более эффективен, чем использование объекта _source, поскольку позволяет избежать загрузки всего источника документа.
Избегайте компиляции сценариев
Частая компиляция сценариев может негативно сказаться на производительности Elasticsearch. Чтобы свести компиляцию к минимуму, используйте следующие передовые методы:
- Используйте хранимые сценарии вместо встроенных сценариев для повторяющихся операций.
- Используйте параметры вместо жесткого кодирования значений в сценариях.
- Кэшируйте результаты сценариев с помощью параметра cache в запросе.
Обработка ошибок и отладка
Elasticsearch предоставляет подробные сообщения об ошибках, когда скрипт не может скомпилироваться или выполниться. Для отладки сценария можно использовать API _scripts/painless/_execute, чтобы протестировать сценарий, не затрагивая кластер:
1 2 3 4 5 6 7 8 9 10 | POST _scripts/painless/_execute { "script": { "source": "params.field1 + params.field2", "params": { "field1": 1, "field2": 2 } } } |
Заключение
Сценарии Elasticsearch - это мощная функция, позволяющая пользователям выполнять пользовательские операции с данными. Понимая такие продвинутые концепции, как контекст сценария, доступ к полям и обработка ошибок, вы сможете писать эффективные и действенные сценарии для расширения возможностей Elasticsearch. Не забывайте следовать лучшим практикам, таким как использование хранимых сценариев и минимизация компиляций, для обеспечения оптимальной производительности.