2016-03-21 11 views
0

Как добавить массив строк в существующее поле массива строк в Elasticsearch с помощью скрипта?Добавлены уникальные значения из массива в массив в ElasticSearch

Результирующий массив строк в Elasticsearch должен содержать только уникальные строковые элементы.

Я знаю, как добавить значение в массив строк:

x = "test" 
client.update index:'test', type:'test', id:'1', body:{script:"if (!ctx._source.a.contains(x)) {ctx._source.a += x;}", params:{x: x}} 

мне нужен один и тот же код для массива строк

x = ["test1", "test2"] 

ответ

0

Вы можете просто объединить все элементы, а затем найти уникальные элементы, как ниже.

{ 
     script:"ctx._source.a += x; ctx._source.a = ctx._source.a.uniq;", 
     params:{x: x} 
    } 

uniq method удаляет все повторяющиеся элементы и сохраняет все уникальные элементы в массиве.

+0

Я попытался выполнить этот код. Ошибка: > {"script": "ctx._source.a + = x; ctx._source.a.uniq", "params": {"x": ["1", "2", "3", " «111», «222», «333»]}} <{"error": "ElasticsearchIllegalArgumentException [не удалось выполнить скрипт]; вложен: GroovyScriptExecutionException [MissingPropertyException [Исключение оценки свойства« uniq »для java.util.ArrayList, Причина : groovy.lang.MissingPropertyException: Нет такого свойства: uniq для класса: java.lang.String]]; "," status ": 400} –

+0

Поскольку языковой тег в вашем вопросе предлагает ruby, uniq является допустимым синтаксисом для ruby. В то время как ошибка показывает язык как groovy, что означает, что скрипт исполнялся как отличный скрипт, а не как ruby-код. Язык по умолчанию - отличный. Ваше решение по сути совпадает с моим ответом. – Rahul

1

Этот код решить проблему:

x = ['test1', 'test2'] 
client.update index:'test', type:'test', id:'1', body:{script:"ctx._source.a += x; ctx._source.a.unique()", params: {x:x}} 
+0

ctx._source.a.unique() работает отлично. –

Смежные вопросы