CDH中的Solr中文分词

Posted wingooom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDH中的Solr中文分词相关的知识,希望对你有一定的参考价值。

下载

https://code.google.com/archive/p/ik-analyzer/downloads

我的solr版本是4.x,根据标签下载文件
IK Analyzer 2012FF_hf1.zip

jar包

解压出jar包:
IKAnalyzer2012FF_u1.jar

在CDH中,正确的jar包目录应该是
/opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p0.3/lib/solr/webapps/solr/WEB-INF/lib

在CM页面上重启solr服务。

更新schema.xml

在core的schema中加入ik分词类型,如下代码需要放在< types>…< /types>中,推荐放在最后

<!--ik analyzer Chinese -->
<fieldType name="text_ik" class="solr.TextField">
    <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

在core的schema中应用我们新定义的类型,如:

<field name=”id” type=”string” indexed=”true” stored=”true” required=”true” />
<field name=”title” type=”text_ik” indexed=”true” stored=”true” termVectors=”true”/>
<field name=”content” type=”text_ik” indexed=”false” stored=”true”/>
<field name=”create_time” type=”date” indexed=”true” stored=”true”/>
<field name=”update_time” type=”date” indexed=”true” stored=”true”/>

当我们创建Collection完成后,如果需要修改schema.xml文件重新配置需要索引的字段可以按如下操作:

  • 如果是修改原有schema.xml中字段值,而在solr中已经插入了索引数据,那么我们需要清空索引数据集,清空数据集可以通过solr API来完成。
  • 如果是在原有schema.xml中加入新的索引字段,那么可以跳过1,直接执行:


$ solrctl instancedir --update collection_test_1 $HOME/solr_configs  
$ solrctl collection --reload collection_test_1

测试

在solr界面进行测试

这里默认的是细粒度划分。

IK Analyzer是一款结合了词典和文法分析算法的中文分词组件,基于字符串匹配,支持用户词典扩展定义,支持细粒度和智能切分,比如:

张三说的确实在理
智能分词的结果是:

张三 | 说的 | 确实 | 在理


最细粒度分词结果:

张三 | 三 | 说的 | 的确 | 的 | 确实 | 实在 | 在理


修改配置文件schema.xml

<field name="content" type="text_ik" indexed="true" stored="true"/> 

<fieldType name="text_ik" class="solr.TextField">
      <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
      <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

查询采用IK自己的最大分词法,索引则采用它的细粒度分词法.


以下部分为摘抄,还没作实际测试。暂存为笔记。待以后留用。

默认分词器进行最细粒度切分。IKAnalyzer支持通过配置IKAnalyzer.cfg.xml 文件来扩充您的与有词典以及停止词典(过滤词典),只需把IKAnalyzer.cfg.xml文件放入class目录下面,指定自己的词典mydic.dic.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">   
<properties>   
  <comment>IK Analyzer 扩展配置</comment> 
  <!--用户可以在这里配置自己的扩展字典  -->  
  <entry key="ext_dict">/mydict.dic; 
/com/mycompany/dic/mydict2.dic;</entry>  

   <!--用户可以在这里配置自己的扩展停止词字典--> 
  <entry key="ext_stopwords">/ext_stopword.dic</entry>    
</properties>

事实上前面的FieldType配置其实存在问题,根据目前最新的IK版本IK Analyzer 2012FF_hf1.zip,索引时使用最细粒度分词,查询时最大分词(智能分词)实际上是不生效的。

据作者linliangyi说,在2012FF_hf1这个版本中已经修复,经测试还是没用,详情请看此贴。

解决办法:重新实现IKAnalyzerSolrFactory

package org.wltea.analyzer.lucene;

   import java.io.Reader;
   import java.util.Map;

   import org.apache.lucene.analysis.Tokenizer;
   import org.apache.lucene.analysis.util.TokenizerFactory;
   //lucene:4.8之前的版本
   //import org.apache.lucene.util.AttributeSource.AttributeFactory;
   //lucene:4.9
   import org.apache.lucene.util.AttributeFactory;

   public class IKAnalyzerSolrFactory extends TokenizerFactory

       private boolean useSmart;

       public boolean useSmart() 
           return useSmart;
       

       public void setUseSmart(boolean useSmart) 
           this.useSmart = useSmart;
       

        public IKAnalyzerSolrFactory(Map<String,String> args) 
            super(args);
            assureMatchVersion();
            this.setUseSmart(args.get("useSmart").toString().equals("true"));
          


       @Override
       public Tokenizer create(AttributeFactory factory, Reader input) 
           Tokenizer _IKTokenizer = new IKTokenizer(input , this.useSmart);
           return _IKTokenizer;
       

   

重新编译后更新jar文件,更新schema.xml文件:

<fieldType name="text_ik" class="solr.TextField" >
        <analyzer type="index">
            <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" useSmart="false"/>
        </analyzer> 
        <analyzer type="query">
            <tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" useSmart="true"/>
        </analyzer> 
</fieldType>

solr创建索引

创建集合curl
http://slave1:8983/solr/admin/collections?action=CREATE&name=hbase-forecast&numShards=3&replicationFactor=2&maxShardsPerNode=6

参考

http://www.importnew.com/12918.html

https://geosmart.github.io/2015/09/01/%E5%9F%BA%E4%BA%8ESolr%E7%9A%84Hbase%E4%BA%8C%E7%BA%A7%E7%B4%A2%E5%BC%95/

http://suroot.cn/345.html

以上是关于CDH中的Solr中文分词的主要内容,如果未能解决你的问题,请参考以下文章

solr 4.9 中文分词配置

Solr05-Solr在实际开发中的应用

solr php里中文分词怎么用

Solr7.3.0入门教程,部署Solr到Tomcat,配置Solr中文分词器

solr ik分词怎样取消英文字母和数字分词

solr facet 如何不分词