Solr Analyzers分析器介绍

墨蓝 2022-07-12 03:20 756阅读 0赞

摘要: Solr的分析器在检索过程中起着关键作用,这个分析就是提取关键信息的过程,就相当于把我们能看懂的句子转化成Solr能识别的信息。Analyzer用来校验字段的文本并生成标记流token stream. 参见原文

单一的Analyzer

可以在schema.xml中找到Analyzer的身影,通常来说,在配置solr.TextField的时候,会指定Analyzer,用一个<analyzer>标签来声明一个Analyzer,这个属性”class”则派生自org.apache.lucene.analysis.Analyzer
例如:

  1. <fieldType name="nametext" class="solr.TextField">
  2. <analyzer class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"/>
  3. </fieldType>

这里的WhitespaceAnalyzer就是一种分析器,负责分析文本字段的内容并生成相应的token。有时,单一的Analyzer就足够用了,但是,大多数情况下都是需要更复杂地分析文本。

组合的Analyzer

对于那些复杂的分析需求,我们可以将其分解成一系列简单的步骤。Solr提供了许多的tokenizersfilters来应对一些常见的情景。在实际运用中,可能常见的情况是将analyzer拆解成一个tokenizers和多个filters

例如:

  1. <fieldType name="nametext" 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.EnglishPorterFilterFactory"/>
  8. </analyzer>
  9. </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。
例如:

  1. <fieldType name="nametext" class="solr.TextField">
  2. <analyzer type="index">
  3. <tokenizer class="solr.StandardTokenizerFactory"/>
  4. <filter class="solr.LowerCaseFilterFactory"/>
  5. <filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
  6. <filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
  7. </analyzer>
  8. <analyzer type="query">
  9. <tokenizer class="solr.StandardTokenizerFactory"/>
  10. <filter class="solr.LowerCaseFilterFactory"/>
  11. </analyzer>
  12. </fieldType>

这个例子中,在indexquery阶段使用了不同的分析策略。在index阶段使用更复杂的分析方式,而在query阶段只简单的处理要查询的关键词可以让检索更准确。

在Solr3.6以后,又加入一种新的分析链analyzer chains,一般定义为<analyzer type="multiterm">
在分析某些查询(例如含有通配符、同义词)的时候,Solr使用了特殊的逻辑。对于MultiTermAwareComponents的分析,Solr可以处理多值(Multi-Term)的字段,但是不属于MultiTermAwareComponents的,多值字段可能会被忽略。大多数情况下,这样的设计时合理的,但是如果你有特殊的分析需求,需要定义一个multiterm分析器。
例如:

  1. <fieldType name="nametext" class="solr.TextField">
  2. <analyzer type="index">
  3. <tokenizer class="solr.StandardTokenizerFactory"/>
  4. <filter class="solr.LowerCaseFilterFactory"/>
  5. <filter class="solr.KeepWordFilterFactory" words="keepwords.txt"/>
  6. <filter class="solr.SynonymFilterFactory" synonyms="syns.txt"/>
  7. </analyzer>
  8. <analyzer type="query">
  9. <tokenizer class="solr.StandardTokenizerFactory"/>
  10. <filter class="solr.LowerCaseFilterFactory"/>
  11. </analyzer>
  12. <!-- No analysis at all when doing queries that involved Multi-Term expansion -->
  13. <analyzer type="multiterm">
  14. <tokenizer class="solr.KeywordTokenizerFactory" />
  15. </analyzer>
  16. </fieldType>

目前已知的MultiTermAwareComponents:
ArabicNormalizationFilterFactory,
ASCIIFoldingFilterFactory,
CJKWidthFilterFactory,
DecimalDigitFilterFactory,
ElisionFilterFactory,
GermanNormalizationFilterFactory,
GreekLowerCaseFilterFactory,
HindiNormalizationFilterFactory,
IndicNormalizationFilterFactory,
IrishLowerCaseFilterFactory,
LowerCaseFilterFactory,
LowerCaseTokenizerFactory,
MappingCharFilterFactory,
PersianCharFilterFactory,
PersianNormalizationFilterFactory,
ScandinavianFoldingFilterFactory,
ScandinavianNormalizationFilterFactory,
SerbianNormalizationFilterFactory,
SoraniNormalizationFilterFactory,
TurkishLowerCaseFilterFactory,
UpperCaseFilterFactory

发表评论

表情:
评论列表 (有 0 条评论,756人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Solr Analyzers分析器介绍

    摘要: Solr的分析器在检索过程中起着关键作用,这个分析就是提取关键信息的过程,就相当于把我们能看懂的句子转化成Solr能识别的信息。Analyzer用来校验字段的文本并生成