如何从solr查询中获取所有结果?

SEN*_*NAN 24 solr

我执行了一些查询,如"地址:杰克*".它显示numFound = 5214并在结果页面中显示100个文档(我将默认显示结果从10更改为100).我怎样才能获得所有文件.

提前致谢...

Fer*_*lva 36

我记得自己在做&rows = 2147483647

2,147,483,647是整数的最大值.我记得使用一个大于一次的数字并且有一个NumberFormatException,因为它无法解析为int.我不知道他们现在是否使用Long,但通常绰绰有余20亿行.

小记:
如果你打算在生产中这样做,要小心.如果您执行类似*:*的查询并且您的索引很大,则可以在该查询中传输几千兆字节.
如果您知道自己没有很多文档,请继续使用整数的最大值.

另一方面,如果您正在执行一次性脚本并且只需要转储所有结果(例如文档ID),那么这种方法是有效的,如果您不介意等待3-5分钟以便返回查询.

  • 不要将Integer.MAX_VALUE(2147483647)用作生产中行的值.即使您的结果集很小,这也会严重降低查询速度,因为solr会以此大小预先分配队列.请参阅https://issues.apache.org/jira/browse/SOLR-7580 (6认同)
  • 危险的。仅对少量文档执行此操作。 (3认同)

Jay*_*dra 7

返回所有结果永远不是一个好的选择,因为它的性能会非常慢.
你能提一下你的用例吗?

此外,Solr rows参数可帮助您调整要返回的结果数.
但是,我认为没有办法调整行以返回所有结果.它不需要-1作为值.
因此,您需要为要返回的所有结果设置一个较高的值.


fre*_*dev 7

我建议使用深度分页。

当您要阅读的文档很少并且您所要做的就是使用startrows参数时,简单分页是一件容易的事情。但是当你有很多文件时,这不是一个可行的方法,我的意思是几十万甚至几百万。
这种事情可能会让您的 Solr 服务器瘫痪。

对于向人类用户显示搜索结果的典型应用程序,这往往不是什么大问题,因为大多数用户并不关心深入搜索结果的前几页——但对于想要处理有关数据的自动化系统匹配查询的所有文档,这可能会严重禁止。

这意味着,如果您有一个网站并且正在对搜索结果进行分页,那么真正的用户不会走得更远,但另一方面要考虑如果蜘蛛或抓取工具尝试阅读所有网站页面会发生什么。

现在我们正在谈论深度分页

我建议阅读这篇精彩的文章:

https://lucidworks.com/post/coming-soon-to-solr-efficient-cursor-based-iteration-of-large-result-sets/

并查看此文档页面:

https://solr.apache.org/guide/pagination-of-results.html

这是一个尝试解释如何使用游标进行分页的示例。

SolrQuery solrQuery = new SolrQuery();
solrQuery.setRows(500);
solrQuery.setQuery("*:*");
solrQuery.addSort("id", ORDER.asc);  // Pay attention to this line
String cursorMark = CursorMarkParams.CURSOR_MARK_START;
boolean done = false;
while (!done) {
    solrQuery.set(CursorMarkParams.CURSOR_MARK_PARAM, cursorMark);
    QueryResponse rsp = solrClient.query(solrQuery);
    String nextCursorMark = rsp.getNextCursorMark();
    for (SolrDocument d : rsp.getResults()) {
            ... 
    }
    if (cursorMark.equals(nextCursorMark)) {
        done = true;
    }
    cursorMark = nextCursorMark;
}
Run Code Online (Sandbox Code Playgroud)