IKAnanlyzer4Pinyin

修改了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);


你可能感兴趣的:(Pinyin)