人人IT網

人人IT網

當前位置: 主頁 > 服務器軟件 > Jetty >

Solr 5.x的搭建(Solr自帶的Jetty Server)與mmseg4j中文分詞

時間:2016-07-03 19:38來源:Internet 作者:Internet 點擊:
前言:        如果你對Solr怎麼和Tomcat 集成以及如何使用mmseg4j和自定義的詞庫豐富完善中文分詞,可以参照我的其它與Solr相關的博客。這篇將以簡練的方式给出如何搭建Solr5.

前言:

 

     如果你對Solr怎麼和Tomcat 集成以及如何使用mmseg4j和自定義的詞庫豐富完善中文分詞,可以参照我的其它與Solr相關的博客。這篇將以簡練的方式给出如何搭建Solr5.x的服務(以截止目前为止最新的Solr5.3为例),而且將使用Solr自帶的Jetty Server,而不是集成tomcat。

 

一、准備條件

Solr5.x必須建立在JDK1.7的版本以上,先檢查並確定安裝正確的JDK。

 

$ java -version
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)

 

 

二、下載Solr

http://go.rritw.com/lucene.apache.org/solr/ , 選擇download,並選擇下載solr 最新的5.3.1版本。



 

如果是非windows版本的操作系統,如linux,OS,unix等選擇下載slor-5.3.1.tgz,如果需要查看相關源碼,可以選擇solr-5.3.1-src.tgz並導入自己的eclipse等IDE開發工具中。本例中以linux系統为例說明。

 

 

三、安裝solr5.x

1、解壓tgz包

 

tar zxf solr-5.3.1.tgz

 

 2. 为操作方便將Solr5.3.1重命名为Solr5: 

 

   

mv solr5.3.1 solr5

 

 

四、可以開始運行Solr了(就是如此簡單)

  1、启動Server

由於是在linux中,所以可以直接使用

$ bin/solr start

 

如果在windows中,使用命令

 

bin\solr.cmd start

 

這兩個命令都是在後台启動solr,由於使用了自帶的Jetty Server,所以启動後的默認端口就是8983.

 

輸入http://192.168.1.157:8983/solr, 即可看到Solr服務已經成功的启動了。



 

從圖中,你也可以看到,Sorl5.3默認使用的Jetty的版本是9.2.11.v20150529,截止目前來說,是很新的版本了。

 

如果想提升jetty的性能,可以在如下的文件夾中進行jetty的配置修改:

 

/root/solr5/server/etc

 

2、使用help命令查看更多的Solr選項

 

bin/solr -help

 如

 

bin/solr start -help

 

3、更多的Solr命令

bin/solr start -f : 以前置的方式启動Solr

 

bin/solr start / restart : 重启當前Solr服務

 

bin/solr start -p 8984 : 在指定的端口启動Solr

 

bin/solr stop -p 8983或者Ctrl +C:如果是以前置的方式启動Solr,則可以用Ctrl+c停止Solr服務,否則可以使用stop命令停止Solr服務。

 

bin/solr status: 檢查Solr是否在運行

 

bin/solr create -c <name> : 創建一個core

 

$ bin/solr create -help: 創建相關的幫助命令

 

如果需要指定Solr启動時JVM等参數,則指定 -a,例如:

 

./solr start -p 44000 -a "-Xss1024k -Xms1024m -Xmx2048m -XX:NewRatio=5"

 

五、整合mmseg4j進行中文分詞

1、關於mmseg4j的介紹,可以参照我的別的關於Solr中文分詞的博客。

 

2、mmseg4j支持Solr5需要使用附件的mmseg4j-solr-2.3.0.jar以及mmseg4j-core-1.10.jar,將這兩個jar包放在類似於這样的目錄下:

/root/solr5/server/solr-webapp/webapp/WEB-INF/lib

 

3. 創建一個core: universal

solr create -c universal

 

當在控制台上出現如下log時,表示創建過程沒有什麼問題:

Creating new core 'universal' using command:

http://localhost:8983/solr/admin/cores?action=CREATE&name=universal&instanceDir=universal

 

{

  "responseHeader":{

    "status":0,

    "QTime":2357},

 

  "core":"universal"}

 

在Solr Admin中可以看到新創建的univeral的信息:



 4、開始集成mmseg4j:

       進入該目錄:/root/solr5/server/solr/universal/conf,修改其中managed-schema(在5.0前,該文件是shcema.xml,當然可以將該文件重命名为schema.xml,但不建議這麼做),加入下面的內容並重启Solr,即可在Solr Admin 的console中看到新增的這些field了。

 

  需要注意的是,將dicPath的值修改为相應的值。

 

<!-- mmseg4j-->
     <field name="mmseg4j_complex_name" type="text_mmseg4j_complex" indexed="true" stored="true"/>
     <field name="mmseg4j_maxword_name" type="text_mmseg4j_maxword" indexed="true" stored="true"/>
     <field name="mmseg4j_simple_name" type="text_mmseg4j_simple" indexed="true" stored="true"/>

     <fieldType name="text_mmseg4j_complex" class="solr.TextField" positionIncrementGap="100" >
        <analyzer>
           <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="/root/solr5/server/solr/universal/conf"/>
           <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
         </analyzer>
     </fieldType>
     <fieldType name="text_mmseg4j_maxword" class="solr.TextField" positionIncrementGap="100" >
          <analyzer>
            <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="max-word" dicPath="/root/solr5/server/solr/universal/conf"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
          </analyzer>
      </fieldType>
      <fieldType name="text_mmseg4j_simple" class="solr.TextField" positionIncrementGap="100" >
          <analyzer>
            <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="simple" dicPath="/root/solr5/server/solr/universal/conf"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
          </analyzer>
      </fieldType>
<!-- mmseg4j-->

 

重启Solr 後,即可在新創建的univeral這個core的Analysis中看到mmseg4j新增的field



 

 

5、 修改stopwords:如將助詞的、地、得等加到stopwords.txt中。

如在將“的”加入stopwords.txt之前,“我們的中國”的分詞結果为:



 在/root/solr5/server/solr/universal/conf目錄下中的stopwords.txt中加入“的”字和“我們”後,重新執行上面的分詞,可以看到:



 
 可以看出“我們”和“的”已經作为停止詞,不在出現在分詞結果中。

 

6、修改詞庫,增加更多的中文分詞,mmseg4j默認是使用mmseg4j-core-1.10.0.jar中的words.dic,總共只有不到15萬的中文詞,而整理一個中文詞庫,位於上面dic指定的目錄下/root/solr5/server/solr/universal/conf,總共有71萬的詞庫,包括搜狗詞庫,庖丁詞庫,以及一些名人詞庫,如果需要增加更多的中文詞,只需要在其中增加即可。如果需要該詞庫,可以给我留言,我會發出來,總共有將近8m,作为附件太大。

     在使用該詞庫前,如果對“林書豪來中國了”進行分詞,得到的結果是:



 你會看到,分詞並不准確,將林書豪作为3個字拆成了“林”,“書”,“豪”,而不是作为一個整體“林書豪”。

 

使用我自己整理的中文分詞後,即本例中將word.dic拷貝到目錄:

/root/solr5/server/solr/universal/conf 並重启solr重新進行分詞分析後結果为:



  

這样Solr5.x和mmseg4j的集成就基本完成了,如果有什麼分詞不對的,可以借助Solr Admin並修改words.dic解决問題。

 

 

9、mmseg4j-complex和mmseg4j-maxword的區別

     如果你使用我歸納好的中文詞庫或者其它中文詞庫並借助Solr Admin進行分析,你會發現mmseg4j-complex算法搜索的精確度更高,而mmseg4j-maxword算法搜索出的內容會更多。

       我們假定我們的分詞庫中存在着”林書豪“,”書豪“,”林書“3個詞。

在mmseg4j-complex算法中,"林書豪"會被完整分詞为"林書豪",而mmseg4j-maxword中由於只支持兩個字的分詞,“林書豪”會被分詞为“林書”,“書豪”。這也就以为這如果你選的是mmseg4j-complex算法,你要搜索出含有“林書豪”的內容,則你必須完整的輸入“林書豪”才會能夠搜得出結果,而在mmseg4j-maxword算法中,你只需要輸入“林書”或者“書豪”就可以得出想要的結果了。

         所以在實際開發過程中,我們常常需要在精度和廣度之間得出權衡的時候,可以選擇性的豐富詞庫,更改詞庫,比我我希望輸入“林書”或者“書豪”的時候就可以得到我想要的結果,那麼我就可以在詞庫中加入“林書”和“書豪”,並且使用mmseg4j-maxword算法,但是我希望的是輸入完整的林書豪才能得到我希望的搜索結果,那麼就需要使用mmseg4j-complex算法,而且詞庫中需要加入“林書豪”。

 

 10、在words.dic中分詞的順序是很重要的,比如對於上面的例子“林書豪來中國了”,如果選擇mmseg4j-complex算法,並且在詞庫的最後加入“來中國”,那麼你可以看到分詞的結果为後面的”來中國“將替代前面的“中國”。

 

 

 11、 基於上面的分析,我們還可以得出更好的words.dic詞庫,如果我們確定我們整個項目中都選擇mmseg4j-maxword算法,那麼我詞庫中就只需要最多兩個字的詞就行了,比如講三個字的“林書豪”拆分成“林書”和"書豪“,將四個字的”邁克乔丹“,拆分成”邁克“,”乔丹“。當然如果兩種算法都有可能用到,即有些字段我們希望用mmseg4j-complex算法來進行分詞,有的字段我們希望用mmseg4j-maxword來進行分詞,那麼最好是將2個字的次放在最後,將3個字或者4個字的詞放在前面,這样就行程了一個具有150萬中文詞的詞庫了。

 

 

 

 

 

 

        


From:ITEYE
頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
發表評論
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
評價:
表情:
驗證碼:點擊我更換圖片
欄目列表
推薦內容