修改了IKAnanlyzer的部分代码,使IKAnanlyzer支持了分词后再把词转换成拼音或者首字母来做索引,IKAznzylzer的作者博客,先感谢他的贡献。
汉字转拼音用到了github上的 jpinyin开源库,感谢作者。
现在只需要IKAnanlyzer4Pinyin,你就可以实现中文分词,分词后全拼和首字母的索引。
主要用在搜索建议,通讯录搜索等需要首字母和全拼搜索的地方。
性能,在我数据测试中,全拼和首字母都建立索引,建索引时间增加了20%。
其中主要使用到了PerFieldAnalyzerWrapper,它可以实现对不同field的使用不用的anaylzer。源代码在github上,上面有完整示例。
建立索引:
//实例化IKAnalyzer分词器
//使用PerFieldAnalyzerWrapper可以对不同的field使用不同的分词器
Map<String, Analyzer> analyzerMap = new HashMap<String, Analyzer>();
analyzerMap.put(quanpin, new IKAnalyzer4PinYin(false, IKAnalyzer4PinYin.PINYIN));
analyzerMap.put(shouzimu, new IKAnalyzer4PinYin(false, IKAnalyzer4PinYin.PINYIN_SHOUZIMU));
PerFieldAnalyzerWrapper wrapper = new PerFieldAnalyzerWrapper(new IKAnalyzer4PinYin(false), analyzerMap);
IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_40 , wrapper);
搜索:Analyzer analyzer = new IKAnalyzer4PinYin(true);
QueryParser qp = new QueryParser(Version.LUCENE_40, fieldName, analyzer);
QueryParser qpQuanpin = new QueryParser(Version.LUCENE_40, quanpin, analyzer);
QueryParser qpShouzimu = new QueryParser(Version.LUCENE_40, shouzimu, analyzer);
Query query = qp.parse(keyword);
Query queryQuanpin = qpQuanpin.parse(keyword);
Query queryShouzimu = qpShouzimu.parse(keyword);
//
BooleanQuery bq=new BooleanQuery();
BooleanQuery innerbq=new BooleanQuery();
//
bq.add(query, BooleanClause.Occur.SHOULD);
bq.add(queryQuanpin, BooleanClause.Occur.SHOULD);
bq.add(queryShouzimu, BooleanClause.Occur.SHOULD);
innerbq.add(bq, BooleanClause.Occur.MUST);
// System.out.println("innerbq = " + innerbq);
//搜索相似度最高的5条记录
TopDocs topDocs = isearcher.search(innerbq , 5);