solr中的Analyzers, Tokenizers,和Token Filters详解
当一个文档索引了以后,其个别field的分析analyzing 和标过滤器tokenizing filters,可以变换和规范中的数据域。例如:去除空格,去除html标签,去除注释,删除一个特定的字符和取代它与另一个字符,在索引的时候以及在查询时,您可能需要做一些上述或类似的操作。例如:你可能会执行一个soundex变换(一种语音散列)对一个字符串使搜索基于词和其上的声音一样”。
下面的列表提供了一个概述的一些更为频繁使用的分析器和tokenfilters,solr提供了利用他们的实例,本表绝对不应该认为是所有分析类可以在solr的“完整”的名单!除了新的类的基础上不断增加,你可以加载自己的自定义分析代码作为一个插件。详细请见【solr插件.doc】。
分析仪Analyzers,每个字段的类型,都在solr的schema.xml中配置。
更多的Tokenizers 和TokenFilters 请参考luence的官方APIdoc,或者solr的api文档。查看 analyzer-*.下面的类,
对于一些特定语言的分析器和tokenfilters Solr可用信息,请查看languageanalysis。见文档【solr语言分析器.doc】。
高层次的概念
Stemming
有不同类型的所产生的策略。这有一种方式,Lucene/Solr都使用stemming通过减少得到支持,因此必须应用在索引和查询的一面:
<!--[if !supportLists]-->1、 <!--[endif]-->Porter是一个转化算法,减少了英语语言中的任何一个字,如“walks,walking,walked的形式”,其元素根如,“walk”。 Porter是基于规则的和不需要一本字典。
<!--[if !supportLists]-->2、 <!--[endif]-->kstem,为英语语言的一个不太积极的替代Porter
<!--[if !supportLists]-->3、 <!--[endif]-->而Snowball提供几种语言,包括两个实现的Porter波特算法。Snowball雪球是一小串处理语言设计用于创建词干提取算法。。
<!--[if !supportLists]-->4、 <!--[endif]-->Hunspell提供stemming所有语言,OpenOffice的拼写检查词典。在基于词典的,它需要高质量和良好的字典来阻止-在这种情况下,它可以提供更精确的stemming比Snowball雪球算法很好地工作。
一个相关的技术所产生的是词干提取,这使得“堵塞”的扩张,以一个词根和扩张它的各种形式。词干提取可以在插入时或查询时间。Lucene/Solr没有lemmatization的内置支持,但它可以通过你自己的字典和synonymfilterfactory模拟
请参加有关所产生的各种语言的细节languageanalysis。见文档【solr语言分析器.doc】。
一个重复的问题是“我怎样才能有原始项贡献stemmed version比更多的得分”?在solr4.3中,keywordrepeatfilterfactory已添加了这个功能。此过滤器发出的每个输入令牌的两个标记,其中之一是标注关键字属性。词干分析器,尊重关键字属性将通过令牌无变化。所以这个滤镜的效果将是指数字和stemmed的版本。4所有上面列出的所有方面的关键字属性。
如果term不想被stemming改变,这将导致在相同的令牌重复的文件,。这可以通过增加removeduplicatestokenfilterfactory缓解。
<fieldType name="text_keyword" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.KeywordRepeatFilterFactory"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldType>
Analyzers
分析仪的组件,在index时间 add/or 在搜索时间前处理输入文本。重要的是使用相同或类似的分析,处理文本以兼容的方式在索引和查询时间。例如:如果一个索引分析仪相同的话,那么查询分析器也应使查找索引相同。
在通配符和模糊搜索,没有对搜索词进行文本分析。
大多数用户定义自定义Solr分析仪的文本字段类型,由零个或多个字符过滤工厂,一个定制的工厂,和零个或多个令牌过滤工厂;但它也可以配置一个字段类型使用一个具体的分析器的实现
Solr的Web管理界面可以用来显示文本分析的结果,即使结果分析各阶段后,
Char Filters
char滤器是预处理过程的输入字符的一部分(消费和生产字符流),可以添加,更改或删除字符,同时保留字符位置信息。
Char Filters可以链接。
Tokenizers
Tokenizer将一个字符流(从每个字段值)分割为为一系列的标记。
每一个Analyzer只能使用一个tokenizers。
Token Filters
用Tokens产生的令牌是通过一系列的令牌的过滤器,添加,更改或删除标记。字段是通过令牌流索引。
指定架构中的一个分析器
Solr SCHEMA.XML文件允许两种方法指定一个文本字段分析方式。
1、指定一个分析器类的名称可以是任何org.apache.lucene.analysis.analyzer延伸具有一个默认构造函数,或一个单一的参数的构造函数,以一个Lucene的“版本”的对象
的例子:
<fieldtype name="nametext" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
</fieldtype>
2、指定一个tokenizerfactory然后列出可选tokenfilterfactories所采用的排列顺序。工厂可以创建分析器或令牌的过滤器是用来准备配置为记号化器或过滤器和避免创造的开销,通过反射。
的例子:
<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>
任何分析仪,charfilterfactory,tokenizerfactory,或tokenfilterfactory可能使用其完整的类名和包指定。当您启动应用服务器,只要确保他们在Solr的classpath,。
如果你想使用自定义charfilters,Tokenizers 或tokenfilters,你需要写一个非常简单的工厂,子类basetokenizerfactory或basetokenfilterfactory,像这样的东西…
public class MyCustomFilterFactory extends BaseTokenFilterFactory {
public TokenStream create(TokenStream input) {
return new MyCustomFilter(input);
}
}
当使用一个charfilter vs tokenfilter
有charfilters和tokenfilters具有相关的几对(IE:mappingcharfilter和asciifoldingfilter)或几乎相同的功能(IE:patternreplacecharfilterfactory和patternreplacefilterfactory),它并不总是很明显这是最好的选择。
最终的决定在很大程度上取决于所使用的标记,以及你是否需要“out smart”的字符流的预处理。
例如,也许你有一个标记如standardtokenizer你很高兴它是如何工作的整体,但你想自定义一些特定字符的行为。
在这种情况下,你可以修改规则和重新使用JavaCC构建自己的标记,但也许它更容易只是地图上的一些人物在charfilter标记。
http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#Analyzers