数据
我在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"
}
}
]
}
}
}
]
}
}
1条答案
按热度按时间mwg9r5ms1#
通过做
_count:desc
,您只按字母顺序排列了最上面的agg。。。你有没有试过下列最常见的方法
myName
在给定的条件下myKey
?或者你想给父母分类
myKey
孩子的结果myName
阿格?编辑
根据多桶子聚集的结果对父聚集进行排序会导致以下错误:
bucket只能在子聚合器路径上进行排序,该子聚合器路径由路径中的零个或多个单bucket聚合和路径末端的最终单bucket或度量聚合组成。
换句话说,你想要达到的目标是不可能的,这里很好地解释了原因。
如果您的子聚合是数字(或单个bucket),那么这是可能的。
目前,您唯一的选择似乎是在前端(或使用这些agg的任何地方)对当前响应进行后处理(或者更确切地说是后排序)。