Java Solr/Solrj分页
我正在创建一个web应用程序,使用solr和solrj来实现索引和搜索功能。我的请求处理程序在solrconfig.xml中配置如下:Java Solr/Solrj分页,java,solr,lucene,solrj,Java,Solr,Lucene,Solrj,我正在创建一个web应用程序,使用solr和solrj来实现索引和搜索功能。我的请求处理程序在solrconfig.xml中配置如下: <requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <str name="start">0</st
<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>
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);
三个print语句都显示为null。我知道每个“get”都有一个对应的“set”,但我可以想象它们已经通过solrconfig.xml中的响应处理程序进行了设置。有人能给我一些提示吗?在服务器上执行查询之前,客户端不会知道您在服务器端设置了什么,对吗?因此,它们都为空也就不足为奇了 要实现分页,您需要来自客户端的两个参数—页码和每页的项目数。获得这两个参数后,可以在客户端构建SolrQuery,如下所示:
<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>
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);
正如@arun在他的回答中所说,“客户端不会知道您在服务器端设置了什么”。所以不要惊讶它们是空的。另一方面,我要提醒您在某些情况下可能出现分页问题 当您需要阅读的文档很少时,分页是一件简单的事情,您所要做的就是使用
start
和行
参数
因此,对于每页需要50个结果的客户机,请求第1页
使用start=0和rows=50。第二页是开始=50行,第三页是开始=50行
开始=100行和行数=50行,等等…。但是为了让Solr知道哪50个文件
要从任意点N开始返回,它需要建立一个
匹配查询的前N+50个已排序文档的内部队列,
这样它就可以扔掉前N个文档,并返回
剩下的50人。这意味着需要返回的内存量
分页结果随“开始”参数的增加而线性增长
如果你有很多文件,我的意思是数十万甚至几百万,这不是一个可行的方法这类事情可能会让solr服务器屈服 对于向用户显示搜索结果的典型应用程序, 这往往不是什么大问题,因为大多数用户并不在意 关于深入搜索搜索结果的前几页 -但是对于那些想要处理所有数据的自动化系统来说 与查询匹配的文档,可能会严重禁止
这意味着,如果你有一个网站,并且寻呼搜索结果,一个真正的用户不会走得更远,但另一方面考虑如果蜘蛛或刮板试图读取所有的网站页面会发生什么。现在我们讨论的是深度分页
我建议您阅读这篇精彩的文章: 并查看此文档页面: 下面是一个例子,试图解释如何使用游标分页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;
}
这是有道理的。感谢您的回复。我们应该如何实施
pageNum
和numItemsPerPage
?@Ali19033,这取决于您的要求。通常,numItemsPerPage
设置为10,每页显示10个结果pageNum
对于初始结果将为1,然后您将从那里进入后续页面。@arun那么我应该在controller中创建一个函数,在视图中创建动态分页按钮吗?或者如何为每个页面创建按钮?