如何使用Solr管理“分页”?

时间:2010-02-27 16:43:15

标签: java php sql mysql solr

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

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

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

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

大多数情况下,我需要一个彻底的例子!

由于

5 个答案:

答案 0 :(得分:21)

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

?q=something&rows=10&start=20

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

关于从MySQL获取其他信息,您可以自己动手。我和其他人already suggested to you将所有内容存储在Solr中,以避免对MySQL进行额外的查询。

答案 1 :(得分:11)

可能有点老问题和许多有用的答案和建议,但我会尝试总结结果并描述使用光标分页大数据集的解决方案。我最近遇到了这个问题。

作为mentioned by Yonik,通常start / rows的问题是,当我们拥有大型数据集时,start会更进一步(更进一步)比零,我们在效率和内存方面有很好的开销。这是因为从"中间"中取出 20 文件。 500K 记录+使用排序,至少需要对所有数据集进行排序(排序内部唯一的)。而且,如果搜索是分发的,那将更加消耗资源。应将每个分片的数据集( 500 020行)返回到要合并的聚合器节点,以找出适用的20行。

  

Solr无法首先确定哪个匹配文档是按排序顺序排列的第999001个结果,而不首先确定第一个999000匹配排序结果是什么。

这里的解决方案是使用Solr cursorMark

在第一个查询中,您宣布&cursorMark=*。这意味着下一个:

  

你可以认为这与start=0类似,是告诉Solr" 从我的排序结果开始"除了它还告诉Solr您想要使用Cursor。

一个"警告"这是您的sort子句必须包含uniqueKey 字段。如果它是唯一的,则可以是id字段。

第一个查询的一部分如下所示:

?sort=price desc,id asc&start=0&cursorMark=* ...

结果您将收到下一个结构

{
    "response":{"numFound":20,"start":0,"docs":[ /* docs here */ ]},
    "nextCursorMark":"AoIIRPoAAFBX" // Here is cursor mark for next "page"
}

要检索下一页,下一个查询将会显示:

?sort=price desc,id asc&start=0&cursorMark=AoIIRPoAAFBX ...

请注意先前回复中的cursorMark。结果您将获得下一页结果(与第一个响应相同的结构,但使用另一个nextCursorMarker)。等等...

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

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

答案 2 :(得分:5)

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

  

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

     

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

所以你可能想要一些变化

<str name="rows">10</str>
<str name="start">0</str>

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

答案 3 :(得分:4)

“start”参数控制搜索结果的偏移量,“rows”参数控制从那里返回的文档数量。

如果您正在进行“深度分页”(遍历多个页面),那么使用游标迭代结果集可以获得更好的性能。

答案 4 :(得分:1)

我认为值得一提的是,solr与当前页面一起返回的结果是找到的记录总数。

例如致电:

http://192.168.0.1:8983/solr/select?qt=edismax&fl=*,score&qf=content^2%20metatag.description^3%20title^5%20metatag.keywords^10&q=something&start=20&rows=10&wt=xml&version=2.2

回复是:

<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">1</int>
        <lst name="params">
            <str name="fl">*,score</str>
            <str name="q">something</str>
            <str name="qf">content^2 metatag.description^3 title^5 metatag.keywords^10</str>
            <str name="qt">edismax</str>
            <str name="wt">xml</str>
            <str name="rows">10</str>
            <str name="version">2.2</str>
            </lst>
        </lst>
        <result name="response" numFound="1801" start="0" maxScore="0.15953878">
            <doc>...</doc>
            <doc>...</doc>
            <doc>...</doc>
...

使用solrj,方法查询返回一个SolrDocumentList,它具有以下方法: getNumFound()。