zoukankan      html  css  js  c++  java
  • IK分词器 整合solr4.7 含同义词、切分词、停止词

    转载请注明出处!

    IK分词器如果配置成

    <fieldType name="text_ik" class="solr.TextField">
           <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
               <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>
    

    本人测试切分词可以,但是同义词,扩展词库用不了,

    网上查各种资料说IK分词器有个BUG,要自己把jar文件改一下,于是找到IK的源码,里面只有IKAnalyzer的源码,代码如下

    package org.wltea.analyzer.lucene;
    
    import java.io.Reader;
    
    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.Tokenizer;
    
    /**
     * IK分词器,Lucene Analyzer接口实现
     * 兼容Lucene 4.0版本
     */
    public final class IKAnalyzer extends Analyzer{
    	
    	private boolean useSmart;
    	
    	public boolean useSmart() {
    		return useSmart;
    	}
    
    	public void setUseSmart(boolean useSmart) {
    		this.useSmart = useSmart;
    	}
    
    	/**
    	 * IK分词器Lucene  Analyzer接口实现类
    	 * 
    	 * 默认细粒度切分算法
    	 */
    	public IKAnalyzer(){
    		this(false);
    	}
    	
    	/**
    	 * IK分词器Lucene Analyzer接口实现类
    	 * 
    	 * @param useSmart 当为true时,分词器进行智能切分
    	 */
    	public IKAnalyzer(boolean useSmart){
    		super();
    		this.useSmart = useSmart;
    	}
    
    	/**
    	 * 重载Analyzer接口,构造分词组件
    	 */
    	@Override
    	protected TokenStreamComponents createComponents(String fieldName, final Reader in) {
    		Tokenizer _IKTokenizer = new IKTokenizer(in , this.useSmart());
    		return new TokenStreamComponents(_IKTokenizer);
    	}
    
    }
    

      

    自己加了一个IKAnalyzerSolrFactory,代码如下

    package org.wltea.analyzer.lucene;
    
    import java.io.Reader;
    import java.util.Map;
    
    import org.apache.lucene.analysis.Tokenizer;
    import org.apache.lucene.analysis.util.TokenizerFactory;
    import org.apache.lucene.util.AttributeSource.AttributeFactory;
     
    public class IKAnalyzerSolrFactory extends TokenizerFactory{
         
        private boolean useSmart;
         
        public boolean useSmart() {
            return useSmart;
        }
         
        public void setUseSmart(boolean useSmart) {
            this.useSmart = useSmart;
        }
         
         public IKAnalyzerSolrFactory(Map<String,String> args) {
             super(args);
             assureMatchVersion();
             this.setUseSmart(args.get("useSmart").toString().equals("true"));
           }
     
     
        @Override
        public Tokenizer create(AttributeFactory factory, Reader input) {
            Tokenizer _IKTokenizer = new IKTokenizer(input , this.useSmart);
            return _IKTokenizer;
        }
     
    }
    

      这样一来就能在配置文件中配置成IKAnalyzerSolrFactory 的列子

    下面是具体的配置描述:

    1。修改IK的jar文件,加入IKAnalyzerSolrFactory (如果不会改的自行下载 http://pan.baidu.com/s/1gfLOIL9)

    2.修改solrconfig.xml文件,加入

    <lib dir="/contrib/analysis-extras/lib" regex=".*.jar" />
    

    3.修改schema.xml文件,加入

    <!--IK分词器-->
    	 <fieldType name="text_ik" class="solr.TextField">
            <analyzer type="index">
                <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" useSmart="true"/>
            </analyzer>
            <analyzer type="query">
                <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" useSmart="true"/>
    			<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>  
            </analyzer>
        </fieldType>
    

    4.在solr的webINFO 下的classes(没有新建)加入如下图,IK压缩文件中的部分文件,如图所示:

    5.在ext.dic配置自定义词库,不需要切分词的词语配置在此,同义词写在synonyms.txt中即可。格式为:  通知,通告

    注意每次改变词库或者同义词需要重启服务。

  • 相关阅读:
    Common Lisp 参数传递的几种形式
    EF架构~基于EF数据层的实现
    标准架构~业务层到底是否应该关注数据持久化的方式
    Redis学习笔记~Redis主从服务器,读写分离
    Redis学习笔记~是时候为Redis实现一个仓储了,RedisRepository来了
    MVVM架构~knockoutjs系列之数组的$index和$data
    【Oracle】-【sqlplus / as sysdba登录报错问题】-新用户使用sqlplus / as sysdba登录报错
    Android---App Widget(一)
    Mit 分布式系统导论,Distributed Systems ,lab1 -lab6 总结,实验一到实验六总结
    GDAL切割重采样遥感图像
  • 原文地址:https://www.cnblogs.com/wudi521/p/5558880.html
Copyright © 2011-2022 走看看