- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试将 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/
我正在对18,000个主题的结果集进行 flex 搜索。因此,我正在使用search_after。但是在第一次使用此参数后,出现以下错误。 Unknown key for a VALUE_STRING
GET twitter/_search { "size": 10, "query": { "match" : { "title" : "elas
我有一个看起来像这样的 Elasticsearch 查询, { size: 25, query: { bool: { filter: ..., must: ..
我读了这个doc了解“search_after”并有两个问题。 我很好奇“tweet#654323”的来源。这是其中之一吗文档 ID 或字段数据? 当我添加多个search_after参数时,是'an
我一直在尝试将 Elasticsearch 用于我们的应用程序,但限制为 10k 的分页实际上对我们来说是一个问题,并且由于必须超时问题,scroll API 也不是推荐的选择。 我发现 Elasti
我试图通过索引索引同时查询我的索引并根据地理距离进行过滤,但我可能会收到此错误 错误: { "error": { "root_cause": [ {
如何在 spring boot NativeSearchQueryBuilder 中将“search_after”(https://www.elastic.co/guide/en/elasticsea
我想随机跳转到 elasticsearch 的结果页面。 elasticsearch中分页的三种方式: from/size - 由于最大深度限制为 10000,我无法使用它。 滚动 API - 我可以
对于查询中给定的日期范围和 search_after 参数,我能够成功提取相关结果。我如何确定我是否在给定日期范围内的搜索结果末尾,并且我不必继续使用 search_after 参数进行查询。 最佳答
我正在使用弹性 RestHighLevelClient 与 ES 交谈。我能够查询基本查询。虽然我正在尝试使用 teh search_after api 从我的前端查询中设计一个分页的 api。尽管
我是一名优秀的程序员,十分优秀!