solr 的分析器,分词器和分词过滤器

【本文基于对此英文网页的理解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的子类进行设定。

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。

  

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的子类。就像下面一样。

  public class MyCustomFilterFactory extends BaseTokenFilterFactory {

  
  

  public TokenStream create(TokenStream input) {

    return new MyCustomFilter(input);

  }

}

 

 

 

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的类型是敏感的。
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,他们由分号加上一个或多个的空格分隔。

<fieldType name="semicolonDelimited" class="solr.TextField">

      <analyzer>

        <tokenizer class="solr.PatternTokenizerFactory" pattern="; *" />

      </analyzer>

   </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"属性来指定,如下。

<fieldtype name="teststop" class="solr.TextField">

   <analyzer>

     <tokenizer class="solr.LowerCaseTokenizerFactory"/>

     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>

   </analyzer>

</fieldtype>

5.       solr.KeepWordFilterFactory【solr1.3】

创建:org.apache.solr.analysis.KeepWordFilter

说明:作用与solr.StopFilterFactory相反,保留词的列表也可以通过”word”属性进行指定。

<fieldtype name="testkeep" class="solr.TextField">

   <analyzer>

     <filter class="solr.KeepWordFilterFactory" words="keepwords.txt" ignoreCase="true"/>

   </analyzer>

</fieldtype>

6.       solr.LengthFilterFactory

创建:solr.LengthFilter

说明:过滤掉长度在某个范围之外的词。范围设定方式见下面。

<fieldtype name="lengthfilt" class="solr.TextField">

  <analyzer>

    <tokenizer class="solr.WhitespaceTokenizerFactory"/>

    <filter class="solr.LengthFilterFactory" min="2" max="5" />

  </analyzer>

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

说明:避免重复处理。

---------------一些属性说明-----------------------------------------------

  1.  <!-- The StrField type is not analyzed, but indexed/stored verbatim.    
  2.        - StrField and TextField support an optional compressThreshold which  
  3.        limits compression (if enabled in the derived fields) to values which  
  4.        exceed a certain size (in characters).  
  5.        name: 字段类型名  
  6.        class: java类名  
  7.        indexed:缺省true。 说明这个数据应被搜索和排序,如果数据没有indexed,则stored应是true。  
  8.        stored: 缺省true。说明这个字段被包含在搜索结果中是合适的。如果数据没有stored,则indexed应是true。  
  9.        sortMissingLast:指没有该指定字段数据的document排在有该指定字段数据的document的后面  
  10.        sortMissingFirst:指没有该指定字段数据的document排在有该指定字段数据的document的前面  
  11.        omitNorms:字段的长度不影响得分和在索引时不做boost时,设置它为true。一般文本字段不设置为true。  
  12.        termVectors:如果字段被用来做more like this 和highlight的特性时应设置为true。  
  13.        compressed:字段是压缩的。这可能导致索引和搜索变慢,但会减少存储空间,只有StrField和TextField是可以压缩,这通常适合字段的长度超过200个字符。  
  14.        multiValued:字段多于一个值的时候,可设置为true。  
  15.        positionIncrementGap:和multiValued一起使用,设置多个值之间的虚拟空白的数量  
  16.     -->  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>