gpt4 book ai didi

Elasticsearch 分页最佳方法

转载 作者:行者123 更新时间:2023-12-03 02:28:53 26 4
gpt4 key购买 nike

我们开发了一个文件存储解决方案,它使用 Elasticsearch 来存储有关文件的元数据,使用其余级别的客户端 java API。

我们目前通过“from”和“size”实现分页。客户调用我们指定大小,也可以指定页码,我们使用页码来计算偏移量或“从”。

它们也可以通过任何可以从字符串命名为日期、整数等的字段进行排序,但我们默认为创建日期

例如,从和大小导致的问题是深度分页,例如(解决方案1)

1. /rest/metadata/search*

1. numberOfHitsPerPage = 5000
2. from(0),size(5000)

2. /rest/metadata/search?pageNumber=2

1. numberOfHitsPerPage=5000
2. from(5000),size(5000)

3. /rest/metadata/search?pageNumber=3

1. from(10000),size(5000)
2. From + size = 15,000, which is over the index.max_result_window of 10,000 and will fail.

我一直在研究 searchAfter 功能并实现了这一点,所以在响应中我们返回最后一个“排序”索引值,客户端可以在后续调用中使用它来避免上述问题。例子。 (解决方案 2)
1. /rest/metadata/search

1. numberOfHitsPerPage = 5000
2. We return the 5000 hits but also include the sort value of the last hit.

2. /rest/metadata/search?lastIndexValue=1581418484000

1. numberOfHitsPerPage=5000
2. Under the hood we then use search_after to search from 1581418484000, return the next 5000 hits and the new last index.

3. /rest/metadata/search? lastIndexValue=1581418484011

1. numberOfHitsPerPage=5000
2. Under the hood we then use search_after to search from 1581418484011, return the next 5000 hits and return the new last index.
3. There is no exception here because the filter is applied on the search request itself @ 5000 a time.

这在某些情况下可以正常工作,但也给我们带来了奇怪的结果,因为我在上面提到我们允许按任何字段排序,因此例如我们有 100 个文件存储,所有“扩展”字段设置为 txt,100 个设置为 pdf,所以用户可以一个大小设置为 10 的调用并希望按“扩展名”排序,我们将它们与最后一个“排序”索引“txt”一起返回,“txt”然后用于 searchAfter 字段的后续调用,但这不会不给出任何结果。

所以看起来 searchAfter 只适用于日期等字段。

我在想可能我们可以在内部存储 lastSorted 值(索引),所以回到解决方案 1 但是如果 from + size > 10,000 使用最后一个排序值并且它对客户端用户隐藏。我看到的唯一问题是我们可以在哪里存储最后一个排序值,并且每个搜索的最后一个排序值都需要是唯一的,我不希望纯粹为此而填充所有这些排序值的巨大数据库。

想法?

谢谢,

最佳答案

正如您正确观察到的,fromsize技术不允许您进行深度分页。与 search_after您可以搜索任意深度。

但是search_after不允许您随机“跳跃”,但您可以按顺序检索命中。对于每个后续请求,您需要提供上一个请求的最后一次命中的排序参数的值。排序值必须是唯一的。由于仅按一个值(例如 _score 或后缀)排序很可能不是唯一的,因此您需要指定第二个排序标准(最好是唯一值)以使上一个请求的最后一次命中唯一可识别。

您可以使用 _id -field ,但这不是很有效,因为 Elasticsearch 不会为 _id 编写 doc-values 数据结构。 - field 。因此,请使用 keyword 类型的任何其他唯一字段为此目的(例如uri)。如果您没有每个文档具有唯一值的此类字段,只需复制 _id 的值-field 进入类型为 keyword 的新字段.例如,您可以在摄取管道中这样做。

关于Elasticsearch 分页最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60438824/

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