我的团队使用的是ElasticSearch 6.2,并且有一个包含100,000,000个文档的索引。有100,000个文档的名称字段等于'Samuel'。我写了一个ElasticSearch查询来检索name字段等于'Samuel'的所有文档。我使用id的唯一字段作为排序字段:
{
"query": {
"bool": {
"must": {
"match": {
"name": "company"
}
}
}
},
"sort": [
{
"id": "asc"
}
]
}
当我运行这个查询时,ElasticSearch给了我以下响应:
{
"took": 54,
. . .
"hits": {
"total": 100000,
"max_score": null,
"hits": [
. . .
]
}
}
我想把这10万个结果都标上页码。据我所知,有两种方法可以做到这一点:
- 选项1:使用from和size参数并将它们添加到查询中。
{
"from": <FROM>,
"size": <SIZE>,
"query": {
"bool": {
"must": {
"match": {
"name": "company"
}
}
}
},
"sort": [
{
"id": "asc"
}
]
}
- 选项2:使用search_after参数并包含最后一页命中的id。
{
"search_after": [<ID>],
"query": {
"bool": {
"must": {
"match": {
"name": "company"
}
}
}
},
"sort": [
{
"id": "asc"
}
]
}
使用选项1,虽然它需要更多的调用,但返回了我期望的所有100,000个结果。然而,我发现选项2给了我比预期的100,000更多的结果。它似乎也返回不符合我的标准的文件。第一个页面(没有使用search_after)返回我期望的结果。为什么search_after会返回错误的结果?
1条答案
按热度按时间au9on6nz1#
如果升级不是一个选择,我建议改用scroll。这是一个更坚实的解决方案,大约6.x的时间框架。