嵌套的弹性搜索聚合

Elastic Search aggregation nested

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

例如,我想查看小罗伯特·德尼 (Robert Deni Jr) 的所有电影标签。 例如:动作片 (10) 大片 (4) 浪漫片 (2)

如果我的用户通过标签(动作)过滤 Robert Deni Jr. 电影,则需要更新过滤器。如果我检查 romance 然后 : action (1) blockbuster(2) romance (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
          }
        }
      }
    }
  }
}

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

有什么想法吗?

您是否有理由将标签查询嵌套两次?首先你说 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 限制的情况下(通常是这种情况)聚合整个索引,则可以使用 .