我有一个我不太确定如何解决的问题。真的希望这里有人可以帮助我找出解决方法。
想象一下,我有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/