主頁 > 服務器技術 > Drupal集成ApacheSolr-3.x以及中文分詞處理

Drupal集成ApacheSolr-3.x以及中文分詞處理

PDF版本

本文主要講解drupal和Apache solr-3.x的集成以及對中文分詞的處理,如需詳細了解drupal Search以及Apache Solr的工作原理,請參閱前文《Drupal北京聚會主題之 – Apache Solr》。

在默認情況下,Drupal6使用的是Apache Solr 1.4版本,但是Apache Solr新版本已經升級到了3.x,所以1.x版本可能會慢慢不再支持,所以升級到Apache Solr 3.x還是很有必要的,我們這里做一下簡要的介紹以及在Drupal Apachesolr中如何處理中文分詞的相關問題。

升級到apachesolr 3.x

由于版本的兼容問題,我們選擇第一個3.x版本,Apache Solr-3.1.0作為Apache Solr的主版本,來與Drupal6一起測試。首先要安裝Drupal的Apachesolr模塊,具體的安裝操作在Drupal Apchesolr模塊的README.txt里面有詳細說明,在這只大概列舉一下。

  1. 下載apachesolr模塊
  2. 下載SolrPhpClient包,具體參考apacheslor README文件
  3. 從Apache網站下載solr包
  4. 把drupal apachesolr中的schema.xml和solrconfig.xml拷貝到solr的example/solr/conf/下(注意備份源文件)
  5. 到solr的example下,java -jar start.jar 啟動SOLR


在筆者測試3.1.0的過程中,沒有發現不兼容的情況,一切能正常工作。但是Solr 3.1.0帶來了幾個新的字段類型,在默認的schema文件并沒有體現,所有我們可以把這幾個字段添加到schema文件中。

<fieldType name="point" dimension="2" subFieldSuffix="_d"/>
<fieldType name="location" subFieldSuffix="_coordinate"/>
<fieldtype name="geohash"/><field name="coordinates" type="location" indexed="true" stored="true"/>
<dynamicField name="*_coordinate"? type="tdouble" indexed="true"? stored="false"/>

其中主要是location字段,用于標記坐標值。然后可以寫自定義代碼,把這種location字段添加到apachesolr的document中。

function MYMODULE_apachesolr_update_index(&$document, $node) {
  // check for location data
  if (empty($node->field_location[0]['latitude']) || empty($node->field_location[0]['longitude'])) {
     $document->coordinates = $node->field_location[0]['latitude'] . ','
     . $node->field_location[0]['longitude'];
  }
  return;
}

注意:由于升級的原因,一些舊的類可能被棄用,所以在啟動的時候,我們能發現很多類似下面的warning,如何修正,請參閱Solr官方文檔說明。

LowerCaseFilterFactory is using deprecated

中文分詞以及搜索

安裝中文分詞包

中文分詞我們選擇IKAnalyzer包,官方地址:http://code.google.com/p/ik-analyzer/

IKAnalyzer是一個開源的,基于java語言開發的輕量級的中文分詞工具包。最初,它是以開源項目Luence為應用主體的,結合詞典分詞和文法分析算法的中文分詞組件。新版本的IKAnalyzer3.0則發展為面向Java的公用分詞組件,獨立于Lucene項目,同時提供了對Lucene的默認優化實現。

注意:本文中使用的是最新版本,3.2.8版本。

下載好jar包之后,放到solr/WEB-INF/lib。

注意:如果是使用的是一個單獨的solr.war文件,沒法打開WEN-INF/lib文件夾,需要把jar放到servlet能加載到的地方。也可以把IKAnalyzer包重新打包到solr.war里面再部署。筆者使用jetty,把IKAnalyzer放到了jetty自動生成的解壓工程項目下面,如work/Jetty_0_0_0_0_8983_solr.war__solr__k1kf17/WEB-INF/lib。

修改schema文件

使用中文字段有兩種方法,
1. 定義一種新字段類型,類似solr中schema文件里面的注釋,然后把document中的中文字段,設置為該類型。

<fieldType name="text_greek" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
</fieldType>

上面的代碼定義了一種新的類型的字段,如果我們要定義中文字段,只需把上面的analyzer修改成org.wltea.analyzer.solr.IKTokenizerFactory即可。
比如,我們可以定義一種字段類型叫text_zh,然后在fields里面定義新的field,type設置成text_zh即可。

2. 修改現有字段
為了簡潔,我們可以直接修改FieldType里面對text的定義,把tokenizer全部修改成org.wltea.analyzer.solr.IKTokenizerFactory,然后可以刪掉一些用不上的filter。如下:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
<!--<tokenizer class="solr.WhitespaceTokenizerFactory"/>-->
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>
...

修改完之后,重啟solr服務器。然后在Drupal里面重新運行solr的index,進行測試。

測試結果

無中文分詞包
這個界面是在沒有使用中文分詞時,建立索引之后的頁面,沒有搜索到任何我們想要的結果。
Drupal搜索中文

這里,我們可以使用solr自帶的工具來分析一下,地址如下:

http://127.0.0.1:8983/solr/admin/analysis.jsp

輸入一段中文,結果如下

可見,默認的分詞——按照空格分詞——并不能很好的進行中文分詞,所以我們通過solr根本沒法搜索出我們想要的結果。

中文分詞

這個結果是使用中文分詞包后,重新索引數據后的搜索結果

同樣地,我們可以使用solr自帶的分析工具測試結果 http://127.0.0.1:8983/solr/admin/analysis.jsp

如圖,分詞包工作良好。由于我們還沒有設置相應的過濾詞,所以索引結果里面會出現一些沒有意義的詞,比如“在”、“的”等。具體的設置,IKAnalyzer的文檔里面有詳細的說明,本文就不做贅述。

至此,Drupal6與ApacheSolr-3.1.0的集成以及中文分詞包的安裝測試完成,使用ApacheSolr可以很大的提高Drupal性能,提高網站效率。當然,在具體實踐中可能出現其他相關問題,我們會在以后的篇幅中另行討論。

參考文章:
Drupal北京聚會主題之 – Apache Solr
Geospatial Apache Solr searching in Drupal 6 by upgrading Solr to 3.1
solr 3.4配置中文分詞IKAnalyzer3.2.8

PS:參考新篇 《Apache Solr 快速啟動包以及中文分詞集成


聲明: 本站所有文章歡迎轉載,所有文章未說明,均屬于原創,轉載均請注明出處。
本文有效鏈接: http://www.vczhtn.live/2012/03/drupal-apachesolr3-chinese/
版權所有: Drupal與高性能網站架構 http://www.vczhtn.live


, , , ,

評論:5

發表評論
  1. avatar
    回復 六月飄雪
    12/03/15

    Solr的中文教程真的不錯,謝謝樓主,以后多請教!

  2. avatar
    回復 huboaaa
    12/11/28

    補充一下:使用3.6.x analysis分詞安裝成功了 還要檢查一下輸入和輸出都是UTF-8哦。 可以在 Conf server.xml 文件中檢查一下 <Connector port="8080" protocol="HTTP/1.1" maxHttpHeaderSize="8192" URIEncoding="UTF-8"… 確保有URIEncoding="UTF-8"…

    • avatar
      回復 robbin
      13/11/05

      多謝補充!

  3. avatar
    回復 tony
    15/03/11

    drupal后臺支持內容檢索,如何按照不同的類別劃分呢?比如按照產品名稱、產品關鍵詞、軟文的分類。這些要怎么實現呢?

    • avatar
      回復 robbin
      15/03/11

      用admin_views模塊,或者自建views+exposed filter就能實現,這個用不上solr,基本就是根據內容類型篩選而已。

發表評論

電子郵件地址不會被公開。 必填項已用 * 標注


× 四 = 16

您可以使用這些 HTML 標簽和屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的鏈接
Drupal集成ApacheSolr-3.x以及中文分詞處理 來自 Drupal與高性能網站架構
頂部
安徽福彩15选5走势图