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遇到這些詞彙,不只對其進行分詞,還會把它總體做爲一個語彙單元建立索引。

咱們作下測試:

相關文章
相關標籤/搜索