elasticsearch:按非键列对术语进行排序

aiazj4mn  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(379)

数据
我在es索引中保留了对象。它们中的每一个都有一个mykey和myname字符串字段(持久化为关键字字段)。不能保证同一个mykey的myname总是相同的。e、 g.以下两个条目共享相同的mykey,但具有不同的myname值:

{
  "myKey": "123asd",
  "myName": "United States",
  ...
},
{
  "myKey": "123asd",
  "myName": "United States of America",
  ...
},
{
  "myKey": "456fgh",
  "myName": "United Kingdom",
  ...
}

挑战
我需要选择并返回所有不同的mykey值,查找并显示最可能的myname(mykey上下文中最常见的),并按myname对生成的bucket进行排序。
到目前为止,我做到了以下几点:
使用术语聚合选择不同的mykey值。
通过使用top\u hits聚合,为每个mykey选择相应的first 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文档,其中解释了如何引入返回单个度量的第二个聚合。不过,这似乎只针对数字字段。myname不是数字。
有没有办法按我的名字对es中的桶进行排序?
非常感谢您的帮助。

在2上编辑。2020年9月

根据用户@joe的询问,当前结果和预期结果如下。

当前结果

很明显,桶的分类基于以下关键点: 123asd 在前面 456fgh :

"aggregations" : {
  "distinct" : {
    "buckets" : [
      {
        "key" : "123asd",
        "tops" : {
          "hits" : {
            "hits" : [
              {
                "_source" : {
                  "myName" : "United States"
                }
              }
            ]
          }
        }
      },
      {
        "key" : "456fgh",
        "tops" : {
          "hits" : {
            "hits" : [
              {
                "_source" : {
                  "myName" : "United Kingdom"
                }
              }
            ]
          }
        }
      }
    ]
  }
}

预期结果

任务是根据额外选择的字段myname对bucket进行排序: United Kingdom 在前面 United States :

"aggregations" : {
  "distinct" : {
    "buckets" : [
      {
        "key" : "456fgh",
        "tops" : {
          "hits" : {
            "hits" : [
              {
                "_source" : {
                  "myName" : "United Kingdom"
                }
              }
            ]
          }
        }
      },
      {
        "key" : "123asd",
        "tops" : {
          "hits" : {
            "hits" : [
              {
                "_source" : {
                  "myName" : "United States"
                }
              }
            ]
          }
        }
      }
    ]
  }
}
mwg9r5ms

mwg9r5ms1#

通过做 _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 孩子的结果 myName 阿格?
编辑
根据多桶子聚集的结果对父聚集进行排序会导致以下错误:
bucket只能在子聚合器路径上进行排序,该子聚合器路径由路径中的零个或多个单bucket聚合和路径末端的最终单bucket或度量聚合组成。
换句话说,你想要达到的目标是不可能的,这里很好地解释了原因。
如果您的子聚合是数字(或单个bucket),那么这是可能的。
目前,您唯一的选择似乎是在前端(或使用这些agg的任何地方)对当前响应进行后处理(或者更确切地说是后排序)。

相关问题