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

标签 elasticsearch solr faceted-search elasticsearch-aggregation

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

有什么建议吗?

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

  1. 使用filter aggregationvalue_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"
                        }
                    }
                }
            }
    }
}
  • 使用Multi Search 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"},我更喜欢解决方案 1。

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

    最佳答案

    您可以使用 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 聚合也应该可以工作。

    关于elasticsearch - 通过 Elasticsearch 中的查询进行文档计数聚合(如 solr 中的facet.query),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38122885/

    相关文章:

    MySQL 和分面导航(按属性过滤)

    solr - SOLR 的分面查询浏览器

    java - 使用 Rest 客户端的 Elasticsearch 批量插入

    solr - 在 Solr5.5 中,使用现有的conf在本地主机中创建核心的最简单的命令行方法

    apache - Solr 拼写检查与模糊搜索

    elasticsearch - 是否可以从非存储的Lucene重构数据?

    ruby-on-rails - 如何使用Sunspot建立具有多对多关系的构面搜索?

    hadoop - 此存储桶的一部分可能包含部分数据 - kibana Issue

    java - 连续聚合elasticsearch java API

    elasticsearch - Elasticsearch:在特定字段上搜索时不进行分析