文档章节

IKAnalyzer分词器支持Lucene5+/Solr5+

God_Seven
 God_Seven
发布于 2015/04/23 16:24
字数 1127
阅读 1326
收藏 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
在Solr4.9中使用IKAnalyzer,实现同义词,扩展词库,停顿词的添加

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

翊骷
2014/09/11
0
1
Lucene的中文分词器IKAnalyzer

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

王国龙_成长
2013/02/05
0
3
Lucene使用IKAnalyzer中文分词笔记

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

Jialy
2014/09/02
0
0
lucene4.0与IKAnalyzer2012_u6的冲突

在网上下载了lucene当前最新版本4.0,以及IKAnalyzer中文分词器的完整发布包。 一起运行之后发现异常: java.lang.VerifyError: class org.wltea.analyzer.lucene.IKAnalyzer overrides fina...

黄敦仁
2013/01/15
0
4
IKAnalyzer中文分词器

IKAnalyzer3.0介绍 IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体...

期待变强的菜鸟
2014/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

打开eclipse出现an error has occurred see the log file

解决方法: 1,打开eclipse安装目录下的eclipse.ini文件; 2,打开的文本文件最后添加一行 --add-modules=ALL-SYSTEM 3,保存重新打开Eclipse。...

任梁荣
昨天
3
0
搞定Northwind示例数据库,无论哪个版本的SQLServer都受用

Northwind数据库 从这里可以找到突破口: http://social.msdn.microsoft.com/Forums/zh-CN/Vsexpressvb/thread/8490a1c6-9018-40c9-aafb-df9f79d29cde 下面是MSDN: http://msdn2.microsoft......

QQZZFT
昨天
1
0
mysql主从同步,安装配置操作

准备 两台mysql服务,我这里准备了如下: 主库:192.168.176.128 从库:192.168.176.131 如何在Linux上安装mysql服务,请看https://blog.csdn.net/qq_18860653/article/details/80250499 操作...

小致dad
昨天
3
0
一个手机装天下,走遍中国都不怕!

导读 “1200元(人民币,下同),微信支付,可以,你扫我。”来自西非马里共和国的展商Albert拿着手机,和一位买走他手鼓的中国游客用简单的汉语交流着。 近日,“第十四届中俄蒙经贸洽谈暨商品...

问题终结者
昨天
2
0
Redis的“死键”问题

大规模的数据库存储系统中,数据的生命周期管理是很有必要的;从业务角度发现过期数据,数据归档和数据碎片整理等。以MySQL为例,1个运行很久的TB级MySQL实例中,极有可能数百GB的数据,对业...

IT--小哥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部