假设我的索引中有一百万(很多)个文档。我执行一个搜索查询,按某个键 X 对项目进行排序。
现在我有一个很长的结果列表:[..., id1, id2, id3, ...]
问题:我如何获得id1
和 id3
如果我知道 id2
但不想执行整个搜索/不想获取所有 ID?
我正在寻找适用于任何搜索查询的通用解决方案。给定一个在查询结果中肯定存在的 id,如何通过该 id 获取上一个/下一个。除了搜索上一个/下一个的 id 之外,查询不应该有其他任何东西的先验知识。 (换句话说,如果按标题排序并搜索 id X 的 prev/next,则在查询时不知道 X 的标题,只有 X 的 id。)
当然可以通过获取 id2
来执行多个搜索查询并获得相同的最终结果。然后通过排序来获取 ID 1 和 3。
编辑:
我认为 Luc E 的答案不是我想要的。在这种情况下,需要了解原始对象标题才能查询上一个/下一个。我正在寻找一种在查询时只知道 id 的解决方案。
示例数据如下所示:
[...
{id: 32, title: 'AAA'},
{id: 12, title: 'BBB'},
{id: 99, title: 'CCC'},
{id: 3, title: 'DDD'},
{id: 1001, title: 'EEE'},
...]
我知道的:id 99。我不知道的:id 99 的标题是什么。
我想要的是:按标题字段(= 3 和 12)排序的上一个/下一个项目的 ID。
换句话说:我有 99 号 ID,但我手上没有标题。我想要一个给我 ids 3 和 12 的查询(它们是按标题排序的上一个/下一个)。
最佳答案
你想做的叫deep scrolling
,你只有两种方法可以做到:
最简单的方法是search_after但您需要提出两个请求:
id3
id1
所以,在这个例子中,我正在寻找
id2 : 128
.我可以使用字段 title
对文档进行排序我事先得到了 title
的值为 id2
这是 title_of_128
.执行
search_after
,我必须添加_id
在子排序条件下这是我的查询:
POST test/_search
{
"size": 2,
"search_after": ["title_of_128","128"],
"sort": [
{
"title": {
"order": "asc"
},
"_id": {
"order": "asc"
}
}
]
}
此查询的结果是
id2
和 id3
现在我反转排序的方向以检索
id1
:POST test/_search
{
"size": 2,
"search_after": ["title_of_128","128"],
"sort": [
{
"title": {
"order": "desc"
},
"_id": {
"order": "desc"
}
}
]
}
此查询的结果是
id2
和 id1
注意用
_id
排序已弃用,最佳做法是复制 _id
如果您想使用 search_after
在另一个字段中
关于elasticsearch - 在 Elasticsearch 中通过 id 获取上一个/下一个搜索结果的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60815459/