`
linliangyi2007
  • 浏览: 1004206 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

发布IKAnnlyzer3.2.0稳定版 for Lucene3.0

阅读更多
最新3.2.5版本已经推出,http://linliangyi2007.iteye.com/blog/758451

前言
由于Lucene3.0 API的全面升级,且不再与Lucene2.X兼容, IK Analyzer为此推出了3.2.0版本。该版本仅支持Lucene2.9 / 3.0和solr1.4的接口实现。
PS:使用Solr1.3和lucene2.9之前版本的用户请下载IK Analyzer3.1.6GA使用,谢谢!

IK Analyzer 3.2.0版本修订
  • 1.支持Lucene3.0 Analyzer实现
  • 2.移除solr1.3接口,修改solr1.4接口
  • 3.默认开放停止词功能,发布IK自带的ext_stopword.dic停止词典
  • 4.优化了IKQueryParser的性能


IK分词器对Lucene及solr的版本支持明细表



下载地址

IKAnalyzer3.2.0稳定版发布包

IKAnalyzer3.2.0稳定版使用手册





分享到:
评论
74 楼 zard222 2010-04-22  
你好,我在solr中使用了,IKTokenizerFactory的配置,但是启动solr自带的example却抛出错误,
使用IKTokenizer配置方式,不会出问题。
异常信息如下:

严重: java.lang.AbstractMethodError: org.wltea.analyzer.solr.IKTokenizerFactory
create(Ljava/io/Reader;)Lorg/apache/lucene/analysis/Tokenizer;
        at org.apache.solr.analysis.TokenizerChain.getStream(TokenizerChain.jav
:69)
        at org.apache.solr.analysis.SolrAnalyzer.reusableTokenStream(SolrAnalyz
r.java:74)
        at org.apache.solr.schema.IndexSchema$SolrIndexAnalyzer.reusableTokenSt
eam(IndexSchema.java:364)
        at org.apache.lucene.queryParser.QueryParser.getFieldQuery(QueryParser.
ava:567)
        at org.apache.solr.search.SolrQueryParser.getFieldQuery(SolrQueryParser
java:153)
        at org.apache.solr.util.SolrPluginUtils$DisjunctionMaxQueryParser.getFi
ldQuery(SolrPluginUtils.java:807)
        at org.apache.solr.util.SolrPluginUtils$DisjunctionMaxQueryParser.getFi
ldQuery(SolrPluginUtils.java:794)
        at org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1449

        at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:13
7)
        at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:126
)
        at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.
ava:1254)
        at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:200

        at org.apache.solr.search.DisMaxQParser.getUserQuery(DisMaxQParser.java
195)
        at org.apache.solr.search.DisMaxQParser.addMainQuery(DisMaxQParser.java
158)
        at org.apache.solr.search.DisMaxQParser.parse(DisMaxQParser.java:74)
        at org.apache.solr.search.QParser.getQuery(QParser.java:131)
        at org.apache.solr.handler.component.QueryComponent.prepare(QueryCompon
nt.java:89)
        at org.apache.solr.handler.component.SearchHandler.handleRequestBody(Se
rchHandler.java:174)
        at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHand
erBase.java:131)
        at org.apache.solr.core.SolrCore.execute(SolrCore.java:1316)
        at org.apache.solr.core.QuerySenderListener.newSearcher(QuerySenderList
ner.java:52)
        at org.apache.solr.core.SolrCore$3.call(SolrCore.java:1146)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Sourc
)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
73 楼 linliangyi2007 2010-04-21  
zhang310 写道
linliangyi2007 写道
zhang310 写道
linliangyi2007 写道
zhang310 写道
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点



IK的词典是单例模型,在启动时载入,且不会释放内存。里面有27w的词条,是分词需要的。这个肯定是不会释放的,释放就遭了,呵呵



感谢lz这么热心肠. 呵呵. 我是应用在简单的网站里面的, 一个tomcat 这样的程序运行了这样这样七个程序了, 所以内存由原来的最高70M 一下涨到了 400M 现在明白这个道理了, 
看来我我的中文分词只能做个单独的切割词语接口 提供给其他 web站点使用了,要不 web站点太多内存吃不消.
刚编译了下源码,  确实没有再好办法了,已经很好了.



400M这个夸张了,整个词典之占用27M的内存空间啊,400M估计就是你使用lucene搜索处理不当的缘故了



应该没错了.   tomcat下面七个站点  七个站点 都调用你了中文分词,一个27 七个也得二三百M吧  ,再加上源程序的六七十M内存 跟空闲内存 应该不夸张了


是这样啊,那我还是建议你分服务器了,呵呵,很少这么搭服务的。
72 楼 zhang310 2010-04-21  
linliangyi2007 写道
zhang310 写道
linliangyi2007 写道
zhang310 写道
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点



IK的词典是单例模型,在启动时载入,且不会释放内存。里面有27w的词条,是分词需要的。这个肯定是不会释放的,释放就遭了,呵呵



感谢lz这么热心肠. 呵呵. 我是应用在简单的网站里面的, 一个tomcat 这样的程序运行了这样这样七个程序了, 所以内存由原来的最高70M 一下涨到了 400M 现在明白这个道理了, 
看来我我的中文分词只能做个单独的切割词语接口 提供给其他 web站点使用了,要不 web站点太多内存吃不消.
刚编译了下源码,  确实没有再好办法了,已经很好了.



400M这个夸张了,整个词典之占用27M的内存空间啊,400M估计就是你使用lucene搜索处理不当的缘故了



应该没错了.   tomcat下面七个站点  七个站点 都调用你了中文分词,一个27 七个也得二三百M吧  ,再加上源程序的六七十M内存 跟空闲内存 应该不夸张了
71 楼 linliangyi2007 2010-04-21  
zhang310 写道
linliangyi2007 写道
zhang310 写道
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点



IK的词典是单例模型,在启动时载入,且不会释放内存。里面有27w的词条,是分词需要的。这个肯定是不会释放的,释放就遭了,呵呵



感谢lz这么热心肠. 呵呵. 我是应用在简单的网站里面的, 一个tomcat 这样的程序运行了这样这样七个程序了, 所以内存由原来的最高70M 一下涨到了 400M 现在明白这个道理了, 
看来我我的中文分词只能做个单独的切割词语接口 提供给其他 web站点使用了,要不 web站点太多内存吃不消.
刚编译了下源码,  确实没有再好办法了,已经很好了.



400M这个夸张了,整个词典之占用27M的内存空间啊,400M估计就是你使用lucene搜索处理不当的缘故了
70 楼 zhang310 2010-04-20  
linliangyi2007 写道
zhang310 写道
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点



IK的词典是单例模型,在启动时载入,且不会释放内存。里面有27w的词条,是分词需要的。这个肯定是不会释放的,释放就遭了,呵呵



感谢lz这么热心肠. 呵呵. 我是应用在简单的网站里面的, 一个tomcat 这样的程序运行了这样这样七个程序了, 所以内存由原来的最高70M 一下涨到了 400M 现在明白这个道理了, 
看来我我的中文分词只能做个单独的切割词语接口 提供给其他 web站点使用了,要不 web站点太多内存吃不消.
刚编译了下源码,  确实没有再好办法了,已经很好了.
69 楼 linliangyi2007 2010-04-20  
zhang310 写道
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点



IK的词典是单例模型,在启动时载入,且不会释放内存。里面有27w的词条,是分词需要的。这个肯定是不会释放的,释放就遭了,呵呵
68 楼 zhang310 2010-04-19  
private static ArrayList<PseudoOriginalBeanVo> getPseudoOriginalList(String str){
        ArrayList list=new ArrayList();
        try {
           StringReader reader = new StringReader(str);
           IKSegmentation analyzer = new IKSegmentation(reader,false);
           Lexeme a=analyzer.next();
           while(a!=null){
               PseudoOriginalBeanVo vo=new PseudoOriginalBeanVo();
               vo.setBegin(a.getBegin());
               vo.setEnd(a.getEndPosition());
               vo.setLength(a.getLength());
               vo.setText(a.getLexemeText());
               vo.setType(a.getLexemeType());
               list.add(vo);
               a=analyzer.next();
           }
       } catch (Exception ex) {
           MyLog.info("vo:"+ex.toString());
       }
       return list;
    }



整个系统就调用这一个方法,需要用到中文分词, 不太熟悉,整个系统就无法释放内存,系统内存监视都切图了.希望楼主以及各位指点

67 楼 zha_zi 2010-04-13  
  林老师你好,最近项目中在使用你的ik3.1.5分词器,其中要使用词库扩展功能,
按照使用文档中的的第一种方式Dictionary.loadExtendWords(dictList);
给Dictionary传入一个从数据库读出的List List绝对不是空的
但是 始终java.lang.ExceptionInInitializerError
at org.wltea.analyzer.seg.ChineseSegmenter.<init>(ChineseSegmenter.java:37)
at org.wltea.analyzer.cfg.Configuration.loadSegmenter(Configuration.java:114)
at org.wltea.analyzer.IKSegmentation.<init>(IKSegmentation.java:54)
at iktest.test.testik(test.java:20)
at iktest.test.main(test.java:36)
Caused by: java.lang.NullPointerException
at org.wltea.analyzer.dic.Dictionary.loadExtendWords(Dictionary.java:421)
at org.wltea.analyzer.dic.LoadMyDict.initConn(LoadMyDict.java:30)
at org.wltea.analyzer.dic.Dictionary.<init>(Dictionary.java:84)
at org.wltea.analyzer.dic.Dictionary.<clinit>(Dictionary.java:42)
... 5 more
非常困惑不知道为什么出现这个问题望老师指教

66 楼 linliangyi2007 2010-03-17  
lym6520 写道
lz我直接替换之前的jar文件可以吗?需要修改什么吗?


如果你是3.0.0 - 3.1.6GA的替换,你不需要做任何修改。

从3.1.X替换到3.2.0的,如果你使用的是Lucene2.9,那么也不需要修改。
65 楼 linliangyi2007 2010-03-17  
zhutouying98 写道
您好,我使用ik分词遇到个问题,就是 比如我查询工行的文章,如果文章量很少,会返回 的文章有 带有工字,并且带有行字的文章出现,怎么样来避免此问题,
第二我希望ik分词器分词至少两个字的分词,比希望分词到字,怎么样来处理,希望您能够回复。


你需要对org.wltea.analyzer.Context中的方法
	/**
	 * 向分词结果集添加词元
	 * @param lexeme
	 */
	public void addLexeme(Lexeme lexeme){
		if(!Dictionary.isStopWord(segmentBuff , lexeme.getBegin() , lexeme.getLength())){
			this.lexemeSet.addLexeme(lexeme);
		}
	}


修改为
	/**
	 * 向分词结果集添加词元
	 * @param lexeme
	 */
	public void addLexeme(Lexeme lexeme){
		if(lexeme.getLength() > 1 &&
                      !Dictionary.isStopWord(segmentBuff , lexeme.getBegin() , lexeme.getLength())){
			this.lexemeSet.addLexeme(lexeme);
		}
	}


就好。你需要下载源码然后编译。

如果取得所有的单字,你在搜索的时候,会搜不到词典中没有的词,个人认为这不是好主意
64 楼 lym6520 2010-03-17  
lz我直接替换之前的jar文件可以吗?需要修改什么吗?
63 楼 zhutouying98 2010-03-17  
您好,我使用ik分词遇到个问题,就是 比如我查询工行的文章,如果文章量很少,会返回 的文章有 带有工字,并且带有行字的文章出现,怎么样来避免此问题,
第二我希望ik分词器分词至少两个字的分词,比希望分词到字,怎么样来处理,希望您能够回复。
62 楼 linliangyi2007 2010-03-15  
treason111 写道
楼主,我换成就可以了。另外,我想问问,是不是新字典的新词都会加入到主字典里呢?如果是,那随着我添加字典种类的增多,主字典会不会越来越大呢?


所谓加入主词典不是指被记录到主词典文件中,而是指和主词典放在同一内存区域被匹配,这个是必须的。一般而言,1万个词元暂用1M内存,词典对重复的词不会加载两次,不必担心内存浪费
61 楼 treason111 2010-03-14  
楼主,我换成就可以了。另外,我想问问,是不是新字典的新词都会加入到主字典里呢?如果是,那随着我添加字典种类的增多,主字典会不会越来越大呢?
60 楼 treason111 2010-03-14  
linliangyi2007 写道
treason111 写道
楼主你好!我在solr1.3用了你的IKAnalyzer3.1.5GA分词,一开始用得都很好,就是在配置扩展词典的时候出错了,首先我没有找到WEBINF/classes目录,于是自己建了一个,把IKAnalyzer.cfg.xml文件放进去,然后就出错了“HTTP Status 500 - javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.wltea.analyzer.dic.Dictionary”好像是字典位置不对,能给我解释一下路径该怎么设置呢?我是这么设置的“<entry key="ext_dict">solr/WEB-INF/classes/t-base.dic</entry> ”,我用的是tomcat6,感谢您浪费宝贵的时间为我解答


首先,建议你是用3.1.6GA版本,其次,出现的异常说明你的路径下面没有扩展字典,因为对字典文件的载入是使用classloader的,所以看上去像是类没找到,实际上是字典没找到。


好的,非常感谢您!我马上试试
59 楼 linliangyi2007 2010-03-14  
treason111 写道
楼主你好!我在solr1.3用了你的IKAnalyzer3.1.5GA分词,一开始用得都很好,就是在配置扩展词典的时候出错了,首先我没有找到WEBINF/classes目录,于是自己建了一个,把IKAnalyzer.cfg.xml文件放进去,然后就出错了“HTTP Status 500 - javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.wltea.analyzer.dic.Dictionary”好像是字典位置不对,能给我解释一下路径该怎么设置呢?我是这么设置的“<entry key="ext_dict">solr/WEB-INF/classes/t-base.dic</entry> ”,我用的是tomcat6,感谢您浪费宝贵的时间为我解答


首先,建议你是用3.1.6GA版本,其次,出现的异常说明你的路径下面没有扩展字典,因为对字典文件的载入是使用classloader的,所以看上去像是类没找到,实际上是字典没找到。

58 楼 treason111 2010-03-13  
楼主你好!我在solr1.3用了你的IKAnalyzer3.1.5GA分词,一开始用得都很好,就是在配置扩展词典的时候出错了,首先我没有找到WEBINF/classes目录,于是自己建了一个,把IKAnalyzer.cfg.xml文件放进去,然后就出错了“HTTP Status 500 - javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.wltea.analyzer.dic.Dictionary”好像是字典位置不对,能给我解释一下路径该怎么设置呢?我是这么设置的“<entry key="ext_dict">solr/WEB-INF/classes/t-base.dic</entry> ”,我用的是tomcat6,感谢您浪费宝贵的时间为我解答
57 楼 linliangyi2007 2010-03-12  
pjw0221 写道
感谢指导,问题解决了,我在文件头 空了一行 就好了。

UTF-8要求无BOM格式的,这个在说明文档里已经说了。你的UTF-8一定是带BOM的,所以要空一格
56 楼 pjw0221 2010-03-12  
感谢指导,问题解决了,我在文件头 空了一行 就好了。
55 楼 pjw0221 2010-03-12  
经确认。。。格式是utf-8的 依然出问题。

相关推荐

Global site tag (gtag.js) - Google Analytics