Solr 分析器 Analyzer

 对一个document进行索引时,其中的每个field中的数据都会经历分析(根据上面的一个博客可以知道,分析就是组合分词和过滤),最终将一句话分成单个的单词,去掉句子当中的空白符号,大写转换小写,复数转单数,去掉多余的词,进行同义词代换等等。 

  如:This is a blog! this, is, a 会被去除,最后最剩下blog。当然!这个符号也会被去除的。 

  这个过程是在索引和查询过程中都会进行的,而且通常两者进行的处理的都是一样的,这样做是为了保证建立的索引和查询的正确匹配。 

分析器(Analyzer) 
  分析器是包括两个部分:分词器和过滤器。分词器功能将句子分成单个的词元token,过滤器就是对词元进行过滤。 
  solr自带了一些分词器,如果你需要使用自定义的分词器,那么就需要修改schema.xml文件。 
  schema.xml 文件允许两种方式修改文本被分析的方式,通常只有field类型为 solr.TextField 的field的内容允许定制分析器。 
    方法一:使用任何 org.apache.lucene.analysis.Analyzer的子类进行设定。 
Xml代码   " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. <fieldType name="text" class="solr.TextField">    
  2.       <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>    
  3. </fieldType>   


    方法二:指定一个TokenizerFactory ,后面跟一系列的TokenFilterFactories(它们将按照所列的顺序发生作用),Factories被用来创建分词器和分词过滤器,它们用于对分词器和分词过滤器的准备配置,这样做的目的是为了避免the overhead of creation via reflection。 
Xml代码   …… …… " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. <analyzer type="index">    
  2.         <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>    
  3. ……    
  4.     
  5.     </analyzer>    
  6.     <analyzer type="query">    
  7.         <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true"/>    
  8.     ……    
  9.     </analyzer>   

  需要说明的一点是,Any Analyzer, TokenizerFactory, or TokenFilterFactory 应该用带包名的全类名进行指定,请确保它们位于Solr的classpath 路径下。对于 org.apache.solr.analysis.* 包下的类,仅仅通过solr.*就可以进行指定。 

   如果你需要使用自己的分词器和过滤器,你就需要自己写一个 factory ,它必须是 BaseTokenizerFactory(分词器) 或BaseTokenFilterFactory(过滤器)的子类。就像下面一样。 
Java代码    收藏代码
  1. public class MyFilterFactory extends BaseTokenFilterFactory  
  2.   public TokenStream create(TokenStream input)  
  3.     return new MyFilter(input);  
  4.    
  5.  


对于IK3.1.5版本已经完全支持了solr的分词,这样就不用自己来编写了,而对于中文的切词的话,ik对solr的支持已经很完美了。  

Solr提供了哪些TokenizerFactories? 

1.  solr.LetterTokenizerFactory  
   创建org.apache.lucene.analysis.LetterTokenizer. 
   分词举例: 
   "I can't" ==> "I", "can", "t",字母切词。 

2.  solr.WhitespaceTokenizerFactory  
   创建org.apache.lucene.analysis.WhitespaceTokenizer,主要是切除所有空白字符。 

3.  solr.LowerCaseTokenizerFactory  
   创建org.apache.lucene.analysis.LowerCaseTokenizer 
   分词举例: 
  "I can't" ==> "i", "can", "t",主要是大写转小写。 

4.  solr.StandardTokenizerFactory  
   创建org.apache.lucene.analysis.standard.StandardTokenizer 
   分词举例:  "I.B.M. cat's can't" ==> 
ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't" 

   说明:该分词器,会自动地给每个分词添加type,以便接下来的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token的类型是敏感的。 
关键字: 搜索引擎 solr 分词 
5.  solr.HTMLStripWhitespaceTokenizerFactory  
从结果中出去HTML标签,将结果交给WhitespaceTokenizer处理。 
例子: 
my <a href="www.foo.bar">link</a> 
my link 
<?xml?><br>hello<!--comment--> 
hello 
hello<script><-- f('<--internal--></script>'); --></script> 
hello 
if a<b then print a; 
if a<b then print a; 
hello <td height=22 nowrap align="left"> 
hello 
a&lt;b &#65 Alpha&Omega &Omega; 
a<b A Alpha&Omega Ω 
6.  solr.HTMLStripStandardTokenizerFactory  
从结果中出去HTML标签,将结果交给StandardTokenizer处理。 
7.  solr.PatternTokenizerFactory  
说明:按照规则表达式样式对分本进行分词。 
例子:处理对象为,mice; kittens; dogs,他们由分号加上一个或多个的空格分隔。 
Xml代码   " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. <fieldType name="semicolonDelimited" class="solr.TextField">  
  2.   <analyzer>  
  3.      <tokenizer class="solr.PatternTokenizerFactory" pattern="; *" />  
  4.   </analyzer>  
  5. </fieldType>  


Solr有哪些TokenFilterFactories? 

1.  solr.StandardFilterFactory  
创建:org.apache.lucene.analysis.standard.StandardFilter. 
移除首字母简写中的点和Token后面的’s。仅仅作用于有类的Token,他们是由StandardTokenizer产生的。 
例:StandardTokenizer+ StandardFilter 
"I.B.M. cat's can't" ==> "IBM", "cat", "can't" 
2.  solr.LowerCaseFilterFactory  
创建:org.apache.lucene.analysis.LowerCaseFilter. 
3.  solr.TrimFilterFactory【solr1.2】  
创建:org.apache.solr.analysis.TrimFilter 
去掉Token两端的空白符 
例: 
" Kittens!   ", "Duck" ==> "Kittens!", "Duck". 
4.  solr.StopFilterFactory  
创建:org.apache.lucene.analysis.StopFilter 
去掉如下的通用词,多为虚词。 
   "a", "an", "and", "are", "as", "at", "be", "but", "by", 
    "for", "if", "in", "into", "is", "it", 
    "no", "not", "of", "on", "or", "s", "such", 
    "t", "that", "the", "their", "then", "there", "these", 
    "they", "this", "to", "was", "will", "with" 
自定义的通用词表的使用可以通过schema.xml文件中的"words"属性来指定,如下。 
Xml代码   " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. <fieldtype name="teststop" class="solr.TextField">  
  2.    <analyzer>  
  3.      <tokenizer class="solr.LowerCaseTokenizerFactory"/>  
  4.      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>  
  5.    </analyzer>  
  6. </fieldtype>  

5.   solr.KeepWordFilterFactory【solr1.3】  
创建:org.apache.solr.analysis.KeepWordFilter 
作用与solr.StopFilterFactory相反,保留词的列表也可以通过”word”属性进行指定。 
Xml代码   " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. <fieldtype name="testkeep" class="solr.TextField">  
  2.    <analyzer>  
  3.      <filter class="solr.KeepWordFilterFactory" words="keepwords.txt" ignoreCase="true"/>  
  4.    </analyzer>  
  5. </fieldtype>  

6.       solr.LengthFilterFactory  
创建:solr.LengthFilter 
过滤掉长度在某个范围之外的词。范围设定方式见下面。 
Xml代码   " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. <fieldtype name="lengthfilt" class="solr.TextField">  
  2.   <analyzer>  
  3.     <tokenizer class="solr.WhitespaceTokenizerFactory"/>  
  4.     <filter class="solr.LengthFilterFactory" min="2" max="5" />  
  5.   </analyzer>  
  6. </fieldtype>  

7.  solr.PorterStemFilterFactory  
创建:org.apache.lucene.analysis.PorterStemFilter 
采用Porter Stemming Algorithm算法去掉单词的后缀,例如将复数形式变成单数形式,第三人称动词变成第一人称,现在分词变成一般现在时的动词。 
8.  solr.EnglishPorterFilterFactory  
创建:solr.EnglishPorterFilter 
关于句子主干的处理,其中的"protected"指定不允许修改的词的文件。 
9.  solr.SnowballPorterFilterFactory  
关于不同语言的词干处理 
10.solr.WordDelimiterFilterFactory  
关于分隔符的处理。 
11.solr.SynonymFilterFactory  
关于同义词的处理。 
12.solr.RemoveDuplicatesTokenFilterFactory  
避免重复处理。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值