lucene查询结果需要先分组后排序, 看了相关文档,lucene提供了分组 排序功能,但是比较消耗内容,实际情况是 我们一般只需要前面的1000条, 所以我自己实现了排序算法,尽量少占用内容。
// 分组统计方式
/**
*
* @param topnumber 取分组后的前几条数据
* @return
*/
public static List cachegroup(int topnumber) {
try {
int page = 30000;
String filePath = "D://lucene/index2";
File dirfile = new File(filePath);
Directory dir = FSDirectory.open(dirfile);
IndexReader reader = DirectoryReader.open(dir);
IndexSearcher indexSearcher = new IndexSearcher(reader);
String searchTerm = "aaa";
boolean getScores = true;
boolean getMaxScores = true;
boolean fillFields = true;
GroupingSearch groupingSearch = new GroupingSearch("author");
groupingSearch.setGroupSort(Sort.RELEVANCE);
groupingSearch.setFillSortFields(true);
groupingSearch.setCachingInMB(40.0, true);
groupingSearch.setAllGroups(true);
TermQuery query = new TermQuery(new Term("content", searchTerm));
TopDocs hits = indexSearcher.search(query, 100);
int count = hits.totalHits;
int mode = count % page;
int times = count / page;
if (mode != 0)
times = times + 1;
List indexvalue = new LinkedList();
for (int i = 0; i < times; i++) {
int groupoffset = i * page;
TopGroups<BytesRef> result = groupingSearch.search(
indexSearcher, query, groupoffset, page);
GroupDocs<BytesRef>[] gds = result.groups;
for (GroupDocs<BytesRef> gd : gds) {
indexvalue.add(new FieldSort(gd.totalHits, gd.groupValue
.utf8ToString()));
}
Comparator comp = Collections.reverseOrder();
Collections.sort(indexvalue, comp);
indexvalue = indexvalue.subList(0, topnumber);
}
return indexvalue;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static void readList(List list)
{
Iterator it=list.iterator();
while(it.hasNext())
{
FieldSort fieldsort=(FieldSort)it.next();
System.out.println(fieldsort.getFieldvalue()+"/"+fieldsort.getFieldname());
}
}
package speed;
import java.util.Comparator;
public class FieldSort implements Comparable<FieldSort>{
private int fieldvalue;
private String fieldname;
public FieldSort() {
super();
}
public FieldSort(int fieldvalue,String fieldname) {
super();
this.setFieldvalue(fieldvalue);
this.setFieldname(fieldname);
}
public int getFieldvalue() {
return fieldvalue;
}
public void setFieldvalue(int fieldvalue) {
this.fieldvalue = fieldvalue;
}
public String getFieldname() {
return fieldname;
}
public void setFieldname(String fieldname) {
this.fieldname = fieldname;
}
@Override
public String toString(){
return fieldname+"/"+fieldvalue;
}
public int compareTo(FieldSort t){
if(t==null)return 0;
else{
return this.fieldvalue-t.fieldvalue;
}
}
}