web-dev-qa-db-ja.com

集計をフィルターの結果に制限する

1つのフィールドに特定の値を持つ一連のドキュメントがある場合、2番目のフィールドに各値を持つドキュメントの数を知りたいです。

私は次のクエリを使用した用語集計でそれを試みました:

{
    "size": 0,
    "filter": {
        "term": {
            "field1": "value"
        }
    },
    "aggregations": {
        "field2" : {
            "terms" : { "field" : "field2" }
        }
    }
}

ただし、返されるカウントはwhole indexの2番目のフィールドの各値を持つドキュメントの数を示し、最初のフィールドに特定の値を持つドキュメントに限定されません。

何が悪いのですか?

19
user2463201

フィルターされたクエリを使用してみましたか?

{
    "query": {
        "filtered": {
           "query": {
                "match_all": {}
           },
           "filter": {
               "term": {
                  "field1": "value"
               }
           }
        }
    },
    "aggregations": {
        "field2": {
           "terms": { "field": "field2" }
        }
    }
}
27
Mihai Ionescu

ここに比較があります: https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html

つまり、トップレベルのフィルターはリンクのpost_filterのように機能します。フィルタリングしてから集計を計算するには、クエリを使用する必要があります。

クエリ内のスコアの計算が原因でパフォーマンスが低下することが懸念される場合は、基本的にフィルターラッパークエリである定数スコアクエリを調べることができます。

8
Mehmet K