Solr的光标和ElasticSearch的滚动之间的差异

t1rydlwq  于 2022-11-05  发布在  Solr
关注(0)|答案(1)|浏览(147)

在使用SolrElasticSearch寻找 * 分页 * 时,发现两者都有同样的“问题”(深度分页,尤其是碎片)。尽管这两个搜索引擎都提供了解决方案/变通方法:

*请求:cursorhttps://cwiki.apache.org/confluence/display/solr/Pagination+of+Results
*ElasticSearch:scroll http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-scroll.html#scroll-search-context

现在我读了这些网页,并在网上搜索,但我仍然有一点线索在某些点:
1.cursor/scroll逾时(内存回收):
1.Solr文档似乎没有提供设置超时的方法(或者一些特殊的查询来使cursor令牌无效)。这基本上只是一个关于可能的内存泄漏等问题。
1.ElasticSearch通过scroll=1m提供超时设置。
1.向后分页:
1.Solr将为每个请求提供一个cursor令牌,因此可以访问前面的任何页面。
1.ElasticSearch似乎总是使用相同的scroll标记。因此,如果不重新搜索,我将无法返回?
1.更改搜索查询:
1.ElasticSearch明确要求对scroll查询(http://localhost:9200/_search/scroll?scroll=1m?scroll_id=...)使用特殊的URL。因此不可能更改搜索查询。
1.Solrcursor标记附加到普通查询。这是否意味着,我可以使用一些cursor标记并更改查询(过滤器、排序、页面大小等)?
1.使用scroll/cursor时索引更改
1.Solr文档说明,如果 * 文档1的排序值更改为位于光标位置之后,则文档将返回给客户端两次 。这对我来说很清楚。但现在还有两个问题没有解决:
1.如果我对 page 2 使用cursor标记(其中 document 1 在排序值更改之前),会发生什么情况?我会看到旧的项(包括 document 1),还是会看到包含新计算文档的新生成页面?
1.基本上和以前一样的问题:Solr文档说明:
文档17的排序值已更改,因此它位于光标位置之前,该文档已被“跳过”,并且不会在光标继续前进时返回到客户端 。如果使用旧的cursor令牌,是否能够检索 * 文档17?或者,如果使用当前的cursor令牌序列,它是否永远消失了?
1.ElasticSearch文档没有提到在使用scroll时如果索引发生变化会发生什么。我可以想象它的行为与Solr相同,因为两者都使用Lucene来实现该功能。但是我完全不确定,因为没有关于该场景的信息。

*这怎么可能比简单的size=10&from=10/rows=5&start=0更快?

更多的技术问题,只是因为我想了解引擎盖下发生了什么。

  • 我只是想知道(尤其是)Solr如何能比使用startrows的普通分页更高效地完成这个cursor的事情。原因:(如上所述)如果一个文档发生了变化,它将得到重新索引,并可以放置在当前cursor之后/之前。在我看来,这就像它必须对所有文档重新排序一样。这基本上与默认的分页相同!?

编辑:

*ElasticSearch文档指出 “滚动搜索会及时获取快照-在发出初始搜索请求后,它看不到对索引所做的任何更改。它通过保留旧的数据文件来实现这一点,这样它就可以保留索引在启动时的“视图”。" 因此,仍然存在一个问题:Solr是如何处理的?

如果有人能给予我解释一下事情是如何运作的,那就太好了。
提前感谢!:)

lokaqttq

lokaqttq1#

Solr的cursorstart的功能都类似于开放式范围查询,其中cursor的操作类似于对score的小于范围查询,而start的操作类似于对rank的大于范围查询。cursor的速度更快(特别是对于深度分页),因为对于10的页面大小,它只需要在存储器中保存和排序最多前10个结果,而start=N必须保存在内存中,并对前N + 10个结果进行排序,其中N对于每个后续页增加10。这两种方法都对分页期间的索引修改敏感,因为每个查询都针对索引的当前状态运行。
Elasticsearch的scroll功能类似于一个单次使用的只进线性扫描,通过一个固定查询的结果快照,保证每个文档只返回一次。它不受索引修改的影响,因为Elasticsearch通过在滚动上下文活跃时保留包含不可变段的文件,记住了在创建“滚动上下文”时与索引关联的所有文档。为了避免滚动上下文所引用的旧段文件积累起来,而这些文件将永远不会再被使用(可能是因为客户端崩溃),滚动上下文在指定的持续时间后过期。我的猜测是,Elasticsearch既不支持跳转到任意页面,也不支持为了优化滚动效率而修改查询。
您可以在Elasticsearch中使用一个开放式范围查询来部分模拟Solr的cursor的行为,其中上/下界设置为上一批结果的最后一个值。

相关问题