您的位置:首页 > 编程语言 > Java开发

使用lucene4.6进行排序时报错:java.lang.IllegalArgumentException: after must be a FieldDoc; got doc=411 score=1

2017-06-08 16:35 555 查看
我的lucene 4.6的分页、排序代码是:

private ScoreDoc getLastScoreDoc(int pageNum,int pageRecord,Query query,IndexSearcher searcher,Sort sort) throws IOException {
if(pageNum==1)return null;//如果是第一页就返回空
int num = pageRecord*(pageNum-1);//获取上一页的最后数量
TopDocs tds = searcher.search(query, num,sort);
return tds.scoreDocs[num-1];
}

/**
* 标题查询匹配的分页数据
* @param query
* @param pageNum
* @param pageRecord
* @return Page 单页Page对象
*/
public Page singleSearchPageByAfter(String queryStr,int pageNum,int pageRecord) {
List<WenDu> pagelist=null;
Page page=null;
try {
Directory directory = FSDirectory.open(new File(indexdir));
IndexReader reader = IndexReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(Version.LUCENE_46,"titlename",analyzer);
Query query = parser.parse(queryStr);
//排序对象Sort 'sorttime'是索引中用于排序的字段名,第二个参数是指定该字段的类型
Sort sort=new Sort(new SortField("sorttime", Type.INT,true));
//1获取上一页的最后一个元素 带排序(记得跟searchAfter方法一样将排序对象传入)
ScoreDoc lastSd = getLastScoreDoc(pageNum, pageRecord, query, searcher,sort);

//通过最后一个元素去搜索下一页的元素
/*TopDocs tds = searcher.searchAfter(lastSd,query, pageRecord);*/
//2 通过最后一个元素去搜索下一页的元素,带排序(记得跟getLastScoreDoc方法一样将排序对象传入)
TopDocs tds=searcher.searchAfter(lastSd, query, pageRecord, sort);
int totalRecord=tds.totalHits;
System.out.println("总记录数===="+totalRecord);
pagelist=new ArrayList<WenDu>();
page=new Page(pageNum, totalRecord, pageRecord);
for(ScoreDoc sd:tds.scoreDocs) {
Document doc = searcher.doc(sd.doc);
WenDu bean = new WenDu();
bean.setTitlename(doc.get("titlename"));
bean.setContent(doc.get("content"));
bean.setAuthor(doc.get("author"));
bean.setNpname(doc.get("npname"));
bean.setPubname(doc.get("pubname"));
bean.setPdf(doc.get("pdf"));
bean.setSorttime(Integer.parseInt(doc.get("sorttime")));
pagelist.add(bean);
}
page.setList(pagelist);
} catch (IOException e) {
e.printStackTrace();
}catch (Exception e) {

4000
e.printStackTrace();
}
System.out.println(page);
return page;
}文中的红色部分是我原先没有写到方法参数里面去的,因此会报如下错:
java.lang.IllegalArgumentException: after must be a FieldDoc; got doc=411 sc.....

问题原因就是:上下一页的分页数据排序是相关的,所以都需要传入sort对象

解决:不管是上一页的indexSearch.search()方法,还是下一页的IndexSearch.searchAfter()方法,需要同时加入排序对象参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐