solr6使用ansj做中文分词

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>

< fieldType  name = "text"  class = "solr.TextField" >
   < analyzer  type = "index" >
     < tokenizer  class = "solr.StandardTokenizerFactory" />
     < filter  class = "solr.StandardFilterFactory" />
   </ analyzer >
</ fieldType >

class属性命名一个工厂类,在需要时将实例化一个tokenizer对象。令牌工厂类实现org.apache.solr.analysis.TokenizerFactoryTokenizerFactory的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











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值