1

我有一个主查询,我需要几个子查询的匹配数。用solr的话来说,我需要一个facet.query。我缺少的是一个简单的doc_count聚合,比如value_count 聚合

有什么建议么?

我发现了两种我不喜欢的可能解决方案:

  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" }}}

我看到解决方案 2 更快,但可以想象match_main为复杂的查询!因此,如果有一个doc_count:{}而不是value_count:{"field":"_id"}.

但回到我的基本问题:elasticsearch 中的 solr 对应物是什么facet.query

4

1 回答 1

3

您可以filters aggregation为此使用 a 。请注意额外的,这与您已经提到的聚合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 回答