solr学习日记···文本分析-analyzer

solr中文本分析是很重要的一环,它发生在创建索引和搜索两个阶段。
在创建索引阶段,对字段进行文本分析后会产生一个token流,并加入到索引中。
而在查询时,对搜索的值进行分析,并将分析结果与存储在字段索引中的值相匹配,以获取搜索结果。
文本分析的配置同样在schema配置文件中完成,它的元素标签为<analyzer>,属于元素<filedType>的子元素。下面是它的一个普通例子:

<fieldType name="**" class="***">
  <analyzer class="*****"/>
</fieldType>

这里class属性是一个完全限定的Java类名,也就是说文本分析的任务完全交给了一个类来完成。
但是对于一些复杂的文本,一个类肯定是难以满足需求的。这时候我们就需要将一个复杂的分析操作分解成一系列相对简单的步骤。这就需要用到tokenizer和filter。而且solr提供了许多专业的tokenizer类和filter类来处理分析需求。

<fieldType name="**" class="***">
  <analyzer>
    <tokenizer class="***"/>
    <filter class="***"/>
    <filter class="***"/>
  </analyzer>
</fieldType>

class属性中依然是全限定的Java类名,不过在org.apache.solr.analysis包下的类可以直接以solr为前缀。
按以上的配置,文本会按配置的顺序依次产生token,分析过滤。
开头提到过,文本分析发生在创建索引和搜索两个阶段。按上面的例子配置的话表示在这两个阶段采用一样的分析。但有时候我们可能会有不同的分析需求,那么此时就需要按下面的方式配置:

<fieldType name="***" class="***">
  <analyzer type="index">
    <tokenizer class="***"/>
    <filter class="***"/>
    <filter class="***"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="***"/>
    <filter class="***"/>
  </analyzer>
</fieldType>

这里就为索引和搜索配置了不同的分析流程,可以看到主要是依据analyzer标签的type属性值区分。
type属性值还可以取multiterm用来针对如关键字是正则表达式这类术语的查询的分析。
更具体的内容可以参照官网:
https://lucene.apache.org/solr/guide/7_2/analyzers.html#analysis-for-multi-term-expansion

猜你喜欢

转载自blog.csdn.net/qq_19656425/article/details/78923203