文档章节

IKAnalyzer分词器支持Lucene5+/Solr5+

God_Seven
 God_Seven
发布于 2015/04/23 16:24
字数 1127
阅读 1312
收藏 6
点赞 1
评论 3

升级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
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
solr搜索之demo和集成IKAnalyzer(二)

1 新建demo-solr 关闭运行的solr应用。 进入solr目录:D:solr-4.10.2example 1、在example目录下创建demo-solr文件夹; 2、将./solr下的solr.xml拷贝到demo-solr目录下; 3、在demo-solr下创...

技术小阿哥
2017/11/27
0
0
lucene集成IK实现中文分词检索

接上篇,解决lucene中文分词问题。 这里采用IK分词器。 IKAnalyzer2012u5.zip下载地址:http://code.google.com/p/ik-analyzer/downloads/detail?name=IKAnalyzer2012u5.zip&can=2&q= 解压缩......

萝卜丁辣子
2012/09/20
0
0
lucene4.0与IKAnalyzer的冲突

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

翊骷
2014/08/26
0
0
ElasticSearch的ik分词插件开发

ik插件,说白了,就是通过封装ik分词器,与ElasticSearch对接,让ElasticSearch能够驱动该分词器。那么,具体怎么与ElasticSearch对接呢?从下往上走,总共3步: 一、封装IK分析器 与Elastic...

萧十一郎君
2014/05/26
0
1
solr4.8安装步骤和配置IK分词器

Solr4.8 安装步骤如下: 1. 下载solr4.8,到Apache官网下载 2. 准备一个tomcat,我这边用tomcat7 3. 将下载好的solr4.8解压缩开,将里面的solr-4.8.0solr-4.8.0examplewebappssolr.war拷贝到...

james_you
2014/05/05
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周六乱弹 —— 妹子和游戏哪个更好玩

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享唐朝乐队的单曲《国际歌》 《国际歌》- 唐朝乐队 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子- :日常祈雨 邪恶的大祭...

小小编辑
26分钟前
61
4
流利阅读笔记32-20180721待学习

“人工智能”造假:只有人工,没有智能 Lala 2018-07-21 1.今日导读 当今社会,擅长单个方面的人工智能已经盛行,手机借助 AI 智慧防抖技术帮助大家拍出清晰照片,谷歌研发的 AI 助手将可以帮...

aibinxiao
今天
2
0
我的成长记录(一)

今天突然精神抖擞,在我的博客下新开一项分类>成长记录,专门记录每隔一段时间我的一点感悟吧。因为今天才专门花时间新开这样一个分类,所以以前有过的一些感悟没有记录下来,现在已经想不起...

dtqq
今天
0
0
机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
0
0
idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
13
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部