【问题标题】:Reverse_nested aggregation + top hits : get parent and nested data at the same timeReverse_nested 聚合+top hits:同时获取父级和嵌套数据
【发布时间】:2021-02-17 07:05:23
【问题描述】:

你知道如何使用 reverse_nested 聚合来获取我的热门聚合中的父数据和嵌套数据吗? “唯一”部分是现在的问题。 这是我的映射:

{
    "ticket": {
        "mappings": {
            "properties": {
                "name": {
                    "type": "keyword"
                }
            },
            "tasks": {
                "type": "nested",
                "properties": {
                    "string_task_name": {
                        "type": "keyword"
                    }
                }
            }
        }
    }
}

我的查询使用热门匹配和反向嵌套聚合。

{
    "aggs": {
        "object_tasks": {
            "nested": {
                "path": "object_tasks"
            },
            "aggs": {
                "filter_by_tasks_attribute": {
                    "filter": {
                        "bool": {
                            "must": [
                                {
                                    "wildcard": {
                                        "object_tasks.string_task_name.keyword": "*"
                                    }
                                }
                            ]
                        }
                    },
                    "aggs": {
                        "using_reverse_nested": {
                            "reverse_nested": {
                                "path": "object_tasks"
                            },
                            "aggs": {
                                "names": {
                                    "top_hits": {
                                        "_source": {
                                            "includes": [
                                                "object_tasks.string_task_name",
                                                "string_name"
                                            ]
                                        },
                                        "sort": [
                                            {
                                                "object_tasks.string_task_name.keyword": {
                                                    "order": "desc"
                                                }
                                            }
                                        ],
                                        "from": 0,
                                        "size": 10
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
{
    "hits": {
        "total": {
            "value": 25,
            "relation": "eq"
        },
        "max_score": null,
        "hits": [
            {
                "_index": "random_index",
                "_type": "_doc",
                "_id": "5",
                "_score": null,
                "_source": {
                    "object_tasks": [  ================> I don't want all these tasks names, I just want the task name of the current nested object I am in.
                                            {
                            "string_task_name": "task1"
                        },
                        {
                            "string_task_name": "task2"
                        },
                        {
                            "string_task_name": "task3"
                        },
                        {
                            "string_task_name": "task4"
                        }
                    ],
                    "string_name": "Dummy Ticket 854"
                },
                "sort": [
                    "seek_a_sme"
                ]
            }
        ]
    }
}

如您所见,结果是给了我 4 个任务名称。我想要的是只返回 1 个任务名称。

我发现的唯一解决方法是复制任务内的工单数据。但如果我能避免它,那就太棒了。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我不想要所有这些任务名称,我只想要我所在的当前嵌套对象的任务名称。

    “我所在的当前嵌套对象”的陈述意味着您nested 上下文中,但是当您逃脱时,您不能在其中它通过reverse_nested...

    我不确定我是否真正理解您在这里的目的,但您可以根据object_tasks.string_task_name.keyword 的条款进行聚合,然后此聚合的键将作为个人“当前嵌套对象”,您正在追求:

    {
      "size": 0,
      "aggs": {
        "object_tasks": {
          "nested": {
            "path": "object_tasks"
          },
          "aggs": {
            "filter_by_tasks_attribute": {
              "filter": {
                "bool": {
                  "must": [
                    {
                      "wildcard": {
                        "object_tasks.string_task_name.keyword": "*"
                      }
                    }
                  ]
                }
              },
              "aggs": {
                "by_string_task_name": {
                  "terms": {
                    "field": "object_tasks.string_task_name.keyword",
                    "order": {
                      "_key": "desc"
                    }, 
                    "size": 10
                  },
                  "aggs": {
                    "using_reverse_nested": {
                      "reverse_nested": {},
                      "aggs": {
                        "names": {
                          "top_hits": {
                            "_source": {
                              "includes": [
                                "string_name"
                              ]
                            },
                            "from": 0,
                            "size": 10
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    屈服

    "aggregations" : {
      "object_tasks" : {
        ...
        "filter_by_tasks_attribute" : {
          ...
          "by_string_task_name" : {
            ...
            "buckets" : [
              {
                "key" : "task4",                <--
                ...
                "using_reverse_nested" : {
                  ...
                  "names" : {
                    "hits" : {
                      ...
                      "hits" : [
                        {
                          ...
                          "_source" : {
                            "string_name" : "Dummy Ticket 854"  <--
                          }
                        }
                      ]
                    }
                  }
                }
              },
              {
                "key" : "task3",                <--
                ...
              },
              {
                "key" : "task2",                <--
                ...
              },
              {
                "key" : "task1",                <--
                ...
                }
              }
            ]
          }
        }
      }
    }
    

    请注意,top_hits 聚合不再需要排序 - 对于任何当前聚合的 terms 存储桶,object_tasks.string_task_name.keyword 将始终相同。我所做的是 order this terms aggregation by _key,其工作方式与 top_hits 排序相同。顺便说一句——你的参数是missing the nested path

    【讨论】:

    • 感谢您的回答,我之所以使用 top_hits 是因为我需要在任务中按其他参数进行过滤和排序。看起来如果我想这样做,我将不得不创建多个术语聚合并按它们排序吗?
    • 是的,这是一个好的开始。告诉我进展如何。
    • 做所有这些术语聚合太痛苦了,所以我宁愿只将父项的内容复制到子项中并按它进行排序和过滤。问题是现在我需要按热门搜索中的脚本字段进行排序,并且由于某些原因它不起作用。我想这是一个单独的主题。
    • 按脚本字段排序在排序上下文中不起作用,因为它们是两个独立的 API。使用像 here 这样的脚本排序
    • 我明白了,我的意思是使用脚本排序,而不是按脚本字段排序。但我明白你的意思。我实际上尝试在热门聚合中实现脚本排序,但在这里遇到一些问题:stackoverflow.com/questions/67308707/… 也许你知道出了什么问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2021-09-19
    • 2020-09-25
    • 1970-01-01
    • 2016-07-11
    • 2021-05-11
    • 2016-04-23
    相关资源
    最近更新 更多