通过Elasticsearch中的查询进行文档计数聚合(如solr中的facet.query)

时间:2016-06-30 12:18:15

标签: elasticsearch solr faceted-search elasticsearch-aggregation

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

有什么建议吗?

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

  1. _id上使用filter aggregation指标{/ 3}}
  2. 示例:

    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. 使用value_count
    2. 示例:

      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"},我宁愿选择解决方案1。

      但回到我的基本问题:弹性搜索中solr facet.query的对应部分是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用filters 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聚合也应该有效。