如何使用Solr管理"分页"?

4 php java mysql sql solr

我有一个分类广告网站...我让Solr搜索分类广告,然后返回ID:nrs然后我用它来放入一个数组.然后我使用这个数组在MySql db中查找任何分类,其中ID:s匹配Solr返回的数组中的ID:s.

现在,因为这个数组可能非常大(100个记录或更多),所以我需要"分页"结果,这样一次可能返回100个.然后在MySql中使用这100个ID:s来查找分类.

那么,是否可以使用SOLR进行寻呼?

如果是这样,怎么样?我需要示例代码......结果会是什么样的.

我大多需要一个彻底的例子!

谢谢

Mau*_*fer 21

使用startrows参数管理分页,例如:

?q=something&rows=10&start=20
Run Code Online (Sandbox Code Playgroud)

将从文件20开始为您提供10份文件.

关于从MySQL获取其他信息,您可以自己动手.我和其他人已经建议您将所有内容存储在Solr中以避免对MySQL的其他查询.

  • @Zak:你为什么认为他需要交易访问?如果使用正确,Solr可以作为许多应用程序的主数据存储区正常工作.像往常一样,使用正确的工具来完成工作. (6认同)
  • 我不会downvote,但如果需要任何类型的事务访问,使用solr作为主数据存储区可能是一个糟糕的选择.Solr是一个搜索服务器...将所有数据放在那里进行搜索和查看是有意义的,但这并不意味着不存在必须来自并转到数据库的事务数据. (5认同)

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).等等 ...

这种方法理想地适用于无限滚动分页,但是在经典分页中使用它有一些事情要考虑:).

以下是我发现的一些解决这个问题的参考资料,希望它能帮助某人完成它.


jas*_*bar 5

看看IBM.也许这会让你走上正确的道路.

结果数:指定要返回的最大结果数.

开始:在结果集中开始的偏移量.这对于分页很有用.

所以你可能想要一些变化

<str name="rows">10</str>
<str name="start">0</str>
Run Code Online (Sandbox Code Playgroud)

您的solr客户端应该提供一些方法来获得结果总数而不会有太多麻烦.

  • 如果你正在做一些深度分页,你可能想要检查[Solr游标](https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results)以获得更好的性能(它们不像sql那样邪恶游标!:) (2认同)