首页 > 学院 > 开发设计 > 正文

Solr Analyzers分析器介绍

2019-11-09 15:29:35
字体:
来源:转载
供稿:网友

摘要: 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提供了许多的tokenizersfilters来应对一些常见的情景。在实际运用中,可能常见的情况是将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>

这个例子中,在indexquery阶段使用了不同的分析策略。在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


上一篇:WebRTC音频

下一篇:WebRtc 之P2C的建立

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表