如何从Solr的查询所有结果?(How to get all results from solr q

2019-06-23 10:13发布

我喜欢执行“地址:杰克*”一些查询。 它显示numFound = 5214,并显示在结果页面100页的文档(我改变默认显示的结果从10到100)。 我怎样才能获得的所有文件。

提前致谢...

Answer 1:

I remember myself doing &rows=2147483647

2,147,483,647 is integer's maximum value. I recall using a number bigger than that once and having a NumberFormatException because it couldn't be parsed into an int. I don't know if they use Long nowadays, but 2 billion rows is normally more than enough.

Small note:
Be careful if you are planning to do this in production. If you do a query like * : * and your index is big, you could transferring a couple of gigabytes in that query.
If you know you won't have many docs, go ahead and use integer's max value.

On the other hand, if you are doing a one-time script and just need to dump all results (for example document ID's) then this approach is valid, if you don't mind waiting 3-5 minutes for a query to return.



Answer 2:

返回所有的结果是从来没有像这将是性能很慢一个不错的选择。
那么你可以说你的使用情况?

此外,Solr的行参数可以帮助你调整要返回的结果的数量。
不过,我不认为有一种方法可以调整行返回所有结果。 它并不需要一个-1作为值。
所以,你需要设置一个较高的值要返回所有结果。



Answer 3:

我会建议使用深层寻呼。

简单的分页是一个简单的事情,当你有几个文件阅读和所有你需要做的就是玩startrows参数。 但是,如果你有很多文件,我的意思是几十万甚至上百万,这不是一个可行的办法。
这是什么样的,可以把你的Solr服务器到他们的膝盖的事情。

为了显示搜索结果给人类用户典型应用中,这往往不是太大的问题,因为大多数用户并不关心下钻过去的搜索结果页面的第一少数 - 但对于要紧缩有关数据自动化系统所有匹配查询的文档,也可以是严重望而却步。

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

现在我们讨论的深寻呼的。

我会建议阅读这个惊人的帖子:

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


Answer 4:

你应该做的是先创建如下所示的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从结果中得到。

这将帮助你执行下一批开始与前一批次最后的结果。

希望这可以帮助。 射击,如果你需要任何澄清一个评论如下。



Answer 5:

对于通过日光浴PHP客户选择在dismax / edismax所有文件,正常的查询语法不起作用。 要选择日光浴查询默认查询值设置为空字符串的所有文件。 这是必需的,如日光浴默认查询 还设置了可供选择查询 Dismax / eDismax正常的查询语法不支持:,但可供选择的查询语法呢。

欲了解更多详细信息,下面这本书可以被称为

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



Answer 6:

至于其他的答案中指出,您可以配置行是最大的整数,以产生回所有查询结果。 我会建议虽然使用分页的Solr的功能 ,并构建将返回大家使用cursorMark API结果的功能。 它的要点是你的cursorMark参数设置为“*”,你设置页面大小(行参数),并在每一个结果,你会得到下一个页面cursorMark,让你与cursorMark只执行相同的查询从最后的结果给出。 这样,你就会对你有多大的结果要回来,在一个更高性能的方式更多的灵活性。



Answer 7:

我处理这个问题的方法是通过在运行查询两次:

// 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呼叫两次,但让你所有匹配的记录....用小的性能损失。



Answer 8:

query.setRows(Integer.MAX_VALUE的); 对我的作品!



文章来源: How to get all results from solr query?
标签: solr