首页 > 解决方案 > Elasticsearch排序:每组一个并重复

问题描述

我需要value从每个项目中获取最大的项目name并重复直到结束。

我将通过简单的例子来解释它。我有这样的项目:

Name| Value
-----------
AAA | 12
AAA | 35
AAA | 5
BBB | 1
BBB | 10
BBB | 5

排序后的预期结果:

Name| Value
-----------
AAA | 35
BBB | 10
AAA | 12
BBB | 5
AAA | 5
BBB | 1

我知道如何在 Postgres 中做到这一点(窗口函数:)rank() over(),但是在 Elastic 中可以吗?

标签: sortingelasticsearch

解决方案


在这里汇总我的评论。

回答您的直接问题:不,据我所知不可能。但也有一些 Elasticsearch 可以提供帮助的变通方法。

对于 Elasticsearch,无论这些文档如何排序,显示超过 100 万条记录都是一个坏主意。我在评论中的问题被问到创建第二个 ES 索引是否合适,该索引可能是1 个查询 + 后处理的结果,并保存类似“前 1000 条记录”(意思是人类合理的文档列表)并更新该列表定期(每 10 秒左右)。您可以使用Watcher构建此索引并保持更新。正如我所说,100 万条记录是不切实际的(谁会看 100 万个文档),从 ES 的角度来看也不是高性能的。

基本上,保留一个单独的索引,该索引应仅包含根据您的要求排序的前 1000 个文档。而且该索引会定期更新,而不是您拥有 100 万份文档的主要索引。关于分页和100万。文档...您认为您的用户会浏览多少页?!10、15、20?甚至 google.com 也没有为您提供一切。只有几十页,尽管可以有数亿次匹配。请记住,Elasticsearch 是一个搜索引擎,而不是一个数据库。目的是为您提供最佳匹配的文档,而不是全部。

Watcher 的查询将遍历主索引中的所有文档。它将根据您的要求聚合文档(我认为terms聚合 on Name,order by Value),您可以添加一个后处理步骤来创建您需要的订单,然后将其索引到第二个索引中。下次手表触发时,它将删除旧索引,再次执行相同的查询并在(现在为空的)索引中索引新结果。


推荐阅读