更新时间:2024-11-29 GMT+08:00

自定义分词过滤器

操作场景

Solr提供了多个默认的分词过滤器,如下:

  • StopFilterFactory:基于停词表来过滤词,默认的停词表(stopwords.txt)已经加入到配置集中;
  • LowerCaseFilterFactory:将大写的词转化为小写;
  • SynonymFilterFactory:基于同义词列表将词进行转化,默认的同义表(synonyms.txt)已经加入到配置集中;
  • UpperCaseFilterFactory:将小写的词转化为大写。

在一些场景下,需要自定义分词过滤器,本章节主要介绍如何实现自定义分词过滤器,以及如何在查询时指定自定义的分词过滤器。

前提条件

已成功安装Solr服务。

操作步骤

  1. 实现自定义分词过滤器。

    1. 继承抽象类TokenFilterFactory。

      需要创建一个新的工厂实现类,重写create函数,返回一个新的过滤器。

      public abstract TokenStream create(TokenStream input);

      例如:

      @Override
      public LowerCaseFilter create(TokenStream input) {
      return new LowerCaseFilter(input);
      }
    2. 继承抽象类TokenFilter。

      需要创建一个新的过滤器类,重写incrementToken函数,对词进行转化。

      public final boolean incrementToken() throws IOException;

      例如:

      @Override
      public final boolean incrementToken() throws IOException {
      if (input.incrementToken()) {
      charUtils.toLowerCase(termAtt.buffer(), 0, termAtt.length());
      return true;
      } else
      return false;
      }
    3. 配置自定义分词过滤器。
      • 将自定义分词过滤器编译打成jar包;
      • 将jar包文件拷贝到集群中每个Solr实例的安装目录下“solr/WEB-INF/lib”中。

        例如,SolrServerAdmin实例的目录为“软件安装路径/FusionInsight_HD_8.3.1/install/FusionInsight-Solr-8.11.2/cluster/SolrServerAdmin/apache-tomcat-xxx/webapps/solr/WEB-INF/lib”。

  2. 查询参数指定分词过滤器。

    在执行查询操作时,可以动态的指定分词过滤器。例如,需要查询name:Solr*,代表name以Solr开头的全部内容。如果希望可以查询出小写的solr,那么可以这样指定查询条件:

    q=name:Solr*&name.filter=solr.LowerCaseFilterFactory

    通过上述查询,可以实现动态的加载分词过滤器LowerCaseFilterFactory。

    如果,要指定自定义的分词过滤器(com.test.ExampleFilterFactory),可以这样指定查询条件:

    q=name:Solr*&name.filter=solr.ExampleFilterFactory。

    • 同一个字段名,指定多个分词过滤器会相互覆盖,以最后指定的为准;
    • 一个查询语句中,不同字段可以同时指定不同的分词过滤器。