paip.lucene 4.3 中文语义搜索最佳实践

时间:2021-03-17 04:20:12

paip.lucene 4.3 中文语义搜索最佳实践









首先一个问题是要不要使用lucene 自带的分词器...我觉得最好不使用哪自带的分词器.效果还凑火,就是不好控制...





先使用ik,ict,mmsj等分词器进行分词..





然后使用WhitespaceAnalyzer 建立索引...再使用它进行搜索...注意,建立索引以及搜索使用的Analyzer要一样才行..





要是使用StandardAnalyzer,不个单字也分割开兰,后期过滤麻烦...









作者Attilax  艾龙,  EMAIL:1466519819@qq.com 

来源:attilax的专栏

地址:http://blog.csdn.net/attilax









-----------------建立索引

try {

//索引文件的保存位置

Directory dir = FSDirectory.open(new File(Constants.INDEX_STORE_PATH));

//分析器

 

 



 Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_40); 

 



//配置类

IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40,analyzer);

iwc.setOpenMode(OpenMode.CREATE);//创建模式 OpenMode.CREATE_OR_APPEND 添加模式



writer = new IndexWriter(dir, iwc);

} catch (Exception e) {

e.printStackTrace();

}





------------搜索

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);

QueryParser parser = new QueryParser(Version.LUCENE_40, field,analyzer);

// 将关键字包装成Query对象

query = parser.parse(keyword);

Date start = new Date();

// 1 根据关键字只取索引库中的前100条document,然后把这100条document按某种方式进行排序,安得分从高到低返回结果。 

TopDocs results = searcher.search(query, 5 * 2);

Date end = new Date();

System.out.println("检索完成,用时" + (end.getTime() - start.getTime())

+ "毫秒");

return results;

} catch (Exception e) {

e.printStackTrace();

return null;

}