2015-08-28 5 views
2

У меня есть массив строк в одно поле «strArray»:Возврат только один элемент из массива строк в elasticsearch

strArray: ['browser:IE', 'device:PC', 'country:USA', 'state:CA'] 

мне нужно сделать агрегирование браузером (устройства, страны или государства). Это не проблема, если я знаю порядок этих значений в поле strArray.

я мог бы использовать эти структуры:

"aggs": { 
    "deviceAggs": { 
    "terms": { 
     "script": "doc['strArray'][1]" 
    } 
    } 
} 

Но проблема в том, что порядок введения этих строк могут быть разными.

Как это сделать? Я думаю о нескольких способах:

  1. Scripting - использовать функцию как подстроку и получить только «правильные» значения.

  2. Фильтрация - возможно отфильтровать одно значение (которое содержит строку «устройство:») из массива.

  3. Сортировка значений strArray для размещения всех значений в определенном порядке, но «сортировка» дает мне странный результат - возвращает только один элемент (без фильтрации).

Не спрашивайте меня, почему у меня есть эта структура (это не мой выбор), если у нас есть структурный ключ: значение - у нас не было бы проблем.

+0

Я думаю о сортировке массива, чтобы получить предсказуемый порядок элементов. – Val

+0

@Val Я уже проверил это - «сортировать» - дайте мне странный результат. Обновленный вопрос – yAnTar

ответ

2

Сценарии возможны только здесь. Чтобы получить представление об использовании сценариев в агрегации, вы можете сослаться на этот blog.

Нечто подобное ниже, должны работать

for(element in doc['strArray'].values){ 
     if(element.startsWith('browser')){ 
      return element; 
     } 
}; 
return null; 

Оба сортировка и фильтрация выполняется на уровне документа, а не уровень элемента. На уровне элемента, если вы можете сделать этот массив вложенным, возможна фильтрация. Это необходимо, чтобы вы изменили структуру до -

strArray: [ 
    { "name" : 'browser:IE' } , 
    { "name" : 'device:PC' } 
] 

А затем сделайте поле strArray вложенным. В этом случае вы можете сделать вложенный фильтр на основе префиксного запроса (используя фильтр запросов), а затем сделать вложенную агрегацию данных.

+0

Большое спасибо. Работает скрипт. Вы спасли мне часы моей работы. Также вы можете исправить «возврат» к «возврату» и добавить точку с запятой перед возвратом null, потому что я использую этот скрипт в одной строке и без сценария с запятой не работает. Еще раз спасибо. – yAnTar

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