作者:小七 | 来源:互联网 | 2023-05-18 19:46
原来项目使用的是solr进行建立索引与查询,最近想改为lucene。对于最新版的lucene网上的资料没有solr多,并且solr很多功能直接配置就可以使用,但是lucene都要通过api
原来项目使用的是solr进行建立索引与查询,最近想改为lucene。对于最新版的lucene网上的资料没有solr多,并且solr很多功能直接配置就可以使用,但是lucene都要通过api进行封装使用。下面是自己使用lucene6.6+拼音分词和ik中文分词实现的功能:
主要工具包:
lucene6.6相关jar包
pinyinAnalyzer.jar
ik-analyzer-solr6.x.jar
pinyin4j-2.5.0.jar
IKAnalyzer.cfg.xml
mydict.dic
stopword.dic
lucene的jar包可以通过maven直接构建下载,其他三个包
下载地址。其中ik的分词包是修改过重新打包已适用于6.0以上的solr和lucene版本。
在solr中的拼音分词器是在managed-schema文件中配置的:
在lucene中有自带的中文分词器但是效果一般,使用ik可以自定义自己的分词包dic,分词包直接决定了分词效果的好坏。
自定义一个分词类IndexPinyinAnalyzer继承Analyzer,也可以直接使用pinyinAnalyzer.jar中的PinyinAnalyzer类进行分词,但是他里面使用的mmseg4j中文分词,所以我在这自定义一个analyzer去将他的中文分词替换为ik分词,这部分看一下源码不难理解。
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Tokenizer;
import org.wltea.analyzer.lucene.IKTokenizer;
import utn.index.mmseg.analysis.PinyinTokenFilter;
/**
* @author sggq
* @Date 2017年9月22日
* @Description 自定义分词Analyzer:ik中文分词+拼音分词
*/
public class IndexPinyinAnalyzer extends Analyzer {
private boolean userSmart;
public IndexPinyinAnalyzer(boolean userSmart){
this.userSmart = userSmart;
}
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer tokenizer = new IKTokenizer(userSmart);
TokenStream tokenStream = new PinyinTokenFilter(tokenizer, true, true, 2);
return new Analyzer.TokenStreamComponents(tokenizer, tokenStream);
}
}
ik分词源码中通过IKAnalyzer.cfg.xml配置来加载自定义的分词包dic,IKAnalyzer.cfg.xml与mydict.dic和stopword.dic放在项目的src/main/resources下,就可以直接加载。
建立好自己的分词类,在lucene建立索引时就可以直接使用这个analyzer,同时在查询索引时也可以使用这个analyzer。
分词的效果如下:
加载扩展词典:mydict.dic
加载扩展停止词典:stopword.dic
中华人民共和国
zhonghuarenmingongheguo
zhonghuarenmingonghaiguo
zhrmghg
zhonghuarenmingonghuguo
zhonghuarenmingonghuoguo
中华人民
zhrm
zhonghuarenmin
中华
zhonghua
zh
华人
huaren
hr
人民共和国
renmingonghaiguo
renmingonghuoguo
renmingonghuguo
rmghg
renmingongheguo
共和国
gongheguo
ghg
gonghuoguo
gonghaiguo
gonghuguo
共和
gh
gonghai
gonghuo
gonghe
gonghu
国