1

メインクエリがあり、いくつかのサブクエリの一致数が必要です。solr の言葉では、facet.queryが必要です。私が見逃しているのは、 value_count 集計doc_countのような単純な集計です。

助言がありますか?

私は好きではない2つの可能な解決策を見つけました:

  1. 上のvalue_countメトリックでフィルタ集計を使用します。_id

例:

GET _search
{
    "query": {
        "match_main": {}
    },
    "aggs": {
            "facetvalue1": {
                "filter": {
                     "bool": { 
                    "should": [
                      {"match": { "name": "fred" }},
                      {"term": { "lastname": "krueger" }}
                     ]
                     }
                },
                "aggs": {
                    "count": {
                        "value_count": {
                            "field": "_id"
                        }
                    }
                }
            },
            "facetvalue2": {
                "filter": {
                      "term": { "name": "freddy" }
                },
                "aggs": {
                    "count": {
                        "value_count": {
                            "field": "_id"
                        }
                    }
                }
            }
    }
}
  1. マルチ検索 APIを使用する

例:

GET _msearch
{"index":"myindex"}
{"query":{"match_main": {}}}
{"index":"myindex"}
{"size": 0, "query":{"match_main": {}}, "filter": {"bool": {"should":[{"match": { "name": "fred" }},{"term": { "lastname": "krueger" }}]}}}
{"index":"myindex"}
{"size": 0, "query":{"match_main": {}},"filter": {"term": { "name": "freddy" }}}

match_mainソリューション 2 の方が高速ですが、複雑なクエリを想像してみてください。doc_count:{}したがって、 の代わりにがある場合は、ソリューション 1 をお勧めしvalue_count:{"field":"_id"}ます。

しかし、基本的な質問に戻ります。elasticsearch の solrfacet.queryに対応するものは何ですか?

4

1 に答える 1

3

これには afilters aggregationを使用できます。追加の に注意してください。これは、既に述べた集計sとは異なります。filter

{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "values": {
      "filters": {
        "filters": {
          "value1": {
            "bool": {
              "should": [
                {
                  "match": {
                    "name": "fred"
                  }
                },
                {
                  "term": {
                    "lastname": "krueger"
                  }
                }
              ]
            }
          },
          "value2": {
            "term": {
              "name": "freddy"
            }
          }
        }
      }
    }
  }
}

これは次のようなものを返します

"aggregations": {
  "values": {
    "buckets": {
      "value1": {
        "doc_count": 4
      },
      "value2": {
        "doc_count": 1
      }
    }
  }
}

編集: 一般的な注意として、バケット集計でメトリック集計を使用する必要はありません。サブ集計を指定しない場合は、ドキュメント数のみが取得されます。この場合、filtersバケットが提供されますが、複数のfilter集計も同様に機能するはずです。

于 2016-06-30T12:33:22.673 に答える