我一直在尝试为我们的应用程序使用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,我该怎么办?如果我在排序中使用一个唯一的tie-breaker,我无法理解所述问题。有人可以帮忙以通俗易懂的方式解释一下吗?
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-search-after.html
每个文档具有一个唯一值的字段应该作为排序规范的tiebreaker。否则,具有相同排序值的文档的排序顺序将是未定义的,并且可能会导致缺失或重复的结果。_id字段对于每个文档具有唯一值,但不建议直接将其用作tiebreaker。请注意,search_after查找第一个完全或部分匹配tiebreaker提供的值的文档。因此,如果文档具有“654323”的tiebreaker值,并且您搜索“654”,它仍将匹配该文档并返回在其之后找到的结果。这个字段上禁用了doc value,因此在它上面进行排序需要在内存中加载大量数据。因此,建议在另一个启用了doc value的字段中复制(客户端侧或使用集合摄取处理器)_id字段的内容,并将此新字段用作排序的tiebreaker。
Id
字段与_id
字段不同。是的,在排序中不建议使用_id
,因为它需要在内存中加载大量数据。您可以将_id
字段复制为文档的id
字段,并使用该字段进行排序。 - Pramod