【问题标题】:Elastic Search aggregation nested嵌套的 Elastic Search 聚合
【发布时间】:2020-03-02 20:10:54
【问题描述】:

我必须按标签对演员的电影进行聚合

例如,我想查看 Robert Deni Jr. 的所有电影标签。 例如:动作(10)大片(4)浪漫(2)

如果我的用户按标签(动作)过滤小罗伯特丹尼电影,则需要更新过滤器。如果我检查浪漫然后:动作(1)大片(2)浪漫(2)

这是我的映射:

  "mapping": {
    "actor": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "name": {
          "type": "text"
        },
        "movies": {
          "type": "nested",
          "properties": {
            "id": {
              "type": "keyword"
            },
            "studio": {
              "type": "nested",
              "properties": {
                "id": {
                  "type": "keyword"
                },
                "label": {
                  "type": "text"
                }
              }
            },
            "tags": {
              "type": "nested",
              "properties": {
                "id": {
                  "type": "keyword"
                },
                "label": {
                  "type": "text"
                }
              }
            }
          }
        }
      }
    }
  }
}

这是我的查询

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "id": {
              "query": 587
            }
          }
        },
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "path": "movies",
                  "query": {
                    "nested": {
                      "path": "movies.tags",
                      "query": {
                        "term": {
                          "movies.tags.id": {
                            "value": 5189,
                            "boost": 1
                          }
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "tags": {
      "nested": {
        "path": "movies.tags"
      },
      "aggs": {
        "tags": {
          "terms": {
            "field": "movies.tags.id",
            "size": 100
          }
        }
      }
    }
  }
}

我的聚合忽略了给定的标签。我可以按标签过滤,也可以不过滤,聚合结果不会改变。

有什么想法吗?

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation


    【解决方案1】:

    您是否有理由将标签查询嵌套两次?首先你说movies 然后movie.tags 这可能就是你没有得到想要的结果的原因。试试这个

    {
        "query":{
            "bool":{
                "filter":[
                    {
                        "match":{
                            "id":{
                                "query":587
                            }
                        }
                    },
                    {
                        "bool":{
                            "must":[
                                {
                                    "nested":{
                                        "path":"movies",
                                        "query":{
                                            "term":{
                                                "movies.tags.id":{
                                                    "value":5189,
                                                    "boost":1
                                                }
                                            }
                                        }
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "aggs":{
            "tags":{
                "nested":{
                    "path":"movies.tags"
                },
                "aggs":{
                    "tags":{
                        "terms":{
                            "field":"movies.tags.id",
                            "size":100
                        }
                    }
                }
            }
        }
    }
    

    如果不起作用,请分享您的数据片段。

    另外,请注意,当您应用查询限制时,您的聚合也会受到影响。如果您希望在没有 Robert Downey 限制的情况下聚合整个索引(通常是这种情况),您可以使用 filtered aggregations

    【讨论】:

    • 你写的!我需要过滤聚合,它的工作。我理解我的错误,我改变了我获得聚合的方式,它是有效的。首先:我为罗伯特唐尼和标签执行聚合以找到两者都匹配的电影。然后我执行一个全局聚合,只过滤罗伯特唐尼的所有演员电影!
    • 很高兴我能帮上忙。接受上述答案会很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2016-02-10
    • 2018-01-14
    • 2014-06-29
    相关资源
    最近更新 更多