我有一个分类广告网站...... 我让Solr搜索分类,然后返回ID:nrs然后我用它来放入一个数组。然后我使用这个数组在MySql db中查找任何分类,其中ID:s匹配Solr返回的数组中的ID:
现在,因为这个数组可能非常大(100个记录或更多),所以我需要“分页”结果,以便一次返回100个。然后在MySql中使用这100个ID:s来查找分类。
那么,是否可以使用SOLR进行寻呼?
如果是这样,怎么样?我需要示例代码......结果会是什么样的。
大多数情况下,我需要一个彻底的例子!
由于
答案 0 :(得分:21)
?q=something&rows=10&start=20
将从文件20开始为您提供10份文件。
关于从MySQL获取其他信息,您可以自己动手。我和其他人already suggested to you将所有内容存储在Solr中,以避免对MySQL进行额外的查询。
答案 1 :(得分:11)
可能有点老问题和许多有用的答案和建议,但我会尝试总结结果并描述使用光标分页大数据集的解决方案。我最近遇到了这个问题。
作为mentioned by Yonik,通常start
/ rows
的问题是,当我们拥有大型数据集时,start
会更进一步(更进一步} em>)比零,我们在效率和内存方面有很好的开销。这是因为从"中间"中取出 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()。