solr分词

来源:互联网 发布:mac系统软件 编辑:程序博客网 时间:2024/05/08 20:58

【本文基于对此英文网页的理解http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

 (一) 分词基本概念

 概览

    当对一个文档(document是一系列field的集合)进行索引时,其中的每个field(document和file都是lucene中的概念)中的数据都会经历分析,分词和多步的分词过滤等操作。这一系列的动作是什么呢?直观的理解是,将一句话分成单个的单词,去掉句子当中的空白符号,去掉多余的词,进行同义词代换等等。

  【例】what a beautiful day? 会进行什么处理呢?what ,a 以及问号都将被去掉,最后处理结果为beautiful和day(也有可能是beautiful day)。

  不仅仅是在索引的时候进行这些工作,查询的时候也要做这些工作,而且通常索引和查询使用同样的方法来进行处理。这样做的目的是为了保证索引与查询的正确匹配。下例说明了采取不同的处理时的不匹配情况。

  【例】ABCD索引分词为AB  CD,查询时候分词为ABC  D,显然查询的匹配结果为0。

 

词性转换

  一种是将一个词扩展成它的多种形式,例如将run扩展成runs,running。另外一种是词性规约,例如将runns,running等都“收缩”成run。前者只需要在索引或查询的任意一端采用即可,后者需要在两端同时采用。

 

分析器(Analyzer)

  分析器是包括连个部分:分词器和过滤器。分词器顾名思意就是将句子分词单个的词,过滤器就是对分词的结果进行筛选,例如中文中将“的”“呀”这些对句子主体意思影响不大的词删除。英语中类似的就是"is","a"等等。通常在索引和分词两端应该采用同样的分词器。solr自带了一些分词器,如果你需要使用自己公司的分词器,那么就需要修改solr模式(Solr schema)。

    schema.xml 文件允许两种方式修改文本被分析的方式,通常只有field类型为 solr.TextField 的field的内容允许定制分析器。

方法一:使用任何 org.apache.lucene.analysis.Analyzer的子类进行设定。

    
[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <fieldtype name="nametext" class="solr.TextField">  
  2.    <analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>  
  3.  </fieldtype>  

 方法二:指定一个TokenizerFactory ,后面跟一系列的TokenFilterFactories(它们将按照所列的顺序发生作用),Factories被用来创建分词器和分词过滤器,它们用于对分词器和分词过滤器的准备配置,这样做的目的是为了避免the overhead of creation via reflection。

  

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <fieldtype name="text" class="solr.TextField">  
  2.   <analyzer>  
  3.     <tokenizer class="solr.StandardTokenizerFactory"/>  
  4.     <filter class="solr.StandardFilterFactory"/>  
  5.     <filter class="solr.LowerCaseFilterFactory"/>  
  6.     <filter class="solr.StopFilterFactory"/>  
  7.     <filter class="solr.PorterStemFilterFactory"/>  
  8.   </analyzer>  
  9. </fieldtype>  


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

   如果你需要使用自己的分词器和过滤器,你就需要自己写一个 factory ,它必须是 BaseTokenizerFactory或BaseTokenFilterFactory的子类。就像下面一样。

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1.   public class MyCustomFilterFactory extends BaseTokenFilterFactory {  
  2.     public TokenStream create(TokenStream input) {  
  3.     return new MyCustomFilter(input);  
  4.   }  
  5. }  

TokenizerFactories

   Solr提供了下列TokenizerFactories(Tokenizers and TokenFilters)

1.solr.KeywordTokenizerFactory

    不管什么内容,整句当成一个关键字
    例如: "http://example.com/I-am+example?Text=-Hello" ==> "http://example.com/I-am+example?Text=-Hello"


2.solr.LetterTokenizerFactory 

    根据字母来分词,抛弃非字母的部分   
    例如:"I can't" ==> "I", "can", "t"

3.solr.WhitespaceTokenizerFactory
     根据空格来分词
     例如:"I do" ==> "I", "do"

4.solr.LowerCaseTokenizerFactory
  根据字母分词,并将所有字母转换成小写,抛弃非字母的部分
    例如:"I can't" ==> "i", "can", "t"

5.solr.StandardTokenizerFactory

     分词举例:  "I.B.M. cat's can't" ==> 
     ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't"
      说明:该分词器,会自动地给每个分词添加type,以便接下来的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token的类型是敏感的。

TokenFilterFactories

1.solr.LowerCaseFilterFactory



将分词小写,不处理非单词部分

例如: "I.B.M.", "Solr" ==> "i.b.m.", "solr".



原文地址:http://blog.csdn.net/dongnan591172113/article/details/23459637

0 0
原创粉丝点击