Elastic Search聚合嵌套

问题描述 投票:0回答:1

我必须通过标签对演员的电影进行汇总

例如,我想查看小电影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个回答
0
投票

您是否有理由将代码查询嵌套两次?首先,您说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

© www.soinside.com 2019 - 2024. All rights reserved.