设为首页 收藏本站
查看: 841|回复: 0

[经验分享] 利用SOLR搭建企业搜索平台 之二(中文分词)[转]

[复制链接]
发表于 2016-12-16 09:37:49 | 显示全部楼层 |阅读模式
  关键字: solr lucene 搭建 中文分词 http://www.dzxiaoshuo.com

http://www.dzxiaoshuo.com

这篇文章,主要说的是 怎么在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代码 DSC0000.gif





  • 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");   
  •     }   
  •        
  • }  



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代码





  • <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>  



<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:去除重复词
以上是针对英文,中文的除了空格,其他都类似

下篇文章可能会讲一下solr的配置

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315005-1-1.html 上篇帖子: SOLR同义词使用之中文问题 下篇帖子: Solr在weblogic上中文检索乱码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表