【问题标题】:Elasticsearch aggregation. Order by nested bucket doc_count弹性搜索聚合。按嵌套桶 doc_count 排序
【发布时间】:2015-12-30 18:07:19
【问题描述】:

我想要实现的是通过唯一对(城市、州)进行聚合。根据 Elasticsearch 文档术语聚合不支持从同一文档中的多个字段收集术语。因此,我创建了一个这样的嵌套 agg:

{
  "size": 0,
  "aggs": {
    "cities": {
      "terms": {
        "field": "address.city",
        "size": 12
      },
      "aggs": {
        "states": {
          "terms": {
            "field": "address.stateOrProvince"
          },
          "aggs": {
            "topCity": {
              "top_hits": {
                "size": 1,
                "sort": [
                  {
                    "price.value": {
                      "order": "desc" }}]}}}}}}}}

由于这种聚合,我得到如下响应:

{
  "aggregations": {
    "cities": {
      "buckets": [
        {
          "key": "las vegas",
          "doc_count": 5927,
          "states": {
            "buckets": [
              { "key": "nv", "doc_count": 5840 },
              { "key": "nm", "doc_count": 85 }
            ]
          }
        },
        {
          "key": "jacksonville",
          "doc_count": 5689,
          "states": {
            "buckets": [
              { "key": "fl", "doc_count": 2986 },
              { "key": "nc", "doc_count": 1962 },
              { "key": "ar", "doc_count": 290 }]}}]}}}

问题是如何得到最深的doc_count排序的结果?

预期的有序列表应该是这样的:

  1. 内华达州拉斯维加斯 (5840)
  2. 佛罗里达州杰克逊维尔 (2986)
  3. 杰克逊维尔,北卡罗来纳 (1962)
  4. 杰克逊维尔,阿尔 (290)
  5. 拉斯维加斯,纳米 (85)

【问题讨论】:

  • 根据你有two options的文件他们不可行吗?
  • @keety 我首先尝试了第二个选项,这是不可接受的,因为我需要一个 stored not_analyzed 字段。现在我正在尝试实现第一个选项,但得到“null,null”会导致聚合。似乎脚本没有连接这些值。

标签: elasticsearch aggregation elasticsearch-net


【解决方案1】:

我不相信有一种方法可以跨多个存储桶对内部 doc_count 进行排序。在 ES 2.0(仍处于 Beta 版)中,您将能够对聚合执行操作,但在 ES 1.x 中这是不可能的

【讨论】:

  • 似乎唯一的解决方案是创建一个将两者结合的字段:城市和州我正在使用转换来实现这一点,但由于某种原因,我在聚合结果中得到“null,null”。 "转换": { "脚本": "ctx._source['address.city_state'] = ctx._source['address.city'] + ', ' + ctx._source['address.state']" }跨度>
  • 您也许可以让类似的东西发挥作用,但请注意可能对生产环境中的大型数据集产生的潜在性能影响。
【解决方案2】:

我已经通过申请transform解决了这个问题

"transform": {
  "script": "ctx._source['address']['cityState'] = ctx._source['address']['city'] + ', ' + ctx._source['address']['state']"
}

然后在新添加的字段上进行聚合。按预期工作!

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 2020-02-21
    • 1970-01-01
    • 2020-10-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多