【发布时间】:2020-09-02 22:02:30
【问题描述】:
数据
我在 ES 索引中保留了对象。它们每个都有一个 myKey 和 myName 字符串字段(保留为关键字字段)。对于同一个 myKey,不能保证 myName 总是相同的。例如。以下两个条目共享相同的 myKey,但具有不同的 myName 值:
{
"myKey": "123asd",
"myName": "United States",
...
},
{
"myKey": "123asd",
"myName": "United States of America",
...
},
{
"myKey": "456fgh",
"myName": "United Kingdom",
...
}
挑战
我需要选择并返回所有不同的 myKey 值,查找并显示最可能的 myName(在 myKey 的上下文中出现的次数最多) 并按 myName 对生成的存储桶进行排序。
到目前为止,我完成了以下工作:
- 使用 terms 聚合选择不同的 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的询问,目前和预期的结果如下。
当前结果
显然,桶的排序是基于键:123asd 在456fgh 之前:
"aggregations" : {
"distinct" : {
"buckets" : [
{
"key" : "123asd",
"tops" : {
"hits" : {
"hits" : [
{
"_source" : {
"myName" : "United States"
}
}
]
}
}
},
{
"key" : "456fgh",
"tops" : {
"hits" : {
"hits" : [
{
"_source" : {
"myName" : "United Kingdom"
}
}
]
}
}
}
]
}
}
预期结果
任务是根据额外选择的字段 myName 对存储桶进行排序: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"
}
}
]
}
}
}
]
}
}
【问题讨论】:
标签: elasticsearch