solr中有自带的中文分词,不过它将中文按一个一个字进行分词,这就导致搜索出的结果让人不满
这里以text_general字段为例,managed-schema中的配置是这样写的:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
生成索引和查询使用的都是solr.StandardTokenizerFactory
官方文档有详细介绍:https://cwiki.apache.org/confluence/display/solr/Tokenizers
您配置的文本字段中键入标记生成器中schema.xml
有一个<tokenizer>
元素,作为一个孩子<analyzer>
:
class属性命名一个工厂类,在需要时将实例化一个tokenizer对象。令牌工厂类实现org.apache.solr.analysis.TokenizerFactory
。TokenizerFactory的create()
方法接受Reader并返回一个TokenStream。当Solr创建标记器时,它传递一个提供文本字段内容的Reader对象。
所以这种默认的分词方式对中文来说并不友好,那么如何在solr中使用自己喜欢的分词方式?tokenizer指定的class工厂类就是切入口
常用的中文分词方式:ik ansj jieba
本人对ansj情有独钟,于是去写TokenizerFactory和Tokenizer,网上的教程大多是对solr4进行中文分词,solr4和solr6中的TokenizerFactory
已经发生了变化,factory创建tokenizer时已经不再需要在构造器中添加input参数,而是自动set进去
经过一番尝试还是没有成功,知道在github上搜到 https://github.com/blueshen/solr-ansj
1.对这个maven project进行小改之后就可以使用了
2.将这个project打包成jar,还有项目中使用到的ansj_seg-5.1.2.jar,放入solr WEB-INF lib下面
3.在managed-schema中添加自定义字段text_ansj
tokenkizer中的class属性指定我们所定义的工厂类
在solradmin界面中看到:solr中的分词结果为_text_保存,这里把text_ansj设置成text_ansj
<field name="_text_" type="text_ansj" multiValued="true" indexed="true" stored="false"/>
4.solrconfig.xml中设置新增字段的默认类型为text_ansj
<processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
<str name="defaultFieldType">text_ansj</str>
设置查询分析字段为text_ansj
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">text_ansj</str>
5.重启solr,向solr中添加新字段和值,在solradmin中搜索,结果如下:
注意已导入的数据的字段类型设置改为text_ansj