gpt4 book ai didi

elasticsearch - search_after 如何在 Elasticsearch 中工作?

转载 作者:行者123 更新时间:2023-12-04 12:55:31 32 4
gpt4 key购买 nike

我一直在尝试将 Elasticsearch 用于我们的应用程序,但限制为 10k 的分页实际上对我们来说是一个问题,并且由于必须超时问题,scroll 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

A field with one unique value per document should be used as thetiebreaker of the sort specification. Otherwise the sort order fordocuments that have the same sort values would be undefined and couldlead to missing or duplicate results. The _id field has a unique valueper document but it is not recommended to use it as a tiebreakerdirectly. Beware that search_after looks for the first document whichfully or partially matches tiebreaker’s provided value. Therefore if adocument has a tiebreaker value of "654323" and you search_after for"654" it would still match that document and return results foundafter it. doc value are disabled on this field so sorting on itrequires to load a lot of data in memory. Instead it is advised toduplicate (client side or with a set ingest processor) the content ofthe _id field in another field that has doc value enabled and to usethis new field as the tiebreaker for the sort.

最佳答案

在您的情况下,如果您的 id字段包含唯一值且类型为 keyword (或数字)那么你绝对没问题,可以使用它来使用 search_after 进行分页.
因此,第一个电话将是您在问题中的电话:

{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"sort": [
{"id": "asc"},
{"score": "desc"}
]
}
在您的回复中,您需要查看最后一次点击并获取 sort最后一次命中的值:
{
"_index" : "myindex",
"_type" : "_doc",
"_id" : "100000012",
"_score" : null,
"_source": { ... },
"sort" : [
"100000012", <--- take this
"98" <--- take this
]
}
然后在下一次搜索调用中,您将在 search_after 中指定该值。
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [ "100000012", "98" ], <--- add this
"sort": [
{"id": "asc"}
]
}
下一个结果集的第一个命中将是 id: 100000013 .就是这样。没有更多了。
您所指的问题与您无关 如果你总是用完整的 id 排序值 .它的工作方式是你总是使用最后一个 id先前结果的值。如果您要添加 "search_after": ["1000"]那么你就会遇到他们提到的问题,但你没有理由这样做。

关于elasticsearch - search_after 如何在 Elasticsearch 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68127892/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com