更新时间:2024-11-29 GMT+08:00
自定义分词过滤器
操作场景
Solr提供了多个默认的分词过滤器,如下:
- StopFilterFactory:基于停词表来过滤词,默认的停词表(stopwords.txt)已经加入到配置集中;
- LowerCaseFilterFactory:将大写的词转化为小写;
- SynonymFilterFactory:基于同义词列表将词进行转化,默认的同义表(synonyms.txt)已经加入到配置集中;
- UpperCaseFilterFactory:将小写的词转化为大写。
在一些场景下,需要自定义分词过滤器,本章节主要介绍如何实现自定义分词过滤器,以及如何在查询时指定自定义的分词过滤器。
前提条件
已成功安装Solr服务。
操作步骤
- 实现自定义分词过滤器。
- 继承抽象类TokenFilterFactory。
需要创建一个新的工厂实现类,重写create函数,返回一个新的过滤器。
public abstract TokenStream create(TokenStream input);
例如:
@Override public LowerCaseFilter create(TokenStream input) { return new LowerCaseFilter(input); }
- 继承抽象类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; }
- 配置自定义分词过滤器。
- 继承抽象类TokenFilterFactory。
- 查询参数指定分词过滤器。
在执行查询操作时,可以动态的指定分词过滤器。例如,需要查询name:Solr*,代表name以Solr开头的全部内容。如果希望可以查询出小写的solr,那么可以这样指定查询条件:
q=name:Solr*&name.filter=solr.LowerCaseFilterFactory
通过上述查询,可以实现动态的加载分词过滤器LowerCaseFilterFactory。
如果,要指定自定义的分词过滤器(com.test.ExampleFilterFactory),可以这样指定查询条件:
q=name:Solr*&name.filter=solr.ExampleFilterFactory。
- 同一个字段名,指定多个分词过滤器会相互覆盖,以最后指定的为准;
- 一个查询语句中,不同字段可以同时指定不同的分词过滤器。
父主题: Solr业务常见操作