【发布时间】:2021-06-25 08:31:40
【问题描述】:
我一直在尝试将 Elasticsearch 用于我们的应用程序,但是分页限制为 10k 对我们来说实际上是一个问题,并且由于必须超时问题,滚动 API 也不是推荐的选择。
我发现 Elasticsearch 有一个叫做 search_after 的东西,它是支持深度分页的理想解决方案。我一直试图从文档中理解它,但它有点令人困惑,无法清楚地理解它是如何工作的。
假设,我的文档中有三列,id, first_name, last_name,这里的 ID 是唯一的主键。
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"sort": [
{"id": "asc"}
]
}
我可以使用上述查询来使用 search_after 功能吗?我在他们的文档中读到,我们必须在排序中使用多个唯一值,而不仅仅是一个 (ID),但正如您所知,在我的数据集中我只有 ID 是唯一的。 如何在我的数据集示例中使用 search_after?
如果我使用一个独特的决胜局进行排序,我无法理解所述问题?有人可以用外行的方式帮助解释一下吗?
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-search-after.html
每个文档都有一个唯一值的字段应用作 排序规范的决胜局。否则排序顺序为 具有相同排序值的文档将是未定义的,并且可以 导致结果丢失或重复。 _id 字段具有唯一值 每个文档,但不建议将其用作决胜局 直接地。请注意,search_after 会查找第一个文档 完全或部分匹配 tiebreaker 提供的值。因此,如果一个 文档的决胜局值为“654323”,您 search_after “654”它仍然会匹配该文档并返回找到的结果 在它之后。 doc 值在此字段上被禁用,因此对其进行排序 需要在内存中加载大量数据。相反,建议 复制(客户端或使用设置的摄取处理器)的内容 另一个启用了文档值的字段中的 _id 字段并使用 这个新字段作为排序的决胜局。
【问题讨论】:
-
据我了解,只要字段值是唯一的,您就可以只对一个字段使用排序。当您想根据某些非唯一字段对文档进行排序时,您需要添加多个排序字段(一个具有唯一值作为辅助排序的字段)作为决胜局。
-
@Pramod 从文档中,他们提到仅使用 _ID 字段并不理想,因为我猜 search_after 会进行部分匹配而不是完全匹配。这似乎是他们在文档页面中解释的内容。我想知道如何解决这个问题?
-
我认为您提到的
Id字段与_id字段不同。是的,不建议在排序中使用_id,因为它需要在内存中加载大量数据。您可以将_id字段复制为文档的id字段并用于排序。 -
@Pramod 抱歉,ID 字段与 _id 字段不同。这是一个错字。他们正在讨论的问题呢,
Therefore if a document has a tiebreaker value of "654323" and you search_after for "654" it would still match that document and return results found after it.
标签: elasticsearch elastic-stack