Как получить доступ к @metadata внутри поля выходного скрипта Elasticsearch - PullRequest
0 голосов
/ 22 мая 2018

Используя модуль выводаasticsearch, я установил doc_as_upsert на true для многих действий по обновлению.Я использую возможность @metadata для хранения полей, которые я не хочу загружать в ES.

Однако у меня возникают проблемы с доступом к полям внутри @metadata внутри функции сценария Elasticsearch.Приведенный ниже скрипт проверяет, что массив urls меньше 1,001, а также обеспечивает уникальность добавляемого URL-адреса для массива:

output {
   elasticsearch{
      hosts => "***************"
      user => "****"
      index => "****"
      password => "*********"
      document_type => "document"
      document_id => "%{[@metadata][domain]}"
      action => "update"
      script => 'if(ctx._source.urls.length < 1001){ boolean match = false; for (url in ctx._source.urls){if (url == params.event.get("[@metadata][url]")){match = true;}} if(match==false){ctx._source.urls.add(params.event.get("[@metadata][url]"));}}'
      doc_as_upsert => true
   }
}

Внутри ES значение URL добавляется просто как NULL.,Я просмотрел поле метаданных url внутри rubydebug, и оно наверняка добавляется.Я не могу ссылаться на метаданные напрямую %{[@metadata][domain]}, потому что я сталкиваюсь с ошибками компиляции сценариев для слишком большого количества сгенерированных сценариев.

Есть ли какой-либо способ доступа к полю metadata.url внутри функции сценария для выходного плагина эластичного поиска?

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2018

Вы не можете использовать @metadata поля с выходными плагинами, они не отправляются (что является целью метаданных).

Таким образом, вы можете добавить фильтр мутаций или фильтр ruby ​​для копирования полей метаданных в событиеданные:

ruby {
    code => 'event.get("[@metadata][rabbitmq_headers]").each {|k,v| event.set(k, v)}'
}
...