我执行了一些查询,例如“地址:杰克*”。它显示numFound = 5214并在结果页面中显示100个文档(我将默认显示结果从10更改为100)。我怎样才能获得所有文件。
提前致谢...
答案 0 :(得分:34)
我记得自己在做& rows = 2147483647
2,147,483,647是整数的最大值。我记得使用一个大于一次的数字并且有一个NumberFormatException,因为它无法解析为int。我不知道他们现在是否使用Long,但通常绰绰有余20亿行。
小记:
如果您打算在生产中这样做,请小心。如果您执行类似*:*的查询并且您的索引很大,则可以在该查询中传输几千兆字节。
如果您知道自己没有多少文档,请继续使用整数的最大值。
另一方面,如果您正在执行一次性脚本并且只需要转储所有结果(例如文档ID),那么这种方法是有效的,如果您不介意等待3-5分钟以便返回查询。
答案 1 :(得分:7)
返回所有结果绝不是一个好选择,因为它的性能会很慢 你能提一下你的用例吗?
此外,Solr rows参数可帮助您调整要返回的结果数 但是,我认为没有办法调整行以返回所有结果。它不需要-1作为值 因此,您需要为要返回的所有结果设置一个较高的值。
答案 2 :(得分:3)
我建议使用Deep Paging。
简单分页很简单,只需要阅读的文档很少,而您只需要使用start
和rows
参数即可。但是如果你有很多文件,我的意思是数十万甚至数百万,这不是一种可行的方法。
这是可以让你的Solr服务器瘫痪的事情。
对于向人类用户显示搜索结果的典型应用程序, 由于大多数用户不关心,这往往不是什么大问题 关于浏览搜索结果的第一页 - 但对于想要处理所有数据的自动化系统 与查询匹配的文档,可能会非常令人望而却步。
这意味着如果您有一个网站并且正在分页搜索结果,那么真正的用户就不会那么进一步,但另一方面考虑如果蜘蛛或刮刀试图读取所有网站页面会发生什么。
现在我们谈论的是 Deep Paging 。
我建议阅读这篇惊人的文章:
并查看此文档页面:
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普通查询语法不支持:,但替代查询语法可以。
有关详细信息,请参阅本书
答案 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的); 适合我!!