【问题标题】:How to use filter in nested aggregation?如何在嵌套聚合中使用过滤器?
【发布时间】:2019-07-18 18:02:32
【问题描述】:

如何从嵌套对象中过滤多个字段以进行弹性搜索?

现在我只能为 elasticsearch 嵌套对象做一个字段过滤器。

发布 /blog/blog/1

{
  "title": "Invest Money",
  "body": "Please start investing money as soon...",
  "tags": ["money", "invest"],
  "published_on": "18 Oct 2017",
  "comments": [
    {
      "name": "William",
      "age": 34,
      "rating": 8,
      "comment": "Nice article..",
      "commented_on": "30 Nov 2017"
    },
    {
      "name": "John",
      "age": 38,
      "rating": 9,
      "comment": "I started investing after reading this.",
      "commented_on": "25 Nov 2017"
    },
    {
      "name": "Smith",
      "age": 33,
      "rating": 7,
      "comment": "Very good post",
      "commented_on": "20 Nov 2017"
    }
  ]
}

发布 /blog/blog/2

{
  "title": "Hero",
  "body": "Hero test body...",
  "tags": ["Heros", "happy"],
  "published_on": "6 Oct 2018",
  "comments": [
    {
      "name": "steve",
      "age": 24,
      "rating": 18,
      "comment": "Nice article..",
      "commented_on": "3 Nov 2018"
    }
  ]
}

ES查询:

{
    "size": 0,
    "aggs": {
        "comments": {
            "nested": {
                "path": "comments"
            },

            "aggs": {
                "groups": {

                    "terms": {
                        "field": "comments.name",
"include": "William",
                        "order": {
                            "rate": "desc"
                        }
                    },

                    "aggs": {
                        "rate": {
                            "min": {
                                "field": "comments.age"
                            }
                        }
                    }
                }
            }
        }
    }
}

我可以获得每个发表评论的人的最小年龄聚合。 cmets 作者我可以包含/排除 cmets.name。我想为评分低于 8 的 cmets 添加过滤器。谁能帮助我获得 dsl?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您必须使用filter aggregation 根据评级过滤 cmets。

    {
      "size": 0,
      "aggs": {
        "comments": {
          "nested": {
            "path": "comments"
          },
          "aggs": {
            "filterByRating": {
              "filter": {
                "range": {
                  "comments.rating": {
                    "lt": 8
                  }
                }
              },
              "aggs": {
                "groups": {
                  "terms": {
                    "field": "comments.name",
                    "include": "William",
                    "order": {
                      "rate": "desc"
                    }
                  },
                  "aggs": {
                    "rate": {
                      "min": {
                        "field": "comments.age"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2015-11-14
      • 2017-04-15
      • 2018-01-30
      • 2014-12-31
      • 2014-11-14
      • 1970-01-01
      • 2015-05-06
      • 2021-04-19
      相关资源
      最近更新 更多