gpt4 book ai didi

elasticsearch - Elasticsearch:按非关键列对术语聚合桶进行排序

转载 作者:行者123 更新时间:2023-12-03 01:12:51 26 4
gpt4 key购买 nike

数据
我有对象保留在ES索引中。它们每个都有一个 myKey myName 字符串字段(持久化为关键字字段)。不能保证 myName 对于相同的 myKey 始终是相同的。例如。以下两个条目共享相同的 myKey ,但具有不同的 myName 值:

{
"myKey": "123asd",
"myName": "United States",
...
},
{
"myKey": "123asd",
"myName": "United States of America",
...
},
{
"myKey": "456fgh",
"myName": "United Kingdom",
...
}
挑战
我需要选择并返回所有不同的 myKey 值,查找并显示最可能的 myName (在 myKey 上下文中出现的次数最多),然后按 myName 排序结果存储桶。
到目前为止,我管理以下内容:
  • 通过使用术语聚合来选择不同的 myKey 值。
  • 通过使用 top_hits 聚合为每个 myKey 选择对应的第一个 myName 值。
  • 使用术语聚合的order子句按 myKey 排序。

  • 这是聚合的代码:
    "aggs": {
    "distinct": {
    "terms": {
    "field": "myKey",
    "order": {
    "_key": "desc" <----- this sorts the buckets by myKey
    }
    },
    "aggs": {
    "tops": {
    "top_hits": {
    "size": 1,
    "_source": {
    "includes": ["myName"]
    }
    }
    }
    }
    }
    我阅读了 ES documentation,其中解释了如何引入第二种返回单个度量的聚合。但这似乎只解决数字字段。 myName不是数字。
    是否可以通过myName对ES中的存储桶进行排序?
    任何帮助,不胜感激。
    编辑于2020年9月2日
    根据用户@joe的要求,当前和预期结果如下。
    当前结果
    显而易见,存储桶的排序基于以下关键字: 123asd456fgh之前:
    "aggregations" : {
    "distinct" : {
    "buckets" : [
    {
    "key" : "123asd",
    "tops" : {
    "hits" : {
    "hits" : [
    {
    "_source" : {
    "myName" : "United States"
    }
    }
    ]
    }
    }
    },
    {
    "key" : "456fgh",
    "tops" : {
    "hits" : {
    "hits" : [
    {
    "_source" : {
    "myName" : "United Kingdom"
    }
    }
    ]
    }
    }
    }
    ]
    }
    }
    预期结果
    任务是根据额外选择的字段myName对存储桶进行排序: United KingdomUnited States之前:
    "aggregations" : {
    "distinct" : {
    "buckets" : [
    {
    "key" : "456fgh",
    "tops" : {
    "hits" : {
    "hits" : [
    {
    "_source" : {
    "myName" : "United Kingdom"
    }
    }
    ]
    }
    }
    },
    {
    "key" : "123asd",
    "tops" : {
    "hits" : {
    "hits" : [
    {
    "_source" : {
    "myName" : "United States"
    }
    }
    ]
    }
    }
    }
    ]
    }
    }

    最佳答案

    通过执行_count:desc,您仅按字母顺序排列了顶部agg ...
    您是否尝试了以下在给定myName下寻找最频繁的myKey的以下操作?

    {
    "size": 0,
    "aggs": {
    "by_key": {
    "terms": {
    "field": "myKey",
    "order": {
    "_key": "desc"
    }
    },
    "aggs": {
    "by_name": {
    "terms": {
    "field": "myName",
    "order":{
    "_count": "desc"
    }
    }
    }
    }
    }
    }
    }
    还是要根据子 myKey agg的结果对父 myName agg进行排序?

    编辑
    通过多存储桶子聚合的结果对父agg进行排序会导致以下错误:

    Buckets can only be sorted on a sub-aggregator path that is built outof zero or more single-bucket aggregations within the path and a finalsingle-bucket or a metrics aggregation at the path end.


    换句话说,您要实现的目标是不可能的,这是 nicely explained why
    如果您的子聚合是数字(或单桶),则应该是 possible
    目前,您唯一的选择似乎是在前端(或您使用这些aggs的任何地方)对当前响应进行后处理(或后排序)。

    关于elasticsearch - Elasticsearch:按非关键列对术语聚合桶进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63672554/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com