28

我执行了一些查询,例如"Address:Jack*". 它numFound = 5214在结果页面中显示和显示 100 个文档(我将默认显示结果从 10 更改为 100)。

我怎样才能得到所有的文件。

4

8 回答 8

38

我记得自己在做&rows=2147483647

2,147,483,647 是整数的最大值。我记得曾经使用过一个比那个更大的数字并且有一个 NumberFormatException,因为它不能被解析成一个 int。我不知道他们现在是否使用 Long,但 20 亿行通常绰绰有余。

小提示:
如果您打算在生产中执行此操作,请小心。如果您执行 * : * 之类的查询并且您的索引很大,您可以在该查询中传输几千兆字节。
如果您知道您不会有很多文档,请继续使用整数的最大值。

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

于 2012-04-09T22:34:27.090 回答
7

不要使用 &rows=2147483647

不要在生产中使用 Integer.MAX_VALUE(2147483647) 作为行的值。即使您的结果集很小,这也会大大减慢您的查询速度,因为 solr 预先分配了这个大小的队列。见https://issues.apache.org/jira/browse/SOLR-7580

我强烈建议使用 Deep Paging。

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

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

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

现在我们谈论的是Deep Paging

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

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;
}
于 2017-04-27T09:17:25.337 回答
6

返回所有结果从来都不是一个好的选择,因为它的性能会很慢。
你能提到你的用例吗?

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

于 2012-04-06T06:39:14.713 回答
3

您应该首先创建一个如下所示的 SolrQuery 并设置要批量获取的文档数量。

int lastResult=0; //this is for processing the future batch

String query = "id:[ lastResult TO *]"; // just considering id for the sake of simplicity

SolrQuery solrQuery = new SolrQuery(query).setRows(500); //setRows will set the required batch, you can change this to whatever size you want.

SolrDocumentList results = solrClient.query(solrQuery).getResults(); //execute this statement

在这里,我正在考虑一个按 id 搜索的示例,您可以将其替换为要搜索的任何参数。

“lastResult”是您可以在执行前 500 条记录后更改的变量(500 是批量大小),并将其设置为从结果中获得的最后一个 id。

这将帮助您从上一批的最后一个结果开始执行下一批。

希望这可以帮助。如果您需要任何澄清,请在下面发表评论。

于 2016-07-29T19:34:36.620 回答
0

对于通过 Solarium php 客户端选择 dismax/edismax 中的所有文档,正常的查询语法:不起作用。要选择所有文档,请将日光浴室查询中的默认查询值设置为空字符串。这是必需的,因为 Solarium 中的默认查询是:。还将替代查询设置为:。Dismax/eDismax 普通查询语法不支持:,但替代查询语法支持。

更多详情可参考以下书籍

http://www.packtpub.com/apache-solr-php-integration/book

于 2013-12-18T07:36:27.923 回答
0

正如其他答案指出的那样,您可以将行配置为最大整数以返回查询的所有结果。我建议尽管使用分页的 Solr 功能,并构建一个函数,该函数将使用 cursorMark API 为您返回所有结果。它的要点是将 cursorMark 参数设置为'*',设置页面大小(rows 参数),并且在每个结果上,您将获得下一页的 cursorMark,因此您只使用 cursorMark 执行相同的查询从最后的结果给出。通过这种方式,您可以更灵活地以更高效的方式返回多少结果。

于 2016-07-30T21:57:37.417 回答
0

我处理问题的方法是运行两次查询:

// Start with your (usually small) default page size
solrQuery.setRows(50); 
QueryResponse response = solrResponse(query);
if (response.getResults().getNumFound() > 50) {
    solrQuery.setRows(response.getResults().getNumFound()); 
    response = solrResponse(query);
}

它对 Solr 进行了两次调用,但会为您提供所有匹配的记录……但性能损失很小。

于 2018-06-02T01:03:40.380 回答
-3

query.setRows(Integer.MAX_VALUE); 为我工作!

于 2014-08-20T15:20:51.727 回答