假设我有一个包含以下文档的索引:
{
"id": "8e8e3c0c-5d1d-4a3c-a78a-1bd2d206b39e",
"timestamp": "2022-10-18T00:00:02"
}
{
"id": "0ebeb7b1-dcd0-4b37-a70d-fa7377f07f8c",
"timestamp": "2022-10-18T00:00:03"
}
{
"id": "ea779299-1781-4465-b8a1-53f7b14fbe0c",
"timestamp": "2022-10-18T00:00:01"
}
{
"id": "3624a119-4830-4ec2-a840-f656c048fc5c",
"timestamp": "2022-10-18T00:00:04"
}
我需要一个搜索查询,它返回指定id
中的文档,按timestamp
排序,最多不超过100个。因此,给定8e8e3c0c-5d1d-4a3c-a78a-1bd2d206b39e
的id
,将返回以下文档(请注意,按此顺序,缺少具有id
ea779299-1781-4465-b8a1-53f7b14fbe0c
的文档,因为它的时间戳早于我正在查找的文档):
{
"id": "8e8e3c0c-5d1d-4a3c-a78a-1bd2d206b39e",
"timestamp": "2022-10-18T00:00:02"
}
{
"id": "0ebeb7b1-dcd0-4b37-a70d-fa7377f07f8c",
"timestamp": "2022-10-18T00:00:03"
}
{
"id": "3624a119-4830-4ec2-a840-f656c048fc5c",
"timestamp": "2022-10-18T00:00:04"
}
我知道如何在两个查询中完成此操作,首先通过id
获取文档,然后通过另一个查询获取该文档的timestamp
“之后”的所有文档,但我希望有一种更有效的方法使用一个查询来完成此操作。
请注意,该索引预计将包含数千万/数亿个文档,因此性能问题是一个因素(我不确定ES在幕后做了什么“工作”,例如首先排序,然后访问每个文档以检查id
),但群集的大小将适当。
1条答案
按热度按时间vbopmzt11#
您可以使用下面的
bool
查询,该查询将给出您预期的结果。must
中的match_all
将返回所有文档,should
子句中的term
将提升ID
匹配的文档。如果
id
字段定义为keyword
类型,则仅在术语查询中使用id
,如果它同时定义为text
和keyword
,则使用id.keyword
。