elasticsearch - 每次连续显示多次时,如何将具有相同字段值的结果限制为X个文档

标签 elasticsearch search lucene kibana

我有一个我不太确定如何解决的问题。真的希望这里有人可以帮助我找出解决方法。

想象一下,我有100个文档,所有文档都带有user_id字段。我知道大多数文档都来自不同的user_id,但是文档1-10和20-29来自相同的user_id。

我想做的是确保每当同一行user_id返回两次以上时,我只能看到最新的两个文档。因此,如果user_id 1连续显示两次以上,则我想限制这些文档。我希望每次user_id都发生这种情况,而不是在此之后完全限制它。

如果我只索取现在已建立索引的所有文档,则会得到如下结果:

[1,1,1,1,1,1,1,1,1,2,2,3,4,5,6,7,8,9,10,11,1,1,1,1,1, 1,1,1,1,1,1,...]

我正在寻找的是一种确保这些1的组被限制为连续两个文档的方式,如下所示:

[1,1,2,3,4,5,6,7,8,9,10,11,1,1,12,...]

请注意,此处发生了1, 1, ..., 1, 1, ...,这意味着相同用户ID的行已被缩减为两行,而不是全部删除,这将导致以下结果:

[1,1,2,3,4,5,6,7,8,9,10,11,12,...]

如果请求是分页的(多个查询),我也希望它能正常工作。

因此,假设我请求的前两个页面的大小为5,那么我想得到:

第1页: [1、1、2、3、4]

第2页: [5、6、7、8、9]

代替:

第1页: [1、1、2、3、4]

第2页: [1、1、1、1、1]

我希望我已经很好地描述了这个问题,以便有人理解。如果没有,请让我知道,以便尝试另一种解释。

最佳答案

您对问题的描述很好并且可以理解。

您可以按照排序标准将搜索结果折叠成每个用户的单个结果(折叠在user_id上)(此解决方案方法也可以与分页结合使用)。如果您对多达2个特定用户ID的文档感兴趣,则可以展开折叠后的结果以包括显示内部匹配。

解决方案

GET /myindex/_search
{
  "from": 10,
  "size": 10,
  "query": {
    "match": {
       "<my_field>": "<my_search_terms>"
    }
  },
  "collapse" : {
    "field" : "user_id",
    "inner_hits": {
        "name": "last_two_documents_per_user", 
        "size": 2,
        "sort": [{ "<my_timestamp_field>": "desc" }] 
    },
    "max_concurrent_group_searches": 4
  },
  "sort": ["<my_timestamp_field>"], 
}

(参见Elasticsearch引用:Field Collapsing)

关于elasticsearch - 每次连续显示多次时,如何将具有相同字段值的结果限制为X个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60058335/

相关文章:

elasticsearch - 如何查询ES以获取所有关联为4.0的客户的名称

elasticsearch - Elasticsearch:带有完成提示的索引增强

ruby-on-rails - 对关联进行彻底搜索并拒绝

multithreading - 具有多线程的 Lucene NIOFSDirectory 和 SimpleFSDirectory

elasticsearch - 在带有Should子句的Elasticsearch中使用SearchTemplate进行日期范围查询

php - 如何避免将搜索查询分开来搜索 MySQL 数据库?

java - 如何在 java 文档中搜索 100 万个字符串?

Elasticsearch vs Cassandra vs Elasticsearch with Cassandra

lucene - 优化期间的 Solr %100 写入可用性

elasticsearch - 在 elasticsearch 中使用现有字段作为 id