lucene 学习笔记-排序

本文介绍了如何使用Lucene进行自定义排序,通过实现ScoreDocComparator和SortComparatorSource接口完成排序功能,并提供了创建索引和搜索排序的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.排序

Lucene有内置的排序用IndexSearcher.search(query,sort)但是功能并不理想。我们需要自己实现自定义的排序。

这样的话得实现两个接口: ScoreDocComparator, SortComparatorSource

用IndexSearcher.search(query,new Sort(new SortField(String Field,SortComparatorSource)));

就看个例子吧:

这是一个建立索引的例子:

public void IndexSort() throws IOException {

IndexWriter writer = new IndexWriter("C:\\\\indexStore",new StandardAnalyzer(),true);

Document doc = new Document();

doc.add(new Field("sort","1",Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add(new Field("sort","4",Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add(new Field("sort","3",Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add(new Field("sort","5",Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add(new Field("sort","9",Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add(new Field("sort","6",Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add(new Field("sort","7",Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

writer.close();
}

//下面是搜索的例子:
public void SearchSort1() throws IOException, ParseException {

IndexSearcher indexSearcher = new IndexSearcher("C:\\\\indexStore");

QueryParser queryParser = new QueryParser("sort",new StandardAnalyzer());

Query query = queryParser.parse("4");

Hits hits = indexSearcher.search(query);

System.out.println("有"+hits.length()+"个结果");

Document doc = hits.doc(0);

System.out.println(doc.get("sort"));
}


public void SearchSort2() throws IOException, ParseException{

IndexSearcher indexSearcher = new IndexSearcher("C:\\\\indexStore");

//这个地方前面没有提到,它是用于范围的Query可以看一下帮助文档.
Query query = new RangeQuery(new Term("sort","1"),new Term("sort","9"),true);

Hits hits = indexSearcher.search(query,new Sort(new SortField("sort",new MySortComparatorSource())));

System.out.println("有"+hits.length()+"个结果");

for(int i=0;i<hits.length();i++) {

Document doc = hits.doc(i);

System.out.println(doc.get("sort"));

}

}


public class MyScoreDocComparator implements ScoreDocComparator{

private Integer[] sort;

public MyScoreDocComparator(String s,IndexReader reader, String fieldname) throws IOException{

sort = new Integer[reader.maxDoc()];

for(int i = 0;i<reader.maxDoc();i++){

Document doc =reader.document(i);

sort[i]=new Integer(doc.get("sort"));

}

}

public int compare(ScoreDoc i, ScoreDoc j){

if(sort[i.doc]>sort[j.doc])

return 1;

if(sort[i.doc]<sort[j.doc])

return -1;

return 0;

}

public int sortType(){

return SortField.INT;

}


public Comparable sortValue(ScoreDoc i){

return new Integer(sort[i.doc]);
}

}


public class MySortComparatorSource implements SortComparatorSource {

private static final long serialVersionUID = -9189690812167655465L;

public ScoreDocComparator newComparator(IndexReader reader, String fieldname)throws IOExceptio{

if(fieldname.equals("sort"))

return new MyScoreDocComparator("sort",reader,fieldname);

return null;

}

}

//SearchSort1()输出的结果没有排序,SearchSort2()就排序了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值