Скрипты (Scripting)

Рано или поздно вы придёте к тому что захочется использовать что-то специфическое чего нет в стандартных processors которые предоставляет Elasticsearch. Для этого Elasticsearch предоставляет возможность написания своих собственных скриптов, которые вы потом можете вызывать, используя script processor, который использует Painless programming language .

Painless programming language

Painless - это язык сценариев (Scripting), разработанный специально для использования в Elasticsearch. Он довольно быстр и безопасен. Этот язык имеет синтаксис, подобный Groovy, и поддерживает все типы данных Java с подмножеством Java API.

Для просмотра какие методы и классы вы можете использовать в Painless пройдите по ссылке.

Использование Painless

Для начала нужно создать наш скрипт, который вы сможете использовать после в processors. Выполнятся этот скрипт будет в pipeline.

Для примера напишем скрипт, который поменяет значение поля category.

  • Создаём документ
    PUT my-index-01/_doc/1
    {
    "title":"Introducing beta releases: Elasticsearch and My-App!",
    "category": "Lite"
    }
    
  • Создаём новый pipeline со скриптом
    PUT _ingest/pipeline/change_category
    {
      "processors": [
     {
       "script": {
         "source": "ctx['category'] = 'Blog'"
       }
     }
      ]
    }
    
  • Делаем переиндексацию и проверяем документ в новом index
    POST _reindex
    {
    "source":{
       "index": ["my-index-01"]
    },
    "dest":{
       "index":"my-index-02",
       "pipeline": "change_category", 
       "op_type":"create"
    }
    }
    GET my-index-02/_search
    

Вы также можете использовать скрипт в переиндексации, не создавая его заранее. Просто прописываете его внутри _reindex.

POST _reindex
{
   "source":{
      "index": "my-index-01"
   },
   "dest":{
      "index":"my-index-02"
   },
   "script": {
      "source": "ctx['category'] = 'Blog'"
   }
}

Кэширование скриптов

Все скрипты хранятся в cache. Как только Elasticsearch понимает, что скрипт создан он компилирует его и кладёт в cache.

По умолчанию в cache хранится ограниченное количество таких скриптов, значение по умолчанию - 100 скриптов. Вы можете менять это количество используя script.cache.max_size.

Также вы можете установить время жизни скрипта в cache используя параметр script.cache.expire.

По умолчанию Elasticsearch не даст скомпилировать больше 75 скриптов за промежуток времени в 5 минут. Вы также можете исправить это используя script.max_compilations_rate.

В итоге

  • Painless это язык сценариев, разработанный специально для использования в Elasticsearch
  • Скрипты могут быть встроенными (пример переиндексации) или храниться в кластере
  • Когда Elasticsearch впервые видит новый скрипт, он компилирует его и сохраняет скомпилированную версию в cache.