博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Solr5.3.1整合IKAnalyzer
阅读量:7085 次
发布时间:2019-06-28

本文共 4981 字,大约阅读时间需要 16 分钟。

  由于solr5.3.1本身不支持中文分词,而msseg4j的分词效果不明显。因而采用IK进行分词,然而参考http://www.superwu.cn/2015/05/08/2134/在google上下载的jar包放到solr目录下直接报如下异常。

严重: Servlet.service() for servlet [default] in context with path [/solr] threw exception [Filter execution threw an exception] with root causejava.lang.AbstractMethodError    at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:179)    at org.apache.solr.handler.AnalysisRequestHandlerBase.analyzeValue(AnalysisRequestHandlerBase.java:91)    at org.apache.solr.handler.FieldAnalysisRequestHandler.analyzeValues(FieldAnalysisRequestHandler.java:221)    at org.apache.solr.handler.FieldAnalysisRequestHandler.handleAnalysisRequest(FieldAnalysisRequestHandler.java:182)    at org.apache.solr.handler.FieldAnalysisRequestHandler.doAnalysis(FieldAnalysisRequestHandler.java:102)    at org.apache.solr.handler.AnalysisRequestHandlerBase.handleRequestBody(AnalysisRequestHandlerBase.java:63)    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:143)    at org.apache.solr.core.SolrCore.execute(SolrCore.java:2068)    at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:669)    at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:462)    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:214)    at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:179)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2522)    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2511)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)    at java.lang.Thread.run(Thread.java:745)

  一开始以为是配置问题,怎么配都不行。后来看了下源码,发现solr5.3.1中 Luecene的Analyzer接口的createComponents方法把第二个参数去掉了。因此修改源码是在所难免了。源码的修改可参考:http://iamyida.iteye.com/blog/2193513。也可以直接获取改好的源码重新打包即可。

  主要修改部分、IKAnalyzer.java

/**      * 重载Analyzer接口,构造分词组件      */      @Override      protected TokenStreamComponents createComponents(String text) {          Reader reader = new BufferedReader(new StringReader(text));          Tokenizer _IKTokenizer = new IKTokenizer(reader , this.useSmart());          return new TokenStreamComponents(_IKTokenizer);      }

  IKTokenizer.java中添加如下构造函数

public IKTokenizer(AttributeFactory factory, boolean useSmart) {          super(factory);          offsetAtt = addAttribute(OffsetAttribute.class);          termAtt = addAttribute(CharTermAttribute.class);          typeAtt = addAttribute(TypeAttribute.class);          _IKImplement = new IKSegmenter(input , useSmart);      }

  其它都是一些零零碎碎的修改。可查看修改后的源文件。

  新建一个工程(附件中的IK-Analyzer-extra),添加工厂类IKTokenizerFactory,方便程序的扩展和维护。

package org.wltea.analyzer.util;import java.util.Map;import org.apache.lucene.analysis.Tokenizer;import org.apache.lucene.analysis.util.TokenizerFactory;import org.apache.lucene.util.AttributeFactory;import org.wltea.analyzer.lucene.IKTokenizer;public class IKTokenizerFactory extends TokenizerFactory {    private boolean useSmart;      public IKTokenizerFactory(Map
args) { super(args); useSmart = getBoolean(args, "useSmart", false); } @Override public Tokenizer create(AttributeFactory attributeFactory) { Tokenizer tokenizer = new IKTokenizer(attributeFactory,useSmart); return tokenizer; } }

  最后是schema.xml中添加如下配置

  最后将IK-Analyzer-5.3.1.jar和IK-Analyzer-extra-5.3.1.jar拷贝至solr项目的lib目录下即可。

  另外提醒下各位,IK的源码已经搬迁至这了:http://git.oschina.net/wltea/IK-Analyzer-2012FF/。

  工程文件:

    http://pan.baidu.com/s/1skv1jCp

    http://pan.baidu.com/s/1c1o0gI8

  参考文献:

  http://iamyida.iteye.com/blog/2220474

  http://iamyida.iteye.com/blog/2193513

转载地址:http://vowql.baihongyu.com/

你可能感兴趣的文章
Selenium WebDriver中一些鼠标和键盘事件的使用
查看>>
Bzoj4299 Codechef FRBSUM
查看>>
Linux命令行下快捷键
查看>>
Matlab成长之路_1(图片,视频,摄像头的读取和显示)
查看>>
什么是OAuth授权?
查看>>
ES6笔记(2)-- let的块级作用域
查看>>
ddt
查看>>
cesium-长度测量和面积测量
查看>>
Java异常处理课后作业
查看>>
<<TCP/IP高效编程>>读书笔记
查看>>
hrtf 旋转音效matlab实现
查看>>
sqlserver 导入数据出现 无法创建 OLE DB 取值函数。请查看列元数据是否有效
查看>>
block的复习
查看>>
Linux常用命令记录
查看>>
PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
查看>>
百度地图坐标转换
查看>>
JavaWeb工作原理
查看>>
MATLAB:图像选取局部区域滤波(roicolor、roipoly、roifill、fspecial、roifilt2函数)...
查看>>
20331关系数据库设计技术
查看>>
wget: unable to resolve host address “mirrors.163.com” 的解决办法
查看>>