5. 利用Lucene进行检索
5.1 一段简单的检索代码
//需要捕捉IOException,ParseException异常
//处理检索条件
Query query = QueryParser.parse("入门", "text", analyzer);
//检索
Searcher searcher = new IndexSearcher("./index");//"index"指定索引文件位置
Hits hits = searcher.search(query);
//打印结果值集
for (int i = 0; i < hits.length(); i++) {
doc = hits.doc(i);
String id = doc.get("id");
System.out.println("found " + "入门" + " on the id:" + id);
}
5.2 利用Lucene的检索接口
5.2.1 Query与QueryParser
主要使用方法:
QueryParser .parse(String query, String field, Analyzer analyzer),例如:
Query query = QueryParser.parse("入门", "text", analyzer);
"入门"为检索词, "text"为检索的字段名, analyzer为分析器
5.2.2 Hits与Searcher
Hits的主要使用接口:
接口名 |
备注 |
Doc(int n) |
返回第n个的文档的所有字段 |
length() |
返回这个集中的可用个数 |
6. Lucene的其他使用
6.1 Lucene 的索引修改
下面给出一段修改索引的代码,请根据Lucene的API解读:
/**
* 对已有的索引添加新的一条索引
* @param idStr String:要修改的id
* @param doc Document:要修改的值
*/
public void addIndex(String idStr, String valueStr) {
StandardAnalyzer analyzer = new StandardAnalyzer();
IndexWriter writer = null;
try {
writer = new IndexWriter(indexPath, analyzer, false);
writer.mergeFactor = 2; //修正lucene 1.4.2 bug,否则不能准确反映修改
Document doc = new Document();
doc.add(Field.UnIndexed("id", idStr));//“id”为字段名,“1”为字段值
doc.add(Field.Text("text", valueStr));
writer.addDocument(doc);
writer.optimize();
writer.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
/**
* 删除索引
*
* @param idStr String
*/
public void deleteIndex(String idStr) {
try {
Directory dirt = FSDirectory.getDirectory(indexPath, false);
IndexReader reader = IndexReader.open(dirt);
IndexXML.deleteIndex(idStr, reader);
reader.close();
dirt.close();
}
catch (IOException ioe) {
ioe.printStackTrace();
}
}
6.2 Lucene 的检索结果排序
Lucene的排序主要是对org.apache.lucene.search.Sort的使用。Sort可以直接根据字段Field生成,也可以根据标 准的SortField生成,但是作为Sort的字段,必须符合以下的条件:唯一值以及Indexed。可以对Integers, Floats, Strings三种类型排序。
对整数型的ID检索结果排序只要进行以下的简单操作:
Sort sort = new Sort("id");
Hits hits = searcher.search(query, sort);
用户还可以根据自己定义更加复杂的排序,详细请参考API。
7 总结
Lucene给java的全文索引检索带来了非常强大的力量,以上仅对Lucene进行简单的入门说明。
参考资料:
1. Overview (Lucene 1.4-final API)
2. 车东 《在应用中加入全文检索功能--基于JAVA的全文索引引擎Lucene简介》