文档章节

IKAnalyzer分词器支持Lucene5+/Solr5+

God_Seven
 God_Seven
发布于 2015/04/23 16:24
字数 1127
阅读 1336
收藏 6

升级Solr5.1的过程就不描述了,从4.10.2升上来,基本没有任何其他问题。但启动Solr后就出现报错LOG,有人已经在OSCHINA中向IK项目提交BUG了,见此链接

废话不多,直接上修改方案吧!

我修改的IK代码版本为K-Analyzer-2012FF_hf1,如果你的是其他版本的,那么对照着修改或者直接下个这版本的改吧,IK GIT传送门

一共需要修改的是4个文件:均在org\wltea\analyzer这个目录下

1、首先是lucene文件夹下的IKAnalyzerIKTokenizer

首先改IKAnalyzer文件

Lucene5中createComponents的原型由Lucene4中的(String, Reader)变更为了(String)【关于Lucene的API变更,大家自己去apache官网的API站点查阅比较吧】,因此该部分代码修改为

/**
	 * 重载Analyzer接口,构造分词组件
	 * 调整支持Lucene 5.0 createComponents构造为(String),移除原有Reader in参数
	 */
	@Override
	//protected TokenStreamComponents createComponents(String fieldName, final Reader in) {
	protected TokenStreamComponents createComponents(String fieldName) {
		Tokenizer _IKTokenizer = new IKTokenizer(this.useSmart());
		return new TokenStreamComponents(_IKTokenizer);
	}

接下来是IKTokenizer文件

由于上面的createComponents移除了Reader in参数,因此IKTokenizer的构造也就不再需要这个参数和对应的处理了,移除掉参数和super就好了。

/**
	 * Lucene 4.0 Tokenizer适配器类构造函数 —— Lucene5.0 移除原有参数Reader in
	 * @param useSmart
	 */
	//public IKTokenizer(Reader in , boolean useSmart){
	public IKTokenizer(boolean useSmart){
		//屏蔽原有参数Reader in的处理,Lucene会调用setReader来处理此项内容
		//super(in);
	    offsetAtt = addAttribute(OffsetAttribute.class);
	    termAtt = addAttribute(CharTermAttribute.class);
	    typeAtt = addAttribute(TypeAttribute.class);
		_IKImplement = new IKSegmenter(input , useSmart);
	}


关于移除此参数的说明:官方文档说调用setRaeder来替代,我也不知道是自己调用还是lucene自己会调用,而且IK的代码我没全部看(我是.NET开发我会说NOTEPAD看JAVA累?其实是懒),也没看到IK里面这reader有咩作用,因此干脆移除掉,事后验证发现运行正常,也没什么不适应。

2、query下的SWMCQueryBuilder和sample下的LuceneIndexAndSearchDemo

Lucene5中移除了Version,因此很多API中的Version参数都被移除了,同样大家自行翻阅官方CHANGE说明。

首先是SWMCQueryBuilder文件,getSWMCQuery方法中调用的QueryParser和StandardAnalyzer均受上述原因影响,因此移除代码中的Version.LUCENE_40

//借助lucene queryparser 生成SWMC Query
		//调整支持Lucene5.0 QueryParser构造中移除了QueryParser(Version,String,Analyzer),直接使用QueryParser(String,Analyzer)
		//调整支持Lucene5.0 StandardAnalyzer构造中移除了QueryParser(Version),直接使用QueryParser()
		QueryParser qp = new QueryParser(fieldName, new StandardAnalyzer());
		qp.setDefaultOperator(QueryParser.AND_OPERATOR);
		qp.setAutoGeneratePhraseQueries(true);

然后是LuceneIndexAndSearchDemo文件,这个是案例,其实文件删除就好了的说

与上面一样,移除代码中的Version.LUCENE_40

String keyword = "中文分词工具包";			
			//使用QueryParser查询分析器构造Query对象
			//调整支持Lucene5.0 QueryParser构造中移除了QueryParser(Version,String,Analyzer),直接使用QueryParser(String,Analyzer)
			QueryParser qp = new QueryParser(fieldName,  analyzer);
			qp.setDefaultOperator(QueryParser.AND_OPERATOR);
			Query query = qp.parse(keyword);
			System.out.println("Query = " + query);

至此全部修改完成,编译打包就O了,记得编译时需要lucene5对应的jar包哦。

最后:

我就不po源码了,因为我的源码有过别的修改,1个是IKTokenizerFactory实现,另外1个是IK分词的BUG,不过貌似SOLR里面的所有分词均有此“BUG”,当文本包含HTML标记,且分词使用了charFilter移除HTML标记时,分词结果中的位置标记存在偏移,这会导致显示的时候高亮错位,因为我不是做的Lucene定制开发,是直接使用Solr(.NET开发捂脸啊...),当时为了这个BUG那是翻了无数个网页找原因找方案修复,不过也只修复了一半(在网上找到了1个方案googlecode中有人提交了此BUG并附上了自己的修复方案,我直接COPY来的),起始位置正确了,但结束位置还是偏移的。

需要JAR包和源码的可以移步益达那里去,他也改了这个,只不过他偷懒没写完整,但附上了代码,他没有移除Reader in参,这点就是我先前纠结的点,至于是不是真的不需要内容了,大家运行试试吧。益达的传送门!注意,益达把源码放在了pan里,该死的链接需要手工COPY。

© 著作权归作者所有

共有 人打赏支持
God_Seven
粉丝 3
博文 4
码字总数 1909
作品 0
武汉
程序员
私信 提问
加载中

评论(3)

God_Seven
God_Seven

引用来自“MikyChow”的评论

博主你好,我使用您提供的ik分词器后在solr5.3上运行发现以下错误:
{"responseHeader":{"status":500,"QTime":1},"error":{"trace":"java.lang.NullPointerException\r\n\tat java.io.StringReader.<init>(Unknown Source)\r\n\tat org.wltea.analyzer.lucene.IKAnalyzer.createComponents(IKAnalyzer.java:74)\r\n\tat org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:179)\r\n\tat org.apache.solr.handler.AnalysisRequestHandlerBase.analyzeValue(AnalysisRequestHandlerBase.java:91)\r\n\tat org.apache.solr.handler.FieldAnalysisRequestHandler.analyzeValues(FieldAnalysisRequestHandler.java:221)\r\n\tat org.apache.solr.handler.FieldAnalysisRequestHandler.handleAnalysisRequest(FieldAnalysisRequestHandler.java:182)\r\n\tat org.apache.solr.handler.FieldAnalysisRequestHandler.doAnalysis(FieldAnalysisRequestHandler.java:102)\r\n\tat org.apache.solr.handler.AnalysisRequestHandlerBase.handleRequestBody(AnalysisRequestHandlerBase.java:63)\r\n\tat org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:143)\r\n\ta
你报错的堆栈显示是调用IKAnalyzer.java的createComponents方法出现了错误,而且是StringReader初始化的时候出现NullPointerException,你是不是还保留着Reader reader = new BufferedReader(new StringReader(fieldName));这行代码??我上面写的已经没有这行代码了,你可以注释/去掉这行
M
MikyChow
由于本人是做.net开发,所以还烦请博主帮助修正下
M
MikyChow
博主你好,我使用您提供的ik分词器后在solr5.3上运行发现以下错误:
{"responseHeader":{"status":500,"QTime":1},"error":{"trace":"java.lang.NullPointerException\r\n\tat java.io.StringReader.<init>(Unknown Source)\r\n\tat org.wltea.analyzer.lucene.IKAnalyzer.createComponents(IKAnalyzer.java:74)\r\n\tat org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:179)\r\n\tat org.apache.solr.handler.AnalysisRequestHandlerBase.analyzeValue(AnalysisRequestHandlerBase.java:91)\r\n\tat org.apache.solr.handler.FieldAnalysisRequestHandler.analyzeValues(FieldAnalysisRequestHandler.java:221)\r\n\tat org.apache.solr.handler.FieldAnalysisRequestHandler.handleAnalysisRequest(FieldAnalysisRequestHandler.java:182)\r\n\tat org.apache.solr.handler.FieldAnalysisRequestHandler.doAnalysis(FieldAnalysisRequestHandler.java:102)\r\n\tat org.apache.solr.handler.AnalysisRequestHandlerBase.handleRequestBody(AnalysisRequestHandlerBase.java:63)\r\n\tat org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:143)\r\n\ta
Lucene的中文分词器IKAnalyzer

分词器对英文的支持是非常好的。 一般分词经过的流程: 1)切分关键词 2)去除停用词 3)把英文单词转为小写 但是老外写的分词器对中文分词一般都是单字分词,分词的效果不好。 国人林良益写...

王国龙_成长
2013/02/05
0
3
在Solr4.9中使用IKAnalyzer,实现同义词,扩展词库,停顿词的添加

在使用solr4.9的过程中,使用了IKAnalyzer分词器,其中遇到了不少问题,现在做个记录,以备后续只用。 首先使用IKAnalyzer是看到群里有人介绍,但是貌似现在IKAnalyzer已经没人更新了。。。不...

翊骷
2014/09/11
0
1
IKAnalyzer 中文分词库源码已迁移到 Git@OSC

IKAnalyzer 是一个非常著名和老牌的 Java 中文分词库,目前 OSChina 网站也是使用 IK 分词器。IKAnalyzer 的代码一直放在 Google Code 的,你知道的,Google Code 系统做得比较“糟糕”,经常...

oschina
2015/01/22
11.4K
34
Lucene使用IKAnalyzer中文分词笔记

本文主要讲解IKAnalyzer(以下简称‘IK’)在Lucene中的具体使用,关于Lucene和IK分词器的背景及其作用在这里就不再熬述。不得不感叹下Lucene版本变更的快速,如今最新已经到了4.9.0,相信任...

Jialy
2014/09/02
0
0
得到文章的关键词后根据它对文章划分类别

使用分词器得到一篇文章的词,例如对一句话“IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本”分析, 得到...

printf_ll
2014/09/04
586
2

没有更多内容

加载失败,请刷新页面

加载更多

自定义线程池

自定义线程工厂: public class CustomThreadFactory implements ThreadFactory { private static final Logger LOGGER = LoggerFactory.getLogger(CustomThreadFactory.class); pu......

hensemlee
11分钟前
1
0
【剑指offer纪念版】-- 面试题目录

2.实现Singleton模式 3.二维数组中的查找 4.替换空格 5.从尾到头打印链表 6.重建二叉树 7.用两个栈实现队列 8.旋转数组的最小数字 9.斐波那契数列 10.二进制中1的个数 11.数值的整数次方 12...

细节探索者
23分钟前
1
0
记一次oom内核优化记录:vm.lower_zone_protection

情景 最近gitlab服务会偶发性500,当前机器部署了gitlab、nfs等服务,经过排查发现是nfsd引发oom,导致系统运行不畅。处理过程如下: 事故现场 开发在使用gitlab的时候发现,偶发性的出现500...

阿dai
56分钟前
4
0
Spring Batch JSON 支持

Spring Batch 4.1 开始能够支持 JSON 格式了。这个发布介绍了一个新的数据读(item reader)能够读取一个 JSON 资源,这个资源按照下面的格式: [  {    "isin": "123",    ...

honeymose
今天
0
0
浏览器缓存

HTTP缓存类型 200 from cache:直接从本地缓存获取响应,可细分为from disk cache, from memory cache 304 Not Modified:协商缓存,本地未命中发送校验数据到服务端,如果服务端数据没有改变,则读...

关元
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部