Я обновляю ElasticSearch с 1.2 до 2.2. Я успешно откопал некоторые критические изменения API. Я обнаружил, что отличные скрипты в script_score не работают. Я включил динамические сценарии, включив

script.inline=true
script.indexed=true

Я включил groovy-all 2.4.6. Я также добавил jna и усы, чтобы не видеть никаких исключений при запуске встроенного ElasticSearch.

Конфигурация моего встроенного сервера:

        ESLoggerFactory.setDefaultFactory(new Slf4jESLoggerFactory());
        Settings settings = Settings.builder()
                .put("node.name" ,getName())
                .put("path.home", "/tmp/elastic-search/home")
                .put("path.shared_data", /tmp/elastic-search")
                .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, "1")
                .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, "0")
                .put("action.auto_create_index", "0")
                .put("index.gateway.type", "none")
                .put("script.inline", true)
                .put("script.indexed", true)
                .put("action.destructive_requires_name", false)
                .build();

        node = nodeBuilder().clusterName(clusterName).settings(settings).node();

Затем я выполняю запрос, который содержит фрагмент в разделе function_score / functions, который выглядит так:

        "filter" : {
          "exists" : {
            "field" : "transactionCount"
          }
        },
        "script_score" : {
          "script" : {
            "inline" : "doc['transactionCount'].value/10.0"
          }
        }

Казнь бросает:

Caused by: org.elasticsearch.index.query.QueryParsingException: script_score the script could not be loaded
...
Caused by: java.lang.IllegalArgumentException: script_lang not supported [groovy]
    at  org.elasticsearch.script.ScriptService.getScriptEngineServiceForLang(ScriptService.java:211)

При отладке я увидел в ScriptModule, что механизм сценариев для Groovy отсутствует. Присутствуют только родные и усатые.

Любые чаевые приветствуются :)

3
Ondrej Burkert 23 Фев 2016 в 19:11

2 ответа

Лучший ответ

В ElasticSearch 2.2 механизмы сценариев были вынесены во внешний вид: теперь они представляют собой плагины, которые вы можете установить по запросу. Плагины обнаруживаются путем сканирования папки plugins.

Если вы используете встроенный узел, у вас есть два варианта:

  • Используйте эту папку плагинов и скопируйте в эту папку lang-groovy-2.2.0.jar.
  • Явно зарегистрируйте плагины Groovy при создании узла

В моем проекте я использую второй случай: ElasticSearch встроен в контейнер osgi, и я хотел обнаружить плагины с помощью классического сканирования пути к классам. Чтобы делать такие вещи, вы должны переопределить Node:

class ConfigurableNode extends Node {
  public ConfigurableNode(Settings settings, Collection<Class<? extends Plugin>> classpathPlugins) {
    super(InternalSettingsPreparer.prepareEnvironment(preparedSettings, null), 
      Version.CURRENT, 
      classpathPlugins);
  }
}

И вы создаете свой узел с помощью:

Node node = new ConfigurableNode(nodeBuilder()
  .clusterName(clusterName)
  .settings(settings)
  .getSettings(), 
    Arrays.asList(GroovyPlugin.class)); 

Это некрасиво, но я не нашел более элегантного метода в версии 2.2.

8
Jérémie B 23 Фев 2016 в 19:40

Добавьте следующие 3 записи в файл elasticsearch.yml. Это решит проблему.

index.max_result_window: 2147483647 
script.engine.groovy.inline.aggs: on 
script.engine.groovy.inline.search: on
0
mickl 10 Июл 2018 в 07:26