摘要: Solr的分析器在检索过程中起着关键作用,这个分析就是提取关键信息的过程,就相当于把我们能看懂的句子转化成Solr能识别的信息。Analyzer用来校验字段的文本并生成标记流token stream. 参见原文
可以在schema.xml
中找到Analyzer的身影,通常来说,在配置solr.TextField
的时候,会指定Analyzer,用一个<analyzer>
标签来声明一个Analyzer,这个属性”class”则派生自org.apache.lucene.analysis.Analyzer
。 例如:
这里的WhitespaceAnalyzer
就是一种分析器,负责分析文本字段的内容并生成相应的token。有时,单一的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”。
一般来说,分析器在两个阶段使用: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
分析器。 例如:
目前已知的MultiTermAwareComponents: ArabicNormalizationFilterFactory, ASCIIFoldingFilterFactory, CJKWidthFilterFactory, DecimalDigitFilterFactory, ElisionFilterFactory, GermanNormalizationFilterFactory, GreekLowerCaseFilterFactory, HindiNormalizationFilterFactory, IndicNormalizationFilterFactory, IrishLowerCaseFilterFactory, LowerCaseFilterFactory, LowerCaseTokenizerFactory, MappingCharFilterFactory, PersianCharFilterFactory, PersianNormalizationFilterFactory, ScandinavianFoldingFilterFactory, ScandinavianNormalizationFilterFactory, SerbianNormalizationFilterFactory, SoraniNormalizationFilterFactory, TurkishLowerCaseFilterFactory, UpperCaseFilterFactory
新闻热点
疑难解答