ElasticSearch search_在给出错误结果后

mctunoxg  于 2023-10-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(110)

我的团队使用的是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会返回错误的结果?

au9on6nz

au9on6nz1#

如果升级不是一个选择,我建议改用scroll。这是一个更坚实的解决方案,大约6.x的时间框架。

相关问题