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

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

一个schema.xml可以有两种方式对一个字段进行处理:

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


<fieldtype name="nametext" class="solr.TextField">
  <analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
</fieldtype>

方法二:指定一个TokenizerFactory ,后面跟一系列的TokenFilterFactories, Factories被用来创建分词器和分词过滤器,它们用于对分词器和分词过滤器的准备配置:


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

  <analyzer>
    <charFilter class="solr.HTMLStripCharFilterFactory"/>
    <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.StopFilterFactory"/>
    <filter class="solr.PorterStemFilterFactory"/>
  </analyzer>

</fieldtype>

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

public class MyCustomFilterFactory extends TokenFilterFactory {
  public TokenStream create(TokenStream input) {
    return new MyCustomFilter(input);
  }
 

自定义一个Analyzer需要继承Analyzer,一个自定义CharFilter需要继承CharFilterFactory,自定义Tokenizer需要继承TokenizerFactory,自定义Filter需要继承

TokenFilterFactory, 分析器分为索引和查询时,也可以不指定type属性值,分析器中可以选用多个字符过滤器(charFilter),通常是大小写转换,在过滤器之后是分词器

(Tokenizer),分词器会将字符流切分成词元系列,通常用在空格处切分这种简单的算法,后面可以在跟上tokenFilter,会对词元进行各种操作,最后产生的词元会被称为词,

即用于实际索引和查询的单位,注意有些词元过滤器如WordDelimeterFilterFactory也进行分词操作。

WhitespaceAnalyzer:仅仅是去除空格,对字符没有lowcase化,不支持中文,会保留原文中的破折号,以空格为边界,将空格间的内容切分为最小的语汇单元。

SimpleAnalyzer:功能强于WhitespaceAnalyzer,将所有的字符lowcase化,不支持中文,保留停用词,并以非字母字符作为单个语汇单元的边界。

StopAnalyzer:StopAnalyzer的功能超越了SimpleAnalyzer,在SimpleAnalyzer的基础上增加了去除StopWords的功能,不支持中文

StandardAnalyzer:英文的处理能力同于StopAnalyzer,保留XY&Z形式的单词,且会把email地址保留下来。支持中文采用的方法为单字切分。

Character Filter

MappingCharFilterFactory:它是一个查找,替换的功能。

HTMLStripCharFilterFactory:去除HTML与XML标记,只留下文本内容,移除脚本内容和格式元素,转义过的特殊字符被还原。

PatternReplaceCharFilterFactory:根据pattern属性中的正则表达式进行查找,并根据replacement属性中的值进行替换。它的实现需要一个缓冲区容器,默认设置为10000个字符,

可以通过maxBlockChars进行配置。分词器和词元过滤器中也有正则表达式组件。所以你应该只在会影响分词的影响下使用它,比如对空格进行处理

Tokenization

KeywordTokenizerFactory:这个分词器不进行任何分词!整个字符流变为单个词元。String域类型也有类似的效果

WhitespaceTokenizerFactory:文本由空字符切分(即,空格,Tab,换行)。

StandardTokenizerFactory:它是一个对大部分西欧语言通常的分词器。它从空白符和其它Unicode标准中的词分隔符处进行切分。空白符和分隔符会被移除。连字符也被认为是词

的分隔符,这使得它不适合与WordDelimiterFilter一起用

UAX29URLEmailTokenizer:它表现的与StandardTokenizer相似,但它多了一个识别e-mailURL并将它们视为单个词元的特性

ClassicTokenizerFactory:对英语来说,它优于StandardTokenizer。它可以识别有点号的缩写词,比如I.B.M.。如果词元中包含数字它不会在连字符处分词,并可以将Email地址和主

机名视为单个词元。并且ClassicFilter词元过滤器经常与这个分词器配合使用。ClassicFilter会移除缩写词中的点号,并将单引号(英语中的所有格)去除。它只能与ClassicTokenizer

一起使用。

LetterTokenizerFactory:这个分词器将相邻的字母(由Unicode定义)都视为一个词元,并忽略其它字符

LowerCaseTokenizerFactory:这个分词器功能上等同于LetterTokenizer加上LowerCaseFilter,但它运行更快

PatternTokenizerFactory:这个基于正则表达式的分词器可以以下面两种方式工作:

1.通过一个指定模式切分文本,例如你要切分一个用分号分隔的列表,你可以写:<tokenizer class="solr.PatternTokenizerFactory" pattern=";*" />.

2. 只选择匹配的一个子集作为词元。比如:<tokenizer class="solr.PatternTokenizerFactory" pattern="\'([^\']+)\'" group="1" />。组属性指定匹配的哪个组将被视为词元。如果你输入

的文本是aaa ‘bbb’ ‘ccc’,那么词元就是bbbccc

PathHierachyTokenizerFactory:

这是一个可配置的分词器,它只处理以单个字符分隔的字符串,比如文件路径和域名。它在实现层次Faceting中很有用,或是可以过滤以某些路径下的文件。比如输入字符串是

/usr/local/apache会被分词为三个词元:/usr/usr/local/usr/local/apache。这个分词器有下面四个选项:

Delimiter:分隔字符:默认为/

Replace:将分隔字符替换为另一字符(可选)

Reverse:布尔值表明是否层次是从右边开始,比如主机名,默认:false

Skip:忽略开头的多少个词元,默认为0.

WikipediaTokenizerFactory:一个用于Mediawiki语法(它用于wikipedia)的实验性质的分词器。

Token Filter

WordDelimiterFilter:这个过滤器可以通过多种配置指定如切分和连接合成词,并有多种定义合成词的方法。这个过滤器通常与WhitespaceTokenizer配合,而不是

StandardTokenizer。这个过滤器的配置中1是设置,0是重置

SnowballPorterFilterFactoryPorterStemFIlterFactoryKStemFilterFactory,EnglishMinimalStemFilterFactory等过滤器




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值