IKAnalyzer中文分词器,兼容solr6.6.0,优化英文数字细粒度搜索

IKAnalyzer2017_6_6_0

码云:https://git.oschina.net/iicode/IKAnalyzer2017_6_6_0java

Github:https://github.com/ittalks/IKAnalyzer2017_6_6_0git

IKAnalyzer2017_6_6_0.jar下载:https://github.com/ittalks/IKAnalyzer2017_6_6_0/releases/download/v1.0.0/IKAnalyzer2017_6_6_0.jargithub

Solr做为搜索应用服务器,咱们在使用过程当中,不可避免的要使用中文搜索。 如下介绍solr的第三方分词器IKAnalyzerweb

注:下面操做在Linux下执行,所添加的配置在windonws下依然有效。apache

运行环境tomcat

  • Solr:6.6.0
  • 系统 : Linux

如下是设置solr中文分词器的方法。服务器

注:开始以前,假定你已经成功登陆solr的界面,并建立了core。app

新特性

在使用IKAnalyzer分词器以前,先说明因为做者在12年以后没有更新,致使旧版本的分词器和新版本的solr6.6.0没法匹配。 所以在源码的基础上作些改动,以兼容新版的solr。webapp

  • 兼容新版的solr6.6.0;
  • 英文和数据支持单字分词;

IK中文分词对于数字和英文的分词方式是:一个英文单词为一个语汇单元,一个数值为一个语汇单元。 好比:"2017 IK Analyzer是一个中文分词开源工具包。"这个句话使用IK中文分词后的结果为:工具

因此针对数值英文单词的部分搜索支持很差。

若是你搜"345"是搜索不出来结果的,固然你可使用lucene查询表达式或者WildcardQuery使用通配符查询。 可是若是搜索"456 IK Analy",又该如何处理,状况会变得更加复杂。

因此这里针对数值和英文单词作了单字分词,能更好的处理这些状况。

人们常常会由于忘了某些单词或者数字的具体内容,则只输入部份内容

配置IKAnalyzer

这里把Tomcat的路径为/usr/local/apache-tomcat-8.5.5作说明。

1、将 IK Jar包和配置文件上传到Linux系统中,copy IK Jar包到 /usr/local/apache-tomcat-8.5.5/webapps/solr/WEB-INF/lib 目录下。 即copy IK Jar包到solr项目的lib目录下。

cp IKAnalyzer2017_6_6_0.jar /usr/local/apache-tomcat-8.5.5/webapps/solr/WEB-INF/lib/

2、复制配置文件到 solr/WEB-INF/classes目录下(没有classes,则建立)

cp ext.dic IKAnalyzer.cfg.xml stopword.dic /usr/local/apache-tomcat-8.5.5/webapps/solr/WEB-INF/classes/

注意IKAnalyzer.cfg.xml的配置,以启用停用词点和扩展词典。

<?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">ext.dic;</entry> 
	
	<!--用户能够在这里配置本身的扩展中止词字典-->
	<entry key="ext_stopwords">stopword.dic;</entry> 
	
</properties>

这里我特别说明一下,为了方便,我将这三个配置文件集成到了IK Jar包中,因此这里第二步能够省略。

ik_config.png

此外,

  • ext.dic:IK扩展词典;
  • stopword.dic:IK停用词词典。这里,我删除了停用词,以支持停用词的查询;
  • IKAnalyzer.cfg.xml:IK配置文件;

固然,你也能够Fork IKAnalyzer2017_6_6_0, 移除resources目录下的这三个文件,从新打包。而后按照步骤二分别配置。

3、进入solrhome中打开managed-schema文件,添加IKAnalyzer配置。

这里我以修改collection1做为示范。

个人路径配置路径:/usr/local/solrhome/home/collection1/conf,请根具我的路径修改配置文件

solr_config.png

<!-- IKAnalyzer Field-->
<field name="ik_filename" type="IK_cnAnalyzer" indexed="true" stored="true"  multiValued="true"/>
<field name="ik_keywords" type="IK_cnAnalyzer" indexed="true" stored="false" multiValued="true"/>
<field name="ik_content" type="IK_cnAnalyzer" indexed="true" stored="true" multiValued="true"/>

<!-- IKAnalyzer -->
<fieldType name="IK_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
        <filter class="org.wltea.analyzer.lucene.IKTokenFilterFactory" useSingle="true" useItself="false" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
        <filter class="org.wltea.analyzer.lucene.IKTokenFilterFactory" useSingle="true" useItself="false" />
    </analyzer>
</fieldType>

<copyField source="ik_content" dest="ik_keywords"/>
<copyField source="ik_filename" dest="ik_keywords"/>

这里只是举个栗子,请根据我的须要修改配置文件。

配置详解

Analyzer(分析器)中设置了indexquery说明建立索引查询的时候都使用分词, 所以若是有特殊要求,能够指定索引和查询时候设置不一样的分词器。

智能分词&细粒度分词

IKTokenizerFactory是IK原生的分词器

  • useSmart:设置是否使用智能分词。默认为false,使用细粒度分词

单字分词

IKTokenFilterFactory是我作的扩展,以支持数值英文单词的单字分词,

  • useSingle:设置是否对英文和数字单字分词。默认false。
  • useItself:是否保留英文和数字原语汇单元。默认true。

扩展词库

IKAnalyzer.cfg.xml中咱们配置了扩展词典,同时ext.dic词典中配置了以下扩展词汇:

诛仙
诛仙2
梦幻诛仙
梦幻诛仙2

solr遇到这些词汇,不只对其进行分词,还会把它总体做为一个语汇单元建立索引。

咱们作下测试:

相关文章
相关标签/搜索