2015-01-23 4 views
2

Я создал карту для индексации моей коллекции mongoDb с использованием эластичного поиска. Вот это mapping свойства:Эластичный поиск - отличительные элементы из нескольких полей

"properties" : { 
      "address_components" : { 
      "properties" : { 
       "_id" : { 
       "type" : "string" 
       }, 
       "subLocality1" : { 
       "type" : "string", 
       "index" : "not_analyzed" 
       }, 
       "subLocality2" : { 
       "type" : "string", 
       "index" : "not_analyzed" 
       }, 
       "subLocality3" : { 
       "type" : "string", 
       "index" : "not_analyzed" 
       }, 
      "city" : { 
       "type" : "string", 
       "index" : "not_analyzed" 
       } 
      } 

Теперь я хочу, чтобы получить общие уникальные элементы из этих полей: subLocality1, subLocality2, subLocality3, city. Кроме того, каждое из значений distinct должно содержать q в качестве подстроки. Отдельный элемент должен также содержать соответствующее значение city.

Пример:

"address_components" : { 
    "subLocality1" : "s1" 
    "subLocality2" : "s1", 
    "subLocality3" : "s2", 
    "city":"a" 
    } 

"address_components" : { 
    "subLocality1" : "s3" 
    "subLocality2" : "s1", 
    "subLocality3" : "s2", 
    "city":"a" 
    } 

"address_components" : { 
    "subLocality1" : "s2" 
    "subLocality2" : "s1", 
    "subLocality3" : "s4", 
    "city":"a" 
    } 

Для получения указанного выше показателей, ожидаемого результата:

"address_components" : { 
    "subLocality1" : "s1" 
    "subLocality2" : "s1", 
    "subLocality3" : "s2", 
    "city":"ct1" 
    } 

"address_components" : { 
    "subLocality1" : "s3" 
    "subLocality2" : "s1", 
    "subLocality3" : "s2", 
    "city":"ct1" 
    } 

"address_components" : { 
    "subLocality1" : "s2" 
    "subLocality2" : "s1", 
    "subLocality3" : "s4", 
    "city":"ct1" 
    } 
{s1, a}, {s2,a}, {s3,a}, {s4,a},{a,a} 

Я пытался сделать это с помощью эластичного Поиска terms агрегации.

GET /rescu/rescu/_search?pretty=true&search_type=count 

{ 
    "aggs" : { 
     "distinct_locations" : { 
      "terms" : { 
       "script" : "doc['address_components.subLocality1'].value" 
      } 
     } 
    } 
} 

Но terms агрегирование применяется только для одного поля в соответствии со следующими link.

ответ

0

Я сам нашел ответ, пройдя через эластичный поиск api docs. Нам нужно использовать скрипт для извлечения терминов из нескольких полей. ?

GET/rescu/rescu/_search довольно = верно & search_type = кол

{ 
    "aggs": { 
    "distinct_locations": { 
     "terms": { 
     "script": "[doc['address_components.subLocality1'].value,doc['address_components.subLocality2'].value,doc['address_components.subLocality3'].value]", 
     "size": 5000 
     } 
    } 
    } 
} 
0

Вот пример с двумя полями: Страна, город. Он использует агрегирование по странам и суб-агрегирование по городу:

{ 
    "size": 0, 
    "aggs": { 
    "country": { 
     "terms": { 
     "field": "country" 
     }, 
     "aggregations": { 
     "city": { 
      "terms": { 
      "field": "city" 
      } 
     } 
     } 
    } 
    } 
} 

Вы можете использовать много слоев суб-агрегатах.

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