HOME 回資訊服務處首頁 Login
2011年第22期
簡訊
【本院殊榮】中央研究院榮獲NGIS流通服務獎
【中心業務】計算中心院區開放成果展公告
【中心業務】99-100年系統科成果
【中心業務】計算中心完成「院區車輛通行卡續卡」系統
【教育訓練】計算中心下(11)月開放報名「資訊推廣」課程公告
【中心業務】計算中心gate電子郵件地址簡化服務於100年10月25日正式上線
【教育訓練】計算中心下(12)月教育訓練程預告
【中心業務】JOURNAL CITATION REPORTS Social Sciences 1999 Edition版本更新通知
【資安通報】Google Chrome 存在多個弱點,請使用者儘速更新!
【資安通報】Adobe Reader /Acrobat 存在多個弱點,請使用者儘速更新!
【資安服務】可疑網站 / 網址分析
【中心業務】辦理ChemBioOffice全院授權採購及驗收
【中心業務】完成2010年西文期刊驗收作業
『教育訓練』數位典藏與學習專業培訓課程即日起開放報名
『展 訊』逗陣來看展-數位鬥陣-99年度數位內容公開徵選計畫成果展
『研討會』歡迎報名【邁向數位元年 – 數位匯流內容示範開發成果分享會】
資訊新知
全文檢索伺服器Solr初探
 
資訊新知 >
上一篇 | 返回電子報
 
全文檢索伺服器Solr初探
 
張錦堂

一、概觀
 全文檢索系統是針對大量文件的內容,可輸入任意字詞的關鍵字及其邏輯運算(AND、OR 、NOT)等,進行快速內文查詢,並提供查詢結果,依其文件符合程度的評分排序或文件相關資訊分類,以便進一步進行統計、分析及彙整的系統。常見的全文檢索的資料對象有新聞、文件報告、期刋、書籍或是網站內容等。

 對內文進行搜尋最簡易的方式就是逐字比對的循序搜尋(Sequential Search)法,但是對於大量的長篇文件搜尋,就會有效率不彰的問題了。全文檢索系統採用索引的方法,也就是先將文件內容切割出字詞單元(token),再將這些字詞以「雜湊表」或「B+樹」等資料結構,建立索引檔,紀錄其文件編號及在文件中出現的位置。在進行查詢時,系統先將輸入的字串,進行字詞單元分析,再將這些字詞一一使用索引快速搜尋,接著將結果依輸入的條件進行邏輯運算,並依在文件中出現的次數等關係計算各結果的權重,最後排序輸出結果。

 某些資料庫系統中,例如MS SQL與Oracle皆有內建簡易的全文檢索功能。但是要進行較為複雜客製化的全文檢索功能,就捉襟見肘了。必須另外採用專業的全文檢索引擎才能達成了。目前開放源碼的專案中已有十年歷史的Lucene是個不錯的選擇。Lucene是Apache基金會開放源碼計畫之一,以Java語言撰寫,具有支援Unicode多國語言,在網路社群中持續發展等優點,並且有眾多的開放源碼系統以其為核心。但缺點是Lucene是以程式庫的方式提供,必需以Java語言撰寫程式才能取用,且功能繁瑣,學習期長,並不易切入進行實作。

 Solr是開放源碼的全文檢索伺服器,以Lucene 程式庫為核心,進行全文資料的索引建立和搜尋執行;並且以HTTP協定的方式提供Web service,方便各種程式語言呼叫。Solr提供強大的設定檔,在不需編寫Java碼的情況下,就可以配置供一般全文檢索用途使用;有特殊需求時,亦可依循其插件(plugin)架構,編寫擴充功能。
Solr原為Apache基金會的子計畫之一,已於2010年併入Lucene計畫中。並於2011年中開始在Lucene中同步發行3.x版,解決了兩者版本落差的問題,更突顯Solr的重要性。

二、系統特性
 Solr主要的特性包括全文檢索、命中標示(hit highlighting)、層面檢索(faceted search)、動態群聚分類(clustering)、資料庫整合、文件(如WORD,PDF檔)處理及空間資料搜尋。Solr具有高度擴充性的架構,提供分散式檢索及索引資料庫複製等功能。許多的大型網站,採用Solr提供搜尋及瀏覽操作的功能。

 Solr使用Lucene搜尋程式庫,並且大幅擴充其功能!具有以下特性:

  1. 使用設定檔定義資料Schema,包含數字類別、動態欄位及唯一鍵(Unique Key)
  2. 擴充Lucene的查詢語法
  3. 層面分類搜尋及縮小範圍過濾功能
  4. 地理空間資料搜尋
  5. 使用設定檔就可設定原始資料文本分析(tokenize)及過濾(字幹處理、停用字)
  6. 可設定的搜尋結果快取(Cache)
  7. 搜尋效能優化
  8. 使用XML格式系統設定檔
  9. 提供系統管理用界面
  10. 提供監視用的系統記錄(Log)
  11. 快速增量式更新及索引複製
  12. 具有可跨數個主機的調配式分散搜尋
  13. 進行索引的原始資料,可使用JSON、XML、CSV /符號分隔的文字檔和二進制檔等格式
  14. 可從本地磁碟或HTTP來源,取得資料庫或XML文件資料,進行索引
  15. 使用Apache Tika進行豐富文件(PDF,WORD,HTML等)解析及索引
  16. 支援多個資料索引
  17. 支援多國語言資料分析

三、系統安裝
 依Solr tutorial(http://lucene.apache.org/solr/tutorial.html)說明,可按步就班安裝Solr系統,以及使用下載檔中的範例schema及範例資料,快速的開始執行系統,進行各項基本系統管理、檢視系統設定、檢視schema設定、進行索引建立、測試各式檢索語法、以及偵錯各項功能等工作,由此可以迅速暸解Solr的運作方式。

 下列步驟說明如何安裝solr 3.3系統、範例schema及範例資料:

  1. 系統需求
      Java 1.5或以上版本,可以在命令列使用java –version檢查系統中現有Java的版本。
  2. 下載Solr
    在Solr首頁(http://lucene.apache.org/solr/)中,點選「Download Solr」,取得一份最新版本的Solr,例如apache-solr-3.3.0.zip。
  3. 安裝步驟
    以Unix環境為例,步驟如下:
    $ ls
    apache-solr-3.3.0.zip
    $ unzip -q apache-solr-3.3.0.zip
    $ cd apache-solr-3.3.0/
  4. 啟動系統
    Solr伺服器可在任何Java Servlet容器中執行。在Solr的example目錄中,已經包含了Jetty Servlet容器、Solr WAR及範例系統設定,可用下列指令啟動服務:
    $ cd example/
    $ java -jar start.jar
    Jetty使用port 8983提供服務,並且在命令列中顯示log資訊。你可以使用瀏覽器讀取http://localhost:8983/solr/admin/,觀察正在執行的Solr,這也是管理介面的進入點,其畫面如下:

圖一、管理介面

四、建立索引資料
 已執行的Solr伺服器中,並無資料存在。可以經由HTTP的方式,post含有指令及資料的XML文件,更新索引檔內容。XML文件中可用的指令包括新增/更新文件、刪除文件、commit尚未寫入的修改及最佳化索引等。

 在Solr系統exampledocs目錄中,附有一些範例資料檔。其中monitor.xml檔內容如下:

<add><doc>
  <field name="id">3007WFP</field>
  <field name="name">Dell Widescreen UltraSharp 3007WFP</field>
  <field name="manu">Dell, Inc.</field>
  <field name="cat">electronics</field>
  <field name="cat">monitor</field>
  <field name="features">30" TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast</field>
  <field name="includes">USB cable</field>
  <field name="weight">401.6</field>
  <field name="price">2199</field>
  <field name="popularity">6</field>
  <field name="inStock">true</field>
  <field name="store">43.17614,-90.57341</field>
</doc></add>
 

 文件中<add>標籤為新增或更新資料的指令,其中<doc>為文件資料內容,<field nam=””>為各欄位資料,一個<add>指令可包含多個<doc>文件。另外可以使用的指令有<delete>、<commit/>及<optimize/>。執行下列指令,即可將monitor.xml檔中的資料建入索引中: 
 $ cd exampledocs
 $ java -jar post.jar monitor.xml
 用同樣的方法可將所有的範例文件建入索引中:
$ java -jar post.jar *.xml

 另外Solr也提供滙入資料庫資料、滙入CSV檔、使用JSON格式、取出Word或PDF檔建入索引、或是使用SolrJ或其他程式語言所撰寫的程式產生資料送入Solr中等等的方法建立索引。

  1. 更新資料
    只要修改XML資料檔內容,再post到Solr即可修改已存入索引的資料。
  2. 刪除資料
    使用delete命令,post到Solr的更新資料網址http://localhost:8983/solr/update,即可刪除符合查詢條件的資料。通常會使用唯一值的欄位,做為選取的條件,例如:
    $ java -Ddata=args -Dcommit=no -jar post.jar "<delete><id>SP2514N</id></delete>"
    就可刪除id欄位值為SP2514N的那筆資料了。

五、管理介面功能
 管理介面(如圖一)各功能說明如下:

  1. SCHEMA:顯示目前系統schema定義檔(example\solr\conf\schema.xml)的內容。
  2. CONFIG:顯示目前系統設定檔(example\solr\conf\ solrconfig.xml)的內容。
  3. ANALYSIS:欄位分析工具。如圖二,輸入欄位類別或名稱、欄位內容及查詢字串。可觀察依schema所設定,該欄位的內容在系統中如何經過那些元件處理後建入索引;及查詢的字串如何被處理,與索引內容比對的結果,是開發階段除錯的絕佳工具。圖中測試名稱為text的欄位,索引的資料首先透過Index Analyzer中的analysis.StandardTokenizerFactory切割為數個token,其中的this因查詢比對成功,而標上藍色底色。

    圖二、欄位分析

  4. SCHEMA BROWSER:schema瀏覽器。Solr中的欄位相關設定分為欄位、動態欄位及欄位類別三類。如圖三顯示欄位大類中的NAME欄位,其類別為TEXT_GENERAL,其屬性為索引(indexed)、單元分析(tokenized)及儲存內容(stored),以及其索引分析器及查詢分析器設定,且已有17個文件使用該欄位。

    圖三、schema瀏覽器

  5. Statistics:顯示目前系統中各元件的名稱、版本及執行狀態。檢查畫面中顯示的numDocs值,可得知Solr系統已儲存幾筆文件。
  6. Make a Query:在「Query string」輸入欄中,使用Solr查詢語法,可進行查詢測試。可使用的基本語法舉例說明如下:

    輸入

    說明

    *:*

    語法為:欄位名:查詢字串。此為所有欄位的資料

    ipod

    針對系統內定欄位text,查詢ipod字串

    name:ipod

    針對name欄位,查詢ipod字串

    i*

    查詢含有以i開頭的資料,*為0或多個字的wildcard

    te?t

    可以查詢test及text等字串,?為1個字的wildcard

    foo AND bar NOT baz

    查詢含有foo及bar,但沒有baz者

    foo && bar !baz

    作用同上

    +foo bar -baz

    查詢一定含有foo,可以有bar,但沒有baz者

    (jakartaOR apache) AND website

    查詢含有jakarta或apache,且有website字串者

    title:"The Right Way"

    針對title欄位,查詢含有The Right Way字串

    price:[2000 TO 3000]

    針對price欄位,查詢介於2000到3000

    price:[* TO 1000]

    查詢price小於等於1000者

  7. Make a Query – Full Interface:完整版查詢測試。例如圖四中輸入的查詢條件為:查詢name欄位為canon、過濾條件為cat欄位是electronics、由第二筆結果開始、回傳一筆資料、回傳的欄位有cat/id/name/price及評分值score、回傳格式為XML、啟動命中標示功能並標示name欄位中的內容。

    圖四、查詢測試


     點選「Search」後,這些查詢參數將以網址的形式組合如下,傳送到Solr伺服器:
    http://localhost:8983/solr/select?q=name%3Acanon&fq=cat%3Aelectronics&start=1&rows=1&fl=cat%2Cid%2Cname%2Cprice%2Cscore&qt=&wt=xml&hl=on&hl.fl=name
    這也是撰寫應用程式時,以HTTP方式向Solr伺服器所提交的呼叫。伺服器進行檢索後,以XML格式回傳結果如下:
    <response>
     <lst name="responseHeader">
      <int name="status">0</int>
      <int name="QTime">3</int>
      <lst name="params">
        <str name="hl.fl">name</str>
        <str name="wt">xml</str>
        <str name="hl">on</str>
        <str name="rows">1</str>
        <str name="fl">cat,id,name,price,score</str>
        <str name="start">1</str>
        <str name="q">name:canon</str>
        <str name="fq">cat:electronics</str>
      </lst>
     </lst>
     <result name="response" numFound="2" start="1" maxScore="1.3673005">
      <doc>
       <float name="score">0.8545628</float>
       <arr name="cat">
          <str>electronics</str>

     在responseHeader中status=0,表示查詢成功;QTime=3為耗時3ms;result中 numFound="2"表示找到2筆文件;score=0.8545628為該文件全文檢索的評分值;highlighting為命中標示,標示name欄位中的內容,以<em>標籤標示出命中字串。應用程式只要解析這個回傳的XML內容,編排後就即可在網頁中呈現檢索結果。這個功能可供程式員在開發階段檢視request及response的詳細內容。

六、功能展示
 Solr系統中提供使用velocity模版所撰寫的範例查詢介面,其中展示了檢索、層面分類(faceting)、命中標示、自動提示(autocomplete)及空間資訊查詢等功能,可供暸解系統及開發時參考用。以瀏覽器開啟http://localhost:8983/solr/browse,即可使用範例介面,如圖五。

圖五、範例查詢介面


 畫面左上方顯示基本查詢及空間資訊查詢;畫面左側為各式的層面分類;畫面中間為查詢結果的各筆資料,各展示功能說明如下:

  1. autocomplete:在查詢欄位中輸入查詢條件時,依據索引中所儲存的token顯示自動完成提示,例如輸入i時,提示ipod及in。
  2. Field Facets:欄位層面分類。範例中的cat(類別)為多值欄位,例如「USB cable」資料同時屬於electronics及connector類。在畫面上點選「connector」時,結果畫面就會縮小範圍為只屬於「connector」者。
  3. Query Facets:查詢層面分類。系統內部設定以「ipod」及「GB」為查詢層面分類條件進行分類統計。
  4. Range Facets:範圍層面分類。例如:價錢範圍或製造日期範圍。
  5. Clusters:動態群聚分類,是針對搜尋結果的欄位內容,進行分析,動態的產生分類大項。伺服器必須以下列方法啟動,方可使用此分類功能:
    java -Dsolr.clustering.enabled=true -jar start.jar
  6. 命中標示:伺服器中提供命中標示元件,可指定欲標示的欄位。範例中,使用<em>標籤標示命中的內容。
  7. More Like This:相關文件搜尋是自動根據搜獲的文件內容,再搜尋出相似的文件。
  8. Spatial:空間查詢。點選左上角「Spatial」,就會出現Location Filter及Distance查詢條件欄位,可針對座標欄位進行比對。
  9. 分頁:Solr系統進行查詢時,可限定返回的開始資料位置及返回的筆數,達到分頁的功能。例如畫面顯示的「3 results found. Page 1 of 1」。

七、應用系統開發
 開發使用Solr的應用系統,有多種程式語言可使用,例如Ruby、PHP、Java、Python、.NET、Perl及Javascript。基本上可進行HTTP協定通訊及讀寫XML或JSON格式資料的程式語言,都能使用。

 供PHP語言用的常見程式庫有solr-php-client及Apache Solr PHP Extension,另外直接使用PHP的file_get_contents() function直接讀寫Solr server也很方便。在Solr的default安裝中已包含的client端程式庫,有ruby的solr-ruby,其中也附上完整的範例;另外也包含供Java語言開發使用的SolrJ程式庫。
某些知名的開放源碼專案中,也提供Solr的模組或插件,做為內部資料檢索的解決方案,例如ColdFusion、Django、Drupal、eZ Find、Plone、TYPO3及WordPress等專案。

八、結論
 Solr已將全文檢索伺服器包裝成只要經由修改系統設定及schema定義二個XML格式的文字檔,就可運作。以MVC系統架構觀點而言,Solr已提供了Model的功能,應用系統只要將心力專注於View的畫面配置與UI設計,以及Controller的request的HTTP URL參數編排、回傳結果的XML/JSON內容解析就可以完成系統了。Solr大幅的簡化全文檢索系統開發的複雜度。

九、參考資料

  1. Apache Solr Project - http://lucene.apache.org/solr/
  2. Apache Lucene Project - http://lucene.apache.org/
  3. Who uses Lucene/Solr? http://www.lucidimagination.com/why-lucid/who-uses-lucid
  4. Lucene Query Syntax - http://lucene.apache.org/java/2_4_0/queryparsersyntax.html
  5. Solr Client Libraries / Language Bindings - http://wiki.apache.org/solr/IntegratingSolr



上一篇 | 返回電子報
 
 本電子報所有文字、圖片版權為中央研究院所有 。 電子報出版系統由中央研究院資訊服務處開發。