Mau*_*fer 21
?q=something&rows=10&start=20
Run Code Online (Sandbox Code Playgroud)
将从文件20开始为您提供10份文件.
关于从MySQL获取其他信息,您可以自己动手.我和其他人已经建议您将所有内容存储在Solr中以避免对MySQL的其他查询.
Pau*_*een 11
可能有点老问题和许多有用的答案和建议,但我会尝试总结结果并描述使用游标分页大数据集的解决方案,因为.我最近遇到了这个问题.
由于通过提到Yonik的平常的问题start/ rows是,当我们有大量的数据可能和start有点进一步(更多进一步的大于零),我们在效率和内存方面很好的开销.这是因为从500K记录的"中间" 获取20个文档+使用排序,至少需要对所有数据集进行排序(内部唯一的排序).而且,如果搜索是分发的,那将更加消耗资源.应将每个分片的数据集(500 020行)返回到要合并的聚合器节点,以找出适用的20行.
Solr无法首先确定哪个匹配文档是排序顺序的999001st结果,而不首先确定第一个999000匹配排序结果是什么.
这里的解决方案是使用Solr cursorMark.
在第一个查询中,您宣布了&cursorMark=*.这意味着下一个:
您可以认为这类似于
start=0告诉Solr" 从我的排序结果的开始处开始 ",除了它还告诉Solr您想要使用Cursor.
!这里的一个"警告"是你的sort子句必须包含uniqueKey字段.id如果它是唯一的,它可以是字段.
第一个查询的一部分将如下所示:
?sort=price desc,id asc&start=0&cursorMark=* ...
Run Code Online (Sandbox Code Playgroud)
结果您将收到下一个结构
{
"response":{"numFound":20,"start":0,"docs":[ /* docs here */ ]},
"nextCursorMark":"AoIIRPoAAFBX" // Here is cursor mark for next "page"
}
Run Code Online (Sandbox Code Playgroud)
要检索下一页,下一个查询将显示下一个:
?sort=price desc,id asc&start=0&cursorMark=AoIIRPoAAFBX ...
Run Code Online (Sandbox Code Playgroud)
请注意上cursorMark一个响应.因此,您将获得下一页结果(与第一个响应相同的结构,但具有另一个nextCursorMarker值).等等 ...
这种方法理想地适用于无限滚动分页,但是在经典分页中使用它有一些事情要考虑:).
以下是我发现的一些解决这个问题的参考资料,希望它能帮助某人完成它.
看看IBM.也许这会让你走上正确的道路.
结果数:指定要返回的最大结果数.
开始:在结果集中开始的偏移量.这对于分页很有用.
所以你可能想要一些变化
<str name="rows">10</str>
<str name="start">0</str>
Run Code Online (Sandbox Code Playgroud)
您的solr客户端应该提供一些方法来获得结果总数而不会有太多麻烦.