1

Elasticsearch インデックス内の各ドキュメントが、タイトルとタグの 2 つのフィールドのみで構成されるブログ投稿であるとします。タイトルフィールドは単なる文字列ですが、タグは複数値フィールドです。

次のような 3 つのドキュメントがあるとします。

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

考えられるすべてのタグの一意の値でバケット化したいのですが、バケットに 3 つのアイテムを含む以下のような結果を得るにはどうすればよいですか。または、効率的な代替手段はありますか?

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

誰かがelasticsearch python APIで答えを提供できればいいですね。

4

1 に答える 1

2

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, ...
于 2016-01-05T19:24:51.683 に答える