Ben*_*n M 14 lucene pagination solr cursor elasticsearch
事实证明,在寻找与Solr和ElasticSearch的分页时,两者都有相同的"问题"(深度分页,尤其是分片).虽然两个搜索引擎都为此提供了解决方案/解决方法:
Solr: https :cursor
//cwiki.apache.org/confluence/display/solr/Pagination+of+Results
ElasticSearch: http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-scroll.html#scroll-search-contextscroll
现在我读了那些页面并搜索了互联网,但在某些方面我仍然有点无能为力:
cursor
/ scroll
timeouts(垃圾收集):
cursor
令牌无效)的方法.这基本上只是关于可能的内存泄漏等的问题.scroll=1m
.向后分页:
cursor
每个请求提供令牌,因此可以访问任何以前的页面.scroll
标记.所以,如果不进行新的搜索,我不能倒退?更改搜索查询:
scroll
查询(http://localhost:9200/_search/scroll?scroll=1m?scroll_id=...
)使用特殊URL .所以不可能改变搜索查询.cursor
令牌附加到普通查询.这是否意味着,我可以使用一些cursor
令牌并更改查询(过滤器,排序,页面大小等)?使用scroll
/时索引更改cursor
:
Solr文档说,如果文档1的排序值发生变化,使其位于光标位置之后,则文档将返回给客户端两次.这对我来说很清楚.但现在又有两个问题没有涉及:
cursor
令牌(文档1在排序值更改之前)会发生什么?我会看到旧项目(包括文档1)还是会看到新生成的页面,其中包含新编计的文档?cursor
令牌,我能够检索文档17吗?或者在使用当前cursor
令牌序列时它是否永远消失了?ElasticSearch文档没有说明如果索引在使用时发生变化会发生什么scroll
.我可以想象它的行为与Solr相同,因为它们都使用Lucene来实现这一功能.但我完全不确定,因为没有关于这种情况的信息.
这怎么可能比简单的快size=10&from=10
/ rows=5&start=0
?
更有点技术问题,仅仅因为我想了解幕后发生的事情.
cursor
比使用start
和更正常的分页更有效率rows
.原因:(如上所述)如果文档发生变化,它将获得reindex并可以放在当前之后/之前cursor
.这对我来说听起来像是要重新排序所有文件.这与默认的分页基本相同!?如果有人能给我一些解释,那会很有用.
提前致谢! :)
Solrcursor
和start
两者的功能都类似于开放式范围查询,其操作类似于Scorecursor
上的小于范围查询,并且类似于Rank上的大于范围查询。更快(特别是对于深度分页),因为对于页面大小为 10 的情况,它只需要保存在内存中并最多排序前 10 个结果,而必须保存在内存中并对前 N + 10 个结果进行排序,其中 N 增加后续每页增加 10。两者都对分页期间的索引修改敏感,因为每个查询都针对索引的当前状态运行。start
cursor
start=N
弹性搜索的scroll
功能就像通过固定查询结果的快照进行一次性只进线性扫描,保证每个文档恰好返回一次。它不受索引修改的影响,因为 Elasticsearch 通过在滚动上下文处于活动状态时保留包含的不可变段文件来记住创建“滚动上下文”时与索引关联的所有文档。为了避免积累由滚动上下文引用的旧段文件,这些文件将永远不会再次使用(可能是因为客户端崩溃),滚动上下文会在指定的时间段后过期。我的猜测是,Elasticsearch 既不支持跳转到任意页面,也不支持更改查询以优化滚动效率。
您可以使用开放式范围查询来部分模拟 Elasticsearch 中 Solr 的行为cursor
,其中上限/下限设置为上一批结果的最后一个值。
归档时间: |
|
查看次数: |
1695 次 |
最近记录: |