2015-01-06 3 views
6

Я пытаюсь выполнить агрегацию по значениям в массиве, а также фильтровать ведра, возвращаемые префиксом. Не уверен, что это возможно, или я неправильно использую ковш фильтра.ElasticSearch Фильтрация агрегаций из поля массива

3 документы:

{ "colors":["red","black","blue"] } 
{ "colors":["red","black"] } 
{ "colors":["red"] } 

Цель состоит в том, чтобы получить количество документов, которые имеют цвет, начиная с буквы B:

{ 
    "size":0, 
    "aggs" : { 
    "colors" : { 
     "filter" : { "prefix" : { "colors" : "b" } }, 
     "aggs" : { 
     "top-colors" : { "terms" : { "field":"colors" } } 
     } 
    } 
    } 
} 

Результаты, которые возвращаются включают в себя красный, к сожалению. Очевидно, потому что документы с красным по-прежнему соответствуют фильтру, потому что они также имеют синий и/или черный цвет.

"aggregations": { 
"colors": { 
    "doc_count": 2, 
    "top-colors": { 
    "buckets": [ 
     { 
     "key": "black", 
     "doc_count": 2 
     }, 
     { 
     "key": "red", 
     "doc_count": 2 
     }, 
     { 
     "key": "blue", 
     "doc_count": 1 
     } 
    ] 
    } 
} 
} 

Есть ли способ фильтровать только результаты в виде ковша?

ответ

7

Попробуйте это, он будет фильтровать значения от ведра сами создаются для:

{ 
    "size": 0, 
    "aggs": { 
    "colors": { 
     "filter": { 
     "prefix": { 
      "colors": "b" 
     } 
     }, 
     "aggs": { 
     "top-colors": { 
      "terms": { 
      "field": "colors", 
      "include": { 
       "pattern": "b.*" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Woops, не знаю, как я пропустил, что в документации, спасибо! – scott

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