首页 > 技术文章 > Solr分词

Phovan 2014-01-13 14:19 原文

 

Solr版本:4.3.0。

 

分词器的配置在schema.xml文件,比如如下标签内容:

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
</fieldType>

也就是说,field类型如果指定为“text_general”,那么对该字段对应的值建索引和查询关键词分词时用的都是默认的分词器。默认分词器是按照空格分英文的,对中文会分成一个一个的字,这样的分词和查询体验都不好。

 

改变一:使用solr自带的中文分词器,Solr.SmartChineseSentenceTokenizerFactory

无论安装哪种分词器,大部分都有2个步骤。

1)拷贝jar包到solr的lib中,也就是webapps\solr\WEB-INF\lib目录下。

  smartcn的同步发行包是lucene-analyzers-smartcn-4.3.0.jar,在solr-4.3.0\contrib\analysis-extras\lucene-libs目录下

2)在schemal.xml文件中注册分词器,如下:

<fieldType name="text_smart" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
        <filter class="solr.SmartChineseWordTokenFilterFactory"/>
        <!--  
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.LowerCaseFilterFactory"/>
        -->
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
          -->
    </analyzer>
    <analyzer type="query">
          <!-- 此处配置同上 -->
        <tokenizer class="solr.SmartChineseSentenceTokenizerFactory"/>
        <filter class="solr.SmartChineseWordTokenFilterFactory"/>
        <!--
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        -->
    </analyzer>
</fieldType>

内置的中文分词,问题是:分词不完全。比如“中华人民共和国”,分出来的结果是“中华人民”、“中华人民共和国”,用其他任何词都查不到。

 

改变二:使用外部分词器,如 org.wltea.analyzer.lucene.IKTokenizerFactory

ik,参见如下[2];

mmseg4j,参考如下[3];

paoding,参考如下[3]。

可以灵活配置停用词等。

 

参考:

[1]. solr4.3之配备中文分词smartcn

[2]. solr4.3之配备中文分词IK

[3]. solr从零学习开始

[4]. 当前几个主要的Lucene中文分词器的比较

[5]. mmseg4j 多分词模式与 paoding 分词效果对比

 

推荐阅读