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

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

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

  1. {
  2. "myKey": "123asd",
  3. "myName": "United States",
  4. ...
  5. },
  6. {
  7. "myKey": "123asd",
  8. "myName": "United States of America",
  9. ...
  10. },
  11. {
  12. "myKey": "456fgh",
  13. "myName": "United Kingdom",
  14. ...
  15. }

挑战
我需要选择并返回所有不同的mykey值,查找并显示最可能的myname(mykey上下文中最常见的),并按myname对生成的bucket进行排序。
到目前为止,我做到了以下几点:
使用术语聚合选择不同的mykey值。
通过使用top\u hits聚合,为每个mykey选择相应的first myname值。
使用术语聚合的order子句按mykey排序。
这是聚合的代码:

  1. "aggs": {
  2. "distinct": {
  3. "terms": {
  4. "field": "myKey",
  5. "order": {
  6. "_key": "desc" <----- this sorts the buckets by myKey
  7. }
  8. },
  9. "aggs": {
  10. "tops": {
  11. "top_hits": {
  12. "size": 1,
  13. "_source": {
  14. "includes": ["myName"]
  15. }
  16. }
  17. }
  18. }
  19. }

我阅读了es文档,其中解释了如何引入返回单个度量的第二个聚合。不过,这似乎只针对数字字段。myname不是数字。
有没有办法按我的名字对es中的桶进行排序?
非常感谢您的帮助。

在2上编辑。2020年9月

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

当前结果

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

  1. "aggregations" : {
  2. "distinct" : {
  3. "buckets" : [
  4. {
  5. "key" : "123asd",
  6. "tops" : {
  7. "hits" : {
  8. "hits" : [
  9. {
  10. "_source" : {
  11. "myName" : "United States"
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. },
  18. {
  19. "key" : "456fgh",
  20. "tops" : {
  21. "hits" : {
  22. "hits" : [
  23. {
  24. "_source" : {
  25. "myName" : "United Kingdom"
  26. }
  27. }
  28. ]
  29. }
  30. }
  31. }
  32. ]
  33. }
  34. }

预期结果

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

  1. "aggregations" : {
  2. "distinct" : {
  3. "buckets" : [
  4. {
  5. "key" : "456fgh",
  6. "tops" : {
  7. "hits" : {
  8. "hits" : [
  9. {
  10. "_source" : {
  11. "myName" : "United Kingdom"
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. },
  18. {
  19. "key" : "123asd",
  20. "tops" : {
  21. "hits" : {
  22. "hits" : [
  23. {
  24. "_source" : {
  25. "myName" : "United States"
  26. }
  27. }
  28. ]
  29. }
  30. }
  31. }
  32. ]
  33. }
  34. }
mwg9r5ms

mwg9r5ms1#

通过做 _count:desc ,您只按字母顺序排列了最上面的agg。。。
你有没有试过下列最常见的方法 myName 在给定的条件下 myKey ?

  1. {
  2. "size": 0,
  3. "aggs": {
  4. "by_key": {
  5. "terms": {
  6. "field": "myKey",
  7. "order": {
  8. "_key": "desc"
  9. }
  10. },
  11. "aggs": {
  12. "by_name": {
  13. "terms": {
  14. "field": "myName",
  15. "order":{
  16. "_count": "desc"
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }
  23. }

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

展开查看全部

相关问题