Solr Analyzers分析器介绍
摘要: Solr的分析器在检索过程中起着关键作用,这个分析就是提取关键信息的过程,就相当于把我们能看懂的句子转化成Solr能识别的信息。Analyzer用来校验字段的文本并生成标记流token stream. 参见原文
单一的Analyzer
可以在schema.xml
中找到Analyzer的身影,通常来说,在配置solr.TextField
的时候,会指定Analyzer,用一个<analyzer>
标签来声明一个Analyzer,这个属性”class”则派生自org.apache.lucene.analysis.Analyzer
。
例如:
<fieldType name="nametext" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"/>
</fieldType>
这里的WhitespaceAnalyzer
就是一种分析器,负责分析文本字段的内容并生成相应的token。有时,单一的Analyzer就足够用了,但是,大多数情况下都是需要更复杂地分析文本。
组合的Analyzer
对于那些复杂的分析需求,我们可以将其分解成一系列简单的步骤。Solr提供了许多的tokenizers
和filters
来应对一些常见的情景。在实际运用中,可能常见的情况是将analyzer
拆解成一个tokenizers
和多个filters
。
例如:
<fieldType name="nametext" class="solr.TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory"/>
</analyzer>
</fieldType>
这里的前缀solr.
实际上代表的是org.apache.solr.analysis
。没有给<analyzer>
指定一个”class”,而是用一系列的”class”来共同作为一个字段的分析器。文本字段将首先由StandardTokenizerFactory
处理,然后生成的token传入下一个”calss” StandardFilterFactory
处理,直到最后一个EnglishPorterFilterFactory
得到的token作为最终的结果,用于index
或者query
。
Analyzer 的结果影响的是字段的
index
效果,不影响其stored
的值。假如分析器将文本”Those fields”分析成了”they”和”filed”,但是真正存储的值还是”Those fields”。
复杂的Analyzer
一般来说,分析器在两个阶段使用:index和query。索引阶段:在字段创建好后,Analyzer就将token stream添加到索引,并定义好字段的位置position和大小size等信息。查询阶段:将关键词分析以后去字段的索引库匹配。
通常,我们对这两个阶段设置相同的Analyzer。
有时候,有特殊的业务需求,我们需要设置不同的Analyzer。
例如:
<fieldType name="nametext" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
<filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
这个例子中,在index
和query
阶段使用了不同的分析策略。在index
阶段使用更复杂的分析方式,而在query
阶段只简单的处理要查询的关键词可以让检索更准确。
在Solr3.6以后,又加入一种新的分析链analyzer chains,一般定义为<analyzer type="multiterm">
。
在分析某些查询(例如含有通配符、同义词)的时候,Solr使用了特殊的逻辑。对于MultiTermAwareComponents
的分析,Solr可以处理多值(Multi-Term)的字段,但是不属于MultiTermAwareComponents
的,多值字段可能会被忽略。大多数情况下,这样的设计时合理的,但是如果你有特殊的分析需求,需要定义一个multiterm
分析器。
例如:
<fieldType name="nametext" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
<filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<!-- No analysis at all when doing queries that involved Multi-Term expansion -->
<analyzer type="multiterm">
<tokenizer class="solr.KeywordTokenizerFactory" />
</analyzer>
</fieldType>
目前已知的MultiTermAwareComponents:
ArabicNormalizationFilterFactory,
ASCIIFoldingFilterFactory,
CJKWidthFilterFactory,
DecimalDigitFilterFactory,
ElisionFilterFactory,
GermanNormalizationFilterFactory,
GreekLowerCaseFilterFactory,
HindiNormalizationFilterFactory,
IndicNormalizationFilterFactory,
IrishLowerCaseFilterFactory,
LowerCaseFilterFactory,
LowerCaseTokenizerFactory,
MappingCharFilterFactory,
PersianCharFilterFactory,
PersianNormalizationFilterFactory,
ScandinavianFoldingFilterFactory,
ScandinavianNormalizationFilterFactory,
SerbianNormalizationFilterFactory,
SoraniNormalizationFilterFactory,
TurkishLowerCaseFilterFactory,
UpperCaseFilterFactory
还没有评论,来说两句吧...