我使用solr和solrj在我正在创建的web应用程序中实现索引和搜索功能。我的请求处理程序在solrconfig.xml中的配置如下:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<str name="start">0</str>
<int name="rows">10</int>
<str name="defType">edismax</str>
<str name="qf">
title^10.0 subtitle^7.0 abstract^5.0 content^1.0 text^1.0
</str>
<str name="pf">
title^10.0 subtitle^7.0 abstract^5.0 content^1.0 text^1.0
</str>
<str name="df">text</str>
</lst>
</requestHandler>现在看来,索引和搜索工作得很好。但是,我想实现分页。配置文件包含"start“和"row”数据。但是,在solrj中,当我运行:
SolrQuery query = new SolrQuery(searchTerm);
System.out.println(query.getRequestHandler());
System.out.println(query.getRows());
System.out.println(query.getStart());这三个print语句都显示为null。我知道每个“set”都有一个对应的“set”,但我认为它们应该已经通过solrconfig.xml中的响应处理程序设置好了。有人能给我提供线索吗?
发布于 2013-06-08 04:57:28
在服务器上执行查询之前,客户端不会知道您在服务器端设置了什么,对吧?所以它们都为空也就不足为奇了。
要实现分页,您需要来自客户端的两个参数-页码和每页的项目数。获得这两个之后,您可以在客户端构建SolrQuery,如下所示:
SolrQuery query = new SolrQuery(searchTerm);
query.setStart((pageNum - 1) * numItemsPerPage);
query.setRows(numItemsPerPage);
// execute the query on the server and get results
QueryResponse res = solrServer.query(solrQuery);发布于 2016-06-06 08:12:28
正如@arun在他的回答中所说的那样,“客户端不会知道您在服务器端设置了什么”。因此,不要对它们是空的感到惊讶。另一方面,我要警告您在某些情况下可能会出现分页问题。
当您要读取的文档很少时,分页是一件很简单的事情,您所要做的就是使用start和rows参数。
因此,对于每页需要50个结果的客户端,使用start=0&rows=50请求页面#1。第2页是start=50&rows=50,第3页是start=100&rows=50,依此类推…。但是,为了让Solr知道从任意点N开始返回哪些50个文档,它需要为匹配查询的第一个N+50排序的文档建立一个内部队列,这样它就可以丢弃前N个文档,并返回剩下的50个文档。这意味着返回分页结果所需的内存量随着起始参数的增加而线性增长。
因此,如果你有很多文档,我的意思是数十万甚至数百万,这不是一个可行的方法。
这类事情可能会让您的solr服务器瘫痪。
对于向人类用户显示搜索结果的典型应用程序,这往往不是什么大问题,因为大多数用户并不关心向下钻取搜索结果的前几页-但对于想要处理与查询匹配的所有文档的数据的自动化系统,这可能是非常令人望而却步的。
这意味着,如果你有一个网站,并且正在分页搜索结果,一个真正的用户不会走得那么远,但从另一方面考虑,如果一个爬行器或抓取器试图读取所有的网站页面,会发生什么。现在我们谈论的是深度分页。
我将建议阅读这篇令人惊叹的帖子:
看看这个文档页面:
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;
}https://stackoverflow.com/questions/16992296
复制相似问题