Как выполнить агрегацию ведра в поле с несколькими значениями в elasticsearch

Скажем, каждый документ в моем индексе elasticsearch представляет собой запись в блоге, состоящую всего из двух полей: заголовка и тегов. Поле title — это просто строка, а tags — поле с несколькими значениями.

Если у меня есть три таких документа:

title      tags
"blog1"    [A,B,C]
"blog2"    [A,B]
"blog3"    [B,C]

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

{A: ["blog1", "blog2"]}
{B: ["blog1", "blog2", "blog3"]}
{C: ["blog1", "blog3"]}

Было бы неплохо, если бы кто-нибудь мог дать ответ в API python elasticsearch.


person Community    schedule 05.01.2016    source источник


Ответы (1)


Вы можете просто использовать агрегацию terms в поле tags и другую вложенную агрегацию top_hits. Со следующим запросом вы получите ожидаемые результаты.

{
    "size": 0,
    "aggs": {
        "tags": {
            "terms": { 
                "field": "tags" 
            },
            "aggs": {
                "top_titles": {
                    "top_hits": {
                        "_source": ["title"]
                    }
                }
            }
        }
    }
}

Использовать это с Python просто:

from elasticsearch import Elasticsearch
client = Elasticsearch()

response = client.search(
    index="my-index",
    body= {
    "size": 0,
    "aggs": {
        "tags": {
            "terms": { 
                "field": "tags" 
            },
            "aggs": {
                "top_titles": {
                    "top_hits": {
                        "_source": ["title"]
                    }
                }
            }
        }
    }
}
)

# parse the tags
for tag in response['aggregations']['tags']['buckets']:
    tag = tag['key'] # => A, B, C
    # parse the titles for the tag
    for hit in tag['top_titles']['hits']['hits']:
       title = hit['_source']['title'] # => blog1, blog2, ...
person Val    schedule 05.01.2016