我们开发了一个文件存储解决方案,它使用弹性搜索来存储有关文件的元数据,使用其余级别的客户端 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”一起返回,然后在随后的 searchAfter 字段调用中使用“txt”,但这并没有不给出任何结果。
所以看起来 searchAfter 只适用于日期等字段。
我在想我们可能可以在内部存储 lastSorted 值(索引),所以回到解决方案 1,但如果 from + size > 10,000 使用最后一个排序值,它对客户端用户隐藏。我看到的唯一问题是我们可以在哪里存储最后一个排序值,并且每个搜索的最后一个排序值需要是唯一的,我可能不希望一个巨大的数据库纯粹为此而填充所有这些排序值。
想法?
谢谢,