多核心的概念
多核心說白了就是多索引庫。也可以理解為多個"數據庫表"
說一下使用multicore的真實場景,比若說,產品搜索和會員信息搜索,不使用多核也沒問題,這樣帶來的問題是 indexs文件很多,而且產品的索引文件和會員信息的索引文件混在一起,備份也是個問題。 如果使用了多核,那就很輕松了,產品和會員就可使用不同的URL進行提交了,業務上也很清晰,生成的索引文件也不會混在一起,也容易備份。
每個索引庫通過相對獨立的url訪問。
多核心的配置
還記得solr home嗎,既然配置多核心,那么我們可以新建一個目錄作為solr home,從零開始搭建,這樣理解會更深(記得在tomcat中修改solr home路徑)。
我這里使用的solr home路徑為:D:\Installed Applications\SolrIndex,之后將solr解壓,將solr-4.9.0\example\multicore下的所有文件copy到solr home。
可以看到里面有core0和core1兩個核心,和一個solr.xml。core0和core1從名字就可以看出來是兩個示例核心,文件結構非常簡單,就只有兩個文件,schema.xml和solrconfig.xml,所以我們可以根據需要修改或新建核心,只要根據實例核心的目錄結構就好。接下來是schema.xml,這個文件相當於告訴solr,有多少核心和核心的名字及核心的位置:
結構如下:
-
<cores adminPath="/admin/cores" host="${host:}" hostPort="${jetty.port:8983}" hostContext="${hostContext:solr}">
-
<core name="core0" instanceDir="core0" />
-
<core name="core1" instanceDir="core1" />
-
-
<shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
-
<str name="urlScheme">${urlScheme:}</str>
-
</shardHandlerFactory>
-
</cores>
shardHandlerFactory暫時不管,主要修改core,name是核心的名字,instanceDir是核心的路徑,默認是當前目錄,這個最好保持一致,即加入核心名字是core0,那么就在solr home下新建一個core0文件夾,里面放入配置文件,那么這就是一個核心。
我修改后的solr.xml配置如下:
-
<cores adminPath="/admin/cores" host="${host:}" defaultCoreName="Artist" hostPort="${port:8983}" hostContext="${hostContext:solr}">
-
<core name="AritstCategory" instanceDir="AritstCategory" />
-
<core name="Artist" instanceDir="Artist" />
-
<core name="Song" instanceDir="Song" />
-
<core name="SongArtist" instanceDir="SongArtist" />
-
<core name="SongCategory" instanceDir="SongCategory" />
-
<core name="SongMenu" instanceDir="SongMenu" />
-
<core name="SpaceAudio" instanceDir="SpaceAudio" />
-
<core name="SpaceVideo" instanceDir="SpaceVideo" />
-
<core name="SpaceAVNum" instanceDir="SpaceAVNum" />
-
-
<shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
-
<str name="urlScheme">${urlScheme:}</str>
-
</shardHandlerFactory>
-
</cores>
目錄結構如下:
可能大家已經注意到配置有下列內容:
-
<cores adminPath="/admin/cores" host="${host:}" defaultCoreName="Artist" hostPort="${port:8983}" hostContext="${hostContext:solr}">
AdminPath是指url路徑
Host是指主機名
defaultCoreName是指默認使用的核心(不配置也完全可以)
hostPort是指訪問的端口(跟tomcat的端口保持一致)
hostContext是指主機的上下文,也就是webapps中solr的項目名
其實有點像tomcat項目的配置。
多核心的訪問
開啟tomcat服務,訪問:localhost:8983/solr
如下圖所示:
即可看到多個核心。當然也可以在url上訪問不同核心庫:
Localhost:8983/solr/admin/coreName
剛說的defaultCoreName也就是說,如果沒指定訪問的核心,默認訪問哪個核心的作用。
分詞器簡介與配置
Solr默認是沒有中文分詞的,其中solr默認的比較常用的數據類型有下面幾種:string、long、int。詳細的請看我的另外一篇博客:一、Solr綜述
我用的是IK分詞器,是國人做的一個開源的分詞器,所以主要說下IK分詞器的配置。
下載
下載 "IK Analyzer 2012FF_hf1.zip"包。 詳見http://zhengchao730.iteye.com/blog/1833000
解壓
解壓后的目錄結構:
其中已經有比較詳細的文檔了,但是我發現文檔中並沒有對solr分詞器的配置有詳細的說明。所以請讀者繼續往下看。
配置
步驟一:將 IKAnalyzer2012FF_u1.jar拷貝到目錄"$TOMCAT_HOME \webapps\solr\WEB-INF\lib"中
步驟二:將IKAnalyzer.cfg.xml、stopword.dic拷貝到目錄$TOMCAT_HOME \webapps\solr\WEB-INF\classes目錄下,沒有則新建classes目錄。
步驟三:在每個核心中的schema.xml中配置IK分詞器:
-
<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分詞器了。
其中isMaxWordLength是指分詞的細粒度,可以分別制定index索引和query查詢的分詞細粒度,建議將index的isMaxWordLength設置為false,這樣就采用最細分詞,是索引更精確,查詢時盡量能匹配,而將query的isMaxWordLength設置為true,采用最大分詞,這樣能夠使查詢出來的結果更符合用戶的需求。
並且還有一點需要特別注意,我用的是solr4.9,所以需要把各核心schema.xml中的<schema name="example core zero" version="1.1">版本由1.1改為1.5
<schema name="example core zero" version="1.5">.
這樣查詢時分詞才能成功,比如搜索中華人民共和國,如果不配置的話,默認是短語匹配,就只搜索文檔中包含中華人民共和國的結果,但是如果配置了查詢分詞,那么中華、人民….都能被匹配。
IK分詞器使用與測試
之后在schema.xml中配置一個field用於測試,如下:
-
<field name="Artist_Name" type="text_ik" indexed="true" stored="true"/>
然后打開solr的admin頁面:
可以看到分詞之后的效果。