Solr的Cursor和ElasticSearch的Scroll之间的差异

Ben*_*n M 14 lucene pagination solr cursor elasticsearch

事实证明,在寻找与SolrElasticSearch的分页时,两者都有相同的"问题"(深度分页,尤其是分片).虽然两个搜索引擎都为此提供了解决方案/解决方法:

现在我读了那些页面并搜索了互联网,但在某些方面我仍然有点无能为力:

  • cursor/ scrolltimeouts(垃圾收集):

    1. Solr文档似乎没有提供设置超时(或某些特殊查询以使cursor令牌无效)的方法.这基本上只是关于可能的内存泄漏等的问题.
    2. ElasticSearch通过提供超时设置scroll=1m.

  • 向后分页:

    1. Solr将为cursor每个请求提供令牌,因此可以访问任何以前的页面.
    2. ElasticSearch似乎总是使用相同的scroll标记.所以,如果不进行新的搜索,我不能倒退?

  • 更改搜索查询:

    1. ElasticSearch明确要求对scroll查询(http://localhost:9200/_search/scroll?scroll=1m?scroll_id=...)使用特殊URL .所以不可能改变搜索查询.
    2. Solrcursor令牌附加到普通查询.这是否意味着,我可以使用一些cursor令牌并更改查询(过滤器,排序,页面大小等)?

  • 使用scroll/时索引更改cursor:

    1. Solr文档说,如果文档1的排序值发生变化,使其位于光标位置之后,则文档将返回给客户端两次.这对我来说很清楚.但现在又有两个问题没有涉及:

      1. 如果我使用第2页cursor令牌(文档1在排序值更改之前)会发生什么?我会看到旧项目(包括文档1)还是会看到新生成的页面,其中包含新编计的文档?
      2. 基本上和以前一样的问题是:Solr文档说:文档17的排序值发生了变化,使得它位于光标位置之前,文档已被"跳过",并且在光标继续进行时不会返回给客户端.如果我使用旧cursor令牌,我能够检索文档17吗?或者在使用当前cursor令牌序列时它是否永远消失了?

    2. ElasticSearch文档没有说明如果索引在使用时发生变化会发生什么scroll.我可以想象它的行为与Solr相同,因为它们都使用Lucene来实现这一功能.我完全不确定,因为没有关于这种情况的信息.

  • 这怎么可能比简单的快size=10&from=10/ rows=5&start=0
    更有点技术问题,仅仅因为我想了解幕后发生的事情.

    • 我只是想知道(特别是)Solr如何能够cursor比使用start和更正常的分页更有效率rows.原因:(如上所述)如果文档发生变化,它将获得reindex并可以放在当前之后/之前cursor.这对我来说听起来像是要重新排序所有文件.这与默认的分页基本相同!?

编辑:

  • ElasticSearch文档说"滚动搜索会及时拍摄快照 - 在初始搜索请求完成后,它不会看到对索引所做的任何更改.它通过保留旧数据文件来实现这一点,以便它可以保留它对"指数在它开始时的样子"的"观点"." 所以还有一个问题:Solr如何处理这个问题?

如果有人能给我一些解释,那会很有用.

提前致谢! :)

Chr*_*ndt 4

Solrcursorstart两者的功能都类似于开放式范围查询,其操作类似于Scorecursor上的小于范围查询,并且类似于Rank上的大于范围查询。更快(特别是对于深度分页),因为对于页面大小为 10 的情况,它只需要保存在内存中并最多排序前 10 个结果,而必须保存在内存中并对前 N + 10 个结果进行排序,其中 N 增加后续每页增加 10。两者都对分页期间的索引修改敏感,因为每个查询都针对索引的当前状态运行。startcursorstart=N

弹性搜索的scroll功能就像通过固定查询结果的快照进行一次性只进线性扫描,保证每个文档恰好返回一次。它不受索引修改的影响,因为 Elasticsearch 通过在滚动上下文处于活动状态时保留包含的不可变段文件来记住创建“滚动上下文”时与索引关联的所有文档。为了避免积累由滚动上下文引用的旧段文件,这些文件将永远不会再次使用(可能是因为客户端崩溃),滚动上下文会在指定的时间段后过期。我的猜测是,Elasticsearch 既不支持跳转到任意页面,也不支持更改查询以优化滚动效率。

您可以使用开放式范围查询来部分模拟 Elasticsearch 中 Solr 的行为cursor,其中上限/下限设置为上一批结果的最后一个值。