使用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()方法,需要同时加入排序对象参数。
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()方法,需要同时加入排序对象参数。
相关文章推荐
- java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
- java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
- 20_ java.lang.IllegalArgumentException: Service Intent must be explicit异常说明
- java.lang.IllegalArgumentException: parameter must be a descendant of this view
- [Android] View.setTag(key,Object) (java.lang.IllegalArgumentException: The key must be an application-specific resource id.)
- java.lang.IllegalArgumentException: Service Intent must be explicit
- [异常整理]java.lang.IllegalArgumentException: Attribute value must not be null
- Caused by: java.lang.IllegalArgumentException: Original must not be null
- 错误 java.lang.IllegalArgumentException: parameter must be a descendant of this view 的解决方案
- Android java.lang.IllegalArgumentException: parameter must be a descendant of this view
- java.lang.IllegalArgumentException: Window type can not be changed after the
- 使用android OpenGL时出现的java.lang.IllegalArgumentException: Must use a native order direct Buffer错误问题解决
- android L java.lang.IllegalArgumentException: Service Intent must be explicit隐式意图找不到错误解决
- Bitmap.createBitmap参数异常之java.lang.IllegalArgumentException: width and height must be > 0
- java.lang.IllegalArgumentException: Service Intent must be explicit解决方法
- 【Caused by: java.lang.IllegalArgumentException: Original must not be null 】
- java.lang.IllegalArgumentException: At least one handler method must be found in class [class SayThr
- java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
- java.lang.IllegalArgumentException: Object returned from onCreateLoader must not be a non-static inn
- android之“java.lang.IllegalArgumentException: Window type can not be changed after the window is add”