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

时间:2012-04-06 06:07:23

标签: solr

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

提前致谢...

8 个答案:

答案 0 :(得分:34)

我记得自己在做& rows = 2147483647

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

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

我建议使用Deep Paging。

简单分页很简单,只需要阅读的文档很少,而您只需要使用startrows参数即可。但是如果你有很多文件,我的意思是数十万甚至数百万,这不是一种可行的方法。
这是可以让你的Solr服务器瘫痪的事情。

  

对于向人类用户显示搜索结果的典型应用程序,   由于大多数用户不关心,这往往不是什么大问题   关于浏览搜索结果的第一页    - 但对于想要处理所有数据的自动化系统   与查询匹配的文档,可能会非常令人望而却步。

这意味着如果您有一个网站并且正在分页搜索结果,那么真正的用户就不会那么进一步,但另一方面考虑如果蜘蛛或刮刀试图读取所有网站页面会发生什么。

现在我们谈论的是 Deep Paging

我建议阅读这篇惊人的文章:

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

并查看此文档页面:

https://cwiki.apache.org/confluence/display/solr/Pagination+of+Results

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

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;
}

答案 3 :(得分:2)

您应该首先创建一个如下所示的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。

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

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

答案 4 :(得分:0)

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

有关详细信息,请参阅本书

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

答案 5 :(得分:0)

正如其他答案所指出的,您可以将行配置为最大整数,以回退查询的所有结果。 我建议使用Solr feature of pagination,并构建一个函数,使用cursorMark API为您返回所有结果。它的要点是你将cursorMark参数设置为' *',你设置页面大小(行参数),并在每个结果上你得到下一页的cursorMark,所以你仅使用从最后一个结果给出的cursorMark执行相同的查询。通过这种方式,您可以以更高效的方式更灵活地支持您想要的结果。

答案 6 :(得分: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拨打两次电话,但会获得所有匹配的记录....但性能损失很小。

答案 7 :(得分:-3)

query.setRows(Integer.MAX_VALUE的); 适合我!!