这篇文章,主要说的是 怎么在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》建立文件
- 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"下面。
更改内容为:
- <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:去除重复词
以上是针对英文,中文的除了空格,其他都类似