最近开始对全文检索比较感兴趣了,所以就了解了一下lucene框架,发现上手还是很简单的,也很容易理解。
个人使用lucene只是做了一下基础的实践,主要是为了理解这个全文检索框架。
首先,借用百度百科的一段话介绍一下这个框架:
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。
了解了lucene之后,为了更加理解很更快的上手,最好需要了解一下他的原理。
lucene做全文检索是主要是分为两大部分:
第一是建立索引;
第二是搜索索引。
总之,就是围绕着索引来进行的。作为入门程序,我选择的是先理解lucene的创建索引过程,我个人的理解,创建索引主要是分为四个过程:创建IndexWrite、添加Document、写入Document、关闭IndexWrite
看代码:
private static IndexWriter writer;
static{
try {
writer = new IndexWriter(getDirectory(), getIndexWriterConfig());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static Directory getDirectory() throws IOException{
return FSDirectory.open(Paths.get(SysConstant.LUCENE_INDEX_DIR));
}
private static IndexWriterConfig getIndexWriterConfig(){
return new IndexWriterConfig(new StandardAnalyzer());
}
/**
* @Title: createIndex
* @Description: 创建索引
* @param @param datas 需要索引的参数
* @param @throws IOException 参数
* @return void 返回类型
* @throws
*/
public static void createIndex(List<Map<String ,Object>> datas) throws IOException{
for(Map<String ,Object> data : datas){
Document doc = new Document();
Set<String> keys = data.keySet();
for(String key : keys){
doc.add(new TextField(key, data.get(key).toString(), Field.Store.YES));
}
System.err.println("已经添加索引"+doc.get("name"));
writer.addDocument(doc);
}
close();
}
private static void close() throws IOException{
writer.commit();
if(writer != null){
writer.close();
}
}
注意:我这里创建索引使用的是一个Map作为参数,map的key为Field的name,值为Field的content,这是我个人在项目中使用的一个小技巧。