码云: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的第三方分词器IKAnalyzer。web
注:下面操做在Linux下执行,所添加的配置在windonws下依然有效。apache
运行环境tomcat
如下是设置solr中文分词器的方法。服务器
注:开始以前,假定你已经成功登陆solr的界面,并建立了core。app
在使用IKAnalyzer
分词器以前,先说明因为做者在12年以后没有更新,致使旧版本的分词器和新版本的solr6.6.0没法匹配。 所以在源码的基础上作些改动,以兼容新版的solr。webapp
IK中文分词对于数字和英文的分词方式是:一个英文单词为一个语汇单元,一个数值为一个语汇单元。 好比:"2017 IK Analyzer是一个中文分词开源工具包。"这个句话使用IK中文分词后的结果为:工具
因此针对数值和英文单词的部分搜索支持很差。
若是你搜"345"是搜索不出来结果的,固然你可使用lucene查询表达式或者WildcardQuery
使用通配符查询。 可是若是搜索"456 IK Analy",又该如何处理,状况会变得更加复杂。
因此这里针对数值和英文单词作了单字分词,能更好的处理这些状况。
人们常常会由于忘了某些单词或者数字的具体内容,则只输入部份内容
这里把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包中,因此这里第二步能够省略。
此外,
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
,请根具我的路径修改配置文件
<!-- 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
(分析器)中设置了index
和query
说明建立索引和查询的时候都使用分词, 所以若是有特殊要求,能够指定索引和查询时候设置不一样的分词器。
IKTokenizerFactory
是IK原生的分词器
useSmart
:设置是否使用智能分词。默认为false,使用细粒度分词IKTokenFilterFactory
是我作的扩展,以支持数值和英文单词的单字分词,
useSingle
:设置是否对英文和数字单字分词。默认false。useItself
:是否保留英文和数字原语汇单元。默认true。IKAnalyzer.cfg.xml
中咱们配置了扩展词典,同时ext.dic
词典中配置了以下扩展词汇:
诛仙 诛仙2 梦幻诛仙 梦幻诛仙2
solr遇到这些词汇,不只对其进行分词,还会把它总体做为一个语汇单元建立索引。
咱们作下测试: