【问题标题】:Elasticsearch aggregation doesn't work with nested-type fieldsElasticsearch 聚合不适用于嵌套类型的字段
【发布时间】:2017-02-19 00:04:25
【问题描述】:

我无法使弹性搜索聚合+过滤器与嵌套字段一起使用。数据架构(相关部分)是这样的:

"mappings": {
  "rb": {
    "properties": {
      "project": {
        "type": "nested",
        "properties": {
          "age": {
            "type": "long"
          },
          "name": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }    
    }
  }
}

本质上,“rb”对象包含一个名为“project”的嵌套字段,其中包含另外两个字段——“name”和“age”。我正在运行的查询:

"aggs": {
  "root": {
    "aggs": {
      "group": {
        "aggs": {
          "filtered": {
            "aggs": {
              "order": {
                "percentiles": {
                  "field": "project.age",
                  "percents": ["50"]
                }
              }
            },
            "filter": {
              "range": {
                "last_updated": {
                  "gte": "2015-01-01",
                  "lt": "2015-07-01"
                }
              }
            }
          }
        },
        "terms": {
          "field": "project.name",
          "min_doc_count": 5,
          "order": {
            "filtered>order.50": "asc"
          },
          "shard_size": 10,
          "size": 10
        }
      }
    },
    "nested": {
      "path": "project"
    }
  }
}

该查询应该生成与日期过滤器匹配的前 10 个项目(project.name 字段),按其年龄中位数排序,忽略数据库中提及次数少于 5 的项目。仅应为匹配过滤器(日期范围)的项目计算中位数。

尽管数据库中有超过十万个对象,但此查询会生成空列表。没有错误,只是空响应。我在 ES 1.6 和 ES 2.0-beta 上都试过了。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我已经稍微重新组织了您的聚合查询,并且可以显示一些结果。要点是类型,因为您正在围绕 nested 类型进行聚合,所以我取出了 last_updated 字段上的 filter 聚合并将其向上移动作为第一个聚合。然后是 project 字段上的 nested 聚合,最后是 termspercentile

    这似乎效果很好。请尝试。

    {
      "size": 0,
      "aggs": {
        "filtered": {
          "filter": {
            "range": {
              "last_updated": {
                "gte": "2015-01-01",
                "lt": "2015-07-01"
              }
            }
          },
          "aggs": {
            "root": {
              "nested": {
                "path": "project"
              },
              "aggs": {
                "group": {
                  "terms": {
                    "field": "project.name",
                    "min_doc_count": 5,
                    "shard_size": 10,
                    "order": {
                      "order.50": "asc"
                    },
                    "size": 10
                  },
                  "aggs": {
                    "order": {
                      "percentiles": {
                        "field": "project.age",
                        "percents": [
                          "50"
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 有效!我只需将 shard_size 增加到 100 就可以实际获得 10 个值。您介意解释为什么我的原始变体不起作用吗?不支持嵌套字段内的过滤器是 ES 的限制吗?
    • nested 聚合中,您只能引用嵌套字段。此外,更有意义的是先根据last_updated过滤掉数据,然后再对嵌套数据进行操作。
    • @Val - 你能告诉我如何为多值存储桶做到这一点吗?单独的问题 - stackoverflow.com/questions/43451667/…
    猜你喜欢
    • 2015-07-30
    • 2023-04-03
    • 1970-01-01
    • 2018-05-21
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    相关资源
    最近更新 更多