当前位置: 首页 > 知识库问答 >
问题:

在ElasticSearch中基于doc_count订购桶

雷逸仙
2023-03-14

我是ElasticSearch的新手,我目前正在尝试编写一个涉及聚合的ElasticSearch查询,它将为我获取涉及某些字段的前5个桶(查询中涉及的字段数量是动态的,它可以在2个字段和5个字段之间的任何位置)。

我面临的问题是,团队当前的ElasticSearch版本不支持多术语,因此我恢复了复合聚合,将top_hits作为子聚合器,这样我就可以获得前5个桶。然而,我没有根据doc_count/命中以排序顺序获得结果。

请求:

{
  "query":{
    "bool":{
      "must":[{
          "exists":{"field":"uuid"}
        },{
          "query_string":{
            "query":"*","lowercase_expanded_terms":false
          }
        }]
    }
  },
  "aggs":{
    "test_aggregation":{
      "composite":{
        "sources":[{
          "zipCode":{"terms":{"field":"zipCode"}},
          "routeCode":{"terms":{"field":"routeCode"}}
        }]
      }
    },
    "aggs":{
      "test_aggregation_hits":{
        "top_hits":{
          "size":5,
          "_source":{
            "includes":["uuid"]
          }
        }
      }
    }
  },
  "size":"0"
}

回应:

{
    "took": 310,
    "timed_out": false,
    "num_reduce_phases": 2,
    "_shards": {
        "total": 140,
        "successful": 140,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 8400,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "test_aggregation": {
            "after_key": {
                "zipCode": "someRandomZipCode",
                "routeCode": "someRandomRouteCode"
            },
            "buckets": [{
                "key": {
                    "zipCode": "someRandomValue-1",
                    "routeCode": "someRandomRouteCode-1"
                },
                "doc_count": 36,
                "test_aggregation_hits": {
                    "hits": {
                        "total": 36,
                        "max_score": 11.5650015,
                        "hits": [{
                          .... // some data
                        }]
                    }
                 }
            }, {
                "key": {
                    "zipCode": "someRandomValue-2",
                    "routeCode": "someRandomRouteCode-2"
                },
                "doc_count": 40,
                "test_aggregation_hits": {
                    "hits": {
                        "total": 40,
                        "max_score": 11.5658015,
                        "hits": [{
                          .... // some data
                        }]
                    }
                 }
            }, {
                "key": {
                    "zipCode": "someRandomValue-3",
                    "routeCode": "someRandomRouteCode-3"
                },
                "doc_count": 13,
                "test_aggregation_hits": {
                    "hits": {
                        "total": 13,
                        "max_score": 11.5750015,
                        "hits": [{
                          .... // some data
                        }]
                    }
                 }
            }
            ....  
            ....
          ]
        }
      }
}
    < li >我想知道我采取的方法是否正确? < li >如果方法不正确,我应该如何着手解决这个问题? < li >如果方法是正确的,那么我做错了什么?我如何根据doc_count对存储桶进行排序?

共有1个答案

仲孙夕
2023-03-14

能够通过使用存储桶排序弹性搜索聚合来解决此问题。

最终查询看起来像这样。

{
  "query":{
    "bool":{
      "must":[{
          "exists":{"field":"uuid"}
        },{
          "query_string":{
            "query":"*","lowercase_expanded_terms":false
          }
        }]
    }
  },
  "aggs":{
    "test_aggregation":{
      "composite":{
        "sources":[{
          "zipCode":{"terms":{"field":"zipCode"}},
          "routeCode":{"terms":{"field":"routeCode"}}
        }],
        "size":"100"
      }
    },
    "aggs":{
      "test_aggregation_hits":{
        "top_hits":{
          "size":"25",
          "_source":{
            "includes":["uuid"]
          }
        }
      },
      "sort_buckets": {
         "size":"10",
         "sort": [
            {"_count": { "order": "desc" } }
         ]
      }
    }
  },
  "size":"0"
}
 类似资料:
  • 我编写了一些aggs查询来获取总计(sum)和唯一计数。但结果有点混乱。 唯一值大于doc_count。 可能吗? 我知道基数aggs是实验性的,可以得到不同值的近似计数 http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggr

  • 我正在使用ElasticSearch 6.3,我正在处理一个包含多个子聚合的聚合,其中我需要根据较低级别reverse_nested聚合的doc_count来排序顶级聚合桶。 我的索引是这样创建的: 这些是我索引的示例文档: 我需要我的聚合能够提取包含每个子项id/名称对的文档数。(考虑子项ID始终对应于相同的子项名称)。即: 这是原始聚合查询: 聚合似乎返回了我需要的所有数据: 但是,存储桶是根

  • 我正在使用Elasticsearch bucket聚合。我有一组文档,每个文档都有一个类别字段,它是一个数组。我需要获得每个类别的数量以及搜索结果。但目前,我得到了错误的doc\u计数。 这是我的聚合查询 } 下面是我得到的错误doc\u计数的结果。

  • 问题内容: 我目前有使用PIVOT生成如下表的查询: 我想做的是,但看起来像是拉伸,结果是值递减。 这是查询: 这样做会产生错误,因此可以指定列吗? 问题答案: 试试这个:

  • 现在使用了Pypy首创的“紧凑”表示形式。与Python3.5相比,新的dict()的内存使用量减少了20%到25%。PEP 468(保留函数中**kwargs的顺序。)是通过这个来实现的。这个新实现的保序方面被认为是一个实现细节,不应该被依赖(这在将来可能会改变,但是在更改语言规范以强制所有当前和将来的Python实现的保序语义之前,希望在几个版本中使用这个新的dict实现;这也有助于保持与仍然

  • 问题内容: 我有一个与数据库对话的servlet,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有 从日志中,我可以看到数据库以正确的顺序返回了User对象。 在前端,我有 但是顺序改变了。 我只在返回的列表很大(超过130个用户)时才注意到这一点。 我尝试使用Firebug进行调试,Firebug中的“响应选项卡”显示列表的顺序与servlet中的日志不同。 我做错了什么吗?