zoukankan      html  css  js  c++  java
  • 利用SOLR搭建企业搜索平台 之二(中文分词)

    这篇文章,主要说的是 怎么在solr中加入中文分词,参考了一些文章,但是还是花了不少时间才搞出的。可能是大侠们太牛了,所以很多细节东西都没有写出来!但是要指出的是很多文章都是抄来抄去的!

    入正题:
        在上面的一个文章中,已经使solr跑起来了,在上面的基础上,加入中文分词。我用的是paoding分词器!
    1》请下好paoding分词器,下载地址:
    http://code.google.com/p/paoding/downloads/list,在这里要非常感谢paoding作者:qieqie
    在使用paoding的时候要注意:paoding的dic位置,也就是字典的位置,有两种办法解决:                    
    1) 在系统环境变量中加入PAODING_DIC_HOME这个变量,值为paoding压缩包下面的dic的解压位置。
    2)paoding-analysis.jar里面有个paoding-dic-home.properties文件,指定dic也可,但是要重新编译这个jar包,我采用的后面一种办法,只要每次固定好dic位置,部署还不是很不方便,设置环境变量我比较反感
    2》建立文件
    Java代码
    1. package com.yeedoo.slor.tokenizer;  
    2.   
    3. import java.io.Reader;  
    4. import java.util.Map;  
    5.   
    6. import net.paoding.analysis.analyzer.PaodingTokenizer;  
    7. import net.paoding.analysis.analyzer.TokenCollector;  
    8. import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector;  
    9. import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector;  
    10. import net.paoding.analysis.knife.PaodingMaker;  
    11.   
    12. import org.apache.lucene.analysis.TokenStream;  
    13. import org.apache.solr.analysis.BaseTokenizerFactory;  
    14.   
    15. public class ChineseTokenizerFactory extends BaseTokenizerFactory {  
    16.       
    17.     /** 
    18.      * 最多切分 默认模式 
    19.      */  
    20.     public static final String MOST_WORDS_MODE = "most-words";  
    21.   
    22.     /** 
    23.      * 按最大切分 
    24.      */  
    25.     public static final String MAX_WORD_LENGTH_MODE = "max-word-length";  
    26.   
    27.     private String mode = null;  
    28.   
    29.     public void setMode(String mode) {  
    30.         if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode) || "default".equalsIgnoreCase(mode)) {  
    31.             this.mode = MOST_WORDS_MODE;  
    32.         } else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) {  
    33.             this.mode = MAX_WORD_LENGTH_MODE;  
    34.         } else {  
    35.             throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode);  
    36.         }  
    37.     }  
    38.   
    39.     @Override  
    40.     public void init(Map<String,String> args) {  
    41.         super.init(args);  
    42.         setMode(args.get("mode").toString());  
    43.     }  
    44.   
    45.     public TokenStream create(Reader input) {  
    46.         return new PaodingTokenizer(input, PaodingMaker.make(), createTokenCollector());  
    47.     }  
    48.   
    49.     private TokenCollector createTokenCollector() {  
    50.         if (MOST_WORDS_MODE.equals(mode))  
    51.             return new MostWordsTokenCollector();  
    52.         if (MAX_WORD_LENGTH_MODE.equals(mode))  
    53.             return new MaxWordLengthTokenCollector();  
    54.         throw new Error("never happened");  
    55.     }  
    56.       
    57. }  
    package com.yeedoo.slor.tokenizer;  import java.io.Reader; import java.util.Map;  import net.paoding.analysis.analyzer.PaodingTokenizer; import net.paoding.analysis.analyzer.TokenCollector; import net.paoding.analysis.analyzer.impl.MaxWordLengthTokenCollector; import net.paoding.analysis.analyzer.impl.MostWordsTokenCollector; import net.paoding.analysis.knife.PaodingMaker;  import org.apache.lucene.analysis.TokenStream; import org.apache.solr.analysis.BaseTokenizerFactory;  public class ChineseTokenizerFactory extends BaseTokenizerFactory { 	 	/** 	 * 最多切分 默认模式 	 */ 	public static final String MOST_WORDS_MODE = "most-words";  	/** 	 * 按最大切分 	 */ 	public static final String MAX_WORD_LENGTH_MODE = "max-word-length";  	private String mode = null;  	public void setMode(String mode) { 		if (mode == null || MOST_WORDS_MODE.equalsIgnoreCase(mode) || "default".equalsIgnoreCase(mode)) { 			this.mode = MOST_WORDS_MODE; 		} else if (MAX_WORD_LENGTH_MODE.equalsIgnoreCase(mode)) { 			this.mode = MAX_WORD_LENGTH_MODE; 		} else { 			throw new IllegalArgumentException("不合法的分析器Mode参数设置:" + mode); 		} 	}  	@Override 	public void init(Map<String,String> args) { 		super.init(args); 		setMode(args.get("mode").toString()); 	}  	public TokenStream create(Reader input) { 		return new PaodingTokenizer(input, PaodingMaker.make(), createTokenCollector()); 	}  	private TokenCollector createTokenCollector() { 		if (MOST_WORDS_MODE.equals(mode)) 			return new MostWordsTokenCollector(); 		if (MAX_WORD_LENGTH_MODE.equals(mode)) 			return new MaxWordLengthTokenCollector(); 		throw new Error("never happened"); 	} 	 }

    将该文件打包,如果你不愿打包,请到附件里面下吧。
    请将两个jar,一个是这个,还有一个是 paoding-analysis.jar 放到tomcat的webapps"solr"WEB-INF"lib"下
    3》更改schema.xml文件,使分词器起到作用。如果你看过前面一个文章,schema.xml的具体位置在c:"solr-tomcat"solr"conf"下面。
    更改内容为:
    Xml代码
    1. <fieldType name="text" class="solr.TextField" positionIncrementGap="100">  
    2.       <analyzer type="index">  
    3.         <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->  
    4.         <tokenizer class="com.yeedoo.slor.tokenizer.ChineseTokenizerFactory" mode="most-words"/>  
    5.       ··· ···  
    6.       </analyzer>  
    7.       <analyzer type="query">  
    8.          <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->  
    9.          <tokenizer     class="com.yeedoo.slor.tokenizer.ChineseTokenizerFactory" mode="most-words"/>   
    10.         ··· ···  
    11.       </analyzer>  
    12. </fieldType>  
    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">       <analyzer type="index">         <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->         <tokenizer class="com.yeedoo.slor.tokenizer.ChineseTokenizerFactory" mode="most-words"/>       ··· ···       </analyzer>       <analyzer type="query">          <!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->          <tokenizer     class="com.yeedoo.slor.tokenizer.ChineseTokenizerFactory" mode="most-words"/>          ··· ···       </analyzer> </fieldType>

    <!-- --> 里面的为需要更改的内容
    4》重启你的tomcat ,ok!

    附: [Solr分词顺序]Solr建立索引和对关键词进行查询都得对字串进行分词,在向索引库中添加全文检索类型的索引的时候,Solr会首先用空格进行分词,然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果才会加入到索引库中以备查询。分词的顺序如下:
    索引
    1:空格whitespaceTokenize
    2:过滤词StopFilter
    3:拆字WordDelimiterFilter
    4:小写过滤LowerCaseFilter
    5:英文相近词EnglishPorterFilter
    6:去除重复词RemoveDuplicatesTokenFilter
    查询
    1:查询相近词
    2:过滤词
    3:拆字
    4:小写过滤
    5:英文相近词
    6:去除重复词
    以上是针对英文,中文的除了空格,其他都类似
  • 相关阅读:
    常用256安全色
    PHP获取中英文混合字符串的字数
    windows 2012 443端口无法访问解决随记!
    SQL提取时间段内数据
    正则表达式匹配
    PclZip library能够压缩与解压缩Zip格式
    安装IIS或证书上服务提示安装程序无法复制文件 ftpsvc2.dl的解决办法
    tomcat
    版本控制gitlab
    rsync
  • 原文地址:https://www.cnblogs.com/wycg1984/p/1567588.html
Copyright © 2011-2022 走看看