Solr Apache Solr 初級教程(介紹、安裝部署、Java接口、中文分詞)


Apache Solr 介紹

Solr 是什麼?

Solr 是一個開源的企業級搜索服務器,底層使用易於擴展和修改的Java 來實現。服務器通訊使用標準的HTTP 和XML,因此若是使用Solr 瞭解Java 技術會有用卻不是必須的要求。 html

Solr 主要特性有:強大的全文檢索功能,高亮顯示檢索結果,動態集羣,數據庫接口和電子文檔(Word ,PDF 等)的處理。並且Solr 具備高度的可擴展,支持分佈搜索和索引的複製。 java

Lucene 是什麼?

Lucene 是一個基於 Java 的全文信息檢索工具包,它不是一個完整的搜索應用程序,而是爲你的應用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一個開源項目。也是目前最爲流行的基於 Java 開源全文檢索工具包。 web

目前已經有不少應用程序的搜索功能是基於 Lucene ,好比 Eclipse 幫助系統的搜索功能。Lucene 可以爲文本類型的數據創建索引,因此你只要把你要索引的數據格式轉化的文本格式,Lucene 就能對你的文檔進行索引和搜索。 算法

Solr VS Lucene

Solr 與Lucene 並非競爭對立關係,偏偏相反Solr 依存於Lucene ,由於Solr 底層的核心技術是使用Apache Lucene 來實現的,簡單的說Solr 是Lucene 的服務器化。須要注意的是Solr 並非簡單的對Lucene 進行封裝,它所提供的大部分功能都區別於Lucene 。 shell

安裝搭建Solr

安裝 Java 虛擬機

Solr 必須運行在Java1.5 或更高版本的Java 虛擬機中,運行標準Solr 服務只須要安裝JRE 便可,但若是須要擴展功能或編譯源碼則須要下載JDK 來完成。能夠經過下面的地址下載所需JDK 或JRE : 數據庫

  • OpenJDK ( http://java.sun.com/j2se/downloads.html )
  • Sun (http://java.sun.com/j2se/downloads.html )
  • IBM (http://www.ibm.com/developerworks/java/jdk/ )
  • Oracle (http://www.oracle.com/technology/products/jrockit/index.html )安裝 步驟請參考相應的幫助文檔。
安裝中間件

Solr 能夠運行在任何Java 中間件中,下面將以開源Apache Tomcat 爲例講解Solr 的安裝、配置與基本使用。本文使用Tomcat5.5 解壓版進行演示,可在下面地址下載最新版本http://tomcat.apache.org/download-55.cgi apache

安裝Apache Solr
下載最新的Solr

本文發佈時Solr1.4 爲最新的版本,下文介紹內容均針對該版本,如與Solr 最新版本有出入請以官方網站內容爲準。Solr官方網站下載地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/ api

Solr 程序包 的目錄結構
  • build :在solr 構建過程當中放置已編譯文件的目錄。
  • client :包含了一些特定語言調用Solr 的API 客戶端程序,目前只有Ruby 可供選擇,Java 客戶端叫SolrJ 在src/solrj 中能夠找到。
  • dist :存放Solr 構建完成的JAR 文件、WAR 文件和Solr 依賴的JAR 文件。
  • example :是一個安裝好的Jetty 中間件,其中包括一些樣本數據和Solr 的配置信息。
  • example/etc :Jetty 的配置文件。
  • example/multicore :當安裝Slor multicore 時,用來放置多個Solr 主目錄。
  • example/solr :默認安裝時一個Solr 的主目錄。
  • example/webapps :Solr 的WAR 文件部署在這裏。
  • src :Solr 相關源碼。
  • src/java :Slor 的Java 源碼。
  • src/scripts :一些在大型產品發佈時一些有用的Unix bash shell 腳本。
  • src/solrj :Solr 的Java 客戶端。
  • src/test :Solr 的測試源碼和測試文件。
  • src/webapp :Solr web 管理界面。管理界面的Jsp 文件都放在web/admin/ 下面,能夠根據你的須要修改這些文件。

Solr 的源碼沒有放在同一個目錄下,src/java 存放大多數文件,src/common 是服務器端與客戶端公用的代碼,src/test 放置solr 的測試程序,serlvet 的代碼放在src/webapp/src 中。 tomcat

Solr 主目錄結構

一個運行的Solr 服務其主目錄包含了Solr 的配置文件和數據(Lucene 的索引文件) 安全

Solr 的主目錄展開後爲以下結構:

  • bin :建議將集羣複製腳本放在這個目錄下。
  • conf :放置配置文件。
  • conf/schema.xml :創建索引的schema 包含了字段類型定義和其相關的分析器。
  • conf/solrconfig.xml :這個是Solr 主要的配置文件。
  • conf/xslt :包含了不少xslt 文件,這些文件能將Solr 的XML 的查詢結果轉換爲特定的格式,好比:Atom/RSS。
  • data :放置Lucene 產生的索引數據。
  • lib :放置可選的JAR 文件好比對Slor 擴展的插件,這些JAR 文件將會在Solr 啓動時加載。
如何 設置 主目錄

經過Java system property ,屬性的名稱是:solr.solr.home 。

經過JNDI 將主目錄的路徑綁定到java:comp/env/solr/home 。

經過修改web.xml 位置在:src/web-app/web/WEB-INF ,

<env-entry>    <env-entry-name>solr/home</env-entry-name>    <env-entry-value>solr/</env-entry-value>    <env-entry-type>java.lang.String</env-entry-type></env-entry>

若是Solr 主目錄沒有指定則默認設置爲solr/

發佈運行Solr

將apache-solr-1.4.0/dist/apache-solr-1.4.0.war 從安裝包中解壓到<tomcat home>/webapps 下。WAR 是一個完整的web 應用程序,包括了Solr 的Jar 文件和全部運行Solr 所依賴的Jar 文件,Jsp 和不少的配置文件與資源文件,這裏須要注意的是:WAR 文件中不包括Solr 主目錄,所以在啓動tomcat 以前咱們要先指定Solr 的主目錄。

將安裝程序中的apache-solr-1.4.0/example/solr 文件夾解壓到<tomcat homt>/ 下,而後在<tomcat home>/bin/catalina.bat 第一行添加以下內容:

set JAVA_OPTS=%JAVA_OPTS% -Dsolr.solr.home=<tomcat home>/solr注:Windows 之外操做系統需修改 catalina.sh 文件。

啓動tomcat ,apache-solr-1.4.0.war 自動發佈爲web 應用。

點擊連接訪問Solr 控制檯界面,http://localhost:8080/apache-solr-1.4.0/ ,顯示以下界面表示啓動成功。

resource

resource(1)

使用Java 接口訪問Solr 服務

SolrJ 是Solr 服務器的一個Java 接口,使用該接口不再同爲慮客戶端與服務器端交互時格式解析和轉換的問題煩惱了,取而代之的是用你熟悉的對象來進行相關的操做,並且隨着Solr 的不斷升級SolrJ 也會一樣提供這些新加入的功能。

SolrJ (Solr1.4 )依賴的Jar 包
  • commons-codec-1.3.jar
  • commons-fileupload-1.2.1.jar
  • commons-httpclient-3.1.jar
  • commons-logging-1.0.4.jar
  • commons-io-1.4.jar
  • geronimo-stax-api_1.0_spec-1.0.1.jar
  • solr-solrj-1.4.0.jar
  • wstx-asl-3.2.7.jar
  • stax-api-1.0.1.jar
  • slf4j-api-1.5.5.jar
  • slf4j-simple-1.5.5.jar
建立 SolrServer

SolrJ 中有2 種SolrServer 對象,CommonsHttpSolrServer 與EmbeddedSolrServer ,他們都是線程安全的並建議使用單例模式來使用他們,由於動態建立會形成鏈接泄露。

Create CommonsHttpSolrServer

String url = "http://localhost:8983/solr";SolrServer server = new CommonsHttpSolrServer( url );

Create EmbeddedSolrServer

// solr.solr.home 屬性也能夠經過 JVM 參數設置System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr");CoreContainer.Initializer initializer = new CoreContainer.Initializer();CoreContainer coreContainer = initializer.initialize();EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");
添加
public SolrServer getSolrServer(){    // 對象實例能夠重複使用    return new CommonsHttpSolrServer();}SolrServer server = getSolrServer();// 清空以前創建的索引數據server.deleteByQuery( "*:*" );// 建立一個文檔SolrInputDocument doc1 = new SolrInputDocument();doc1.addField( "id", "id1", 1.0f );doc1.addField( "name", "doc1", 1.0f );doc1.addField( "price", 10 );// 建立另一個文檔SolrInputDocument doc2 = new SolrInputDocument();doc2.addField( "id", "id2", 1.0f );doc2.addField( "name", "doc2", 1.0f );doc2.addField( "price", 20 );// 建立文檔集合Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();docs.add( doc1 );docs.add( doc2 );// 將文檔添加到 Solr 中server.add( docs );// 提交server.commit();
查詢
// 獲得一個 SolrServer 實例(經過上面介紹的方法建立)SolrServer server = getSolrServer();// 構造一個查詢對象SolrQuery query = new SolrQuery();query.setQuery( "*:*" );query.addSortField( "price", SolrQuery.ORDER.asc );// 查詢結果SolrDocumentList docs = rsp.getResults();

solr中文分詞

分詞產品 目前Lucene 的中文分詞主要有:

  • paoding :Lucene 中文分詞「庖丁解牛」 Paoding Analysis 。
  • imdict :imdict 智能詞典所採用的智能中文分詞程序。
  • mmseg4j : 用 Chih-Hao Tsai 的 MMSeg 算法 實現的中文分詞器。
  • ik :採用了特有的「正向迭代最細粒度切分算法「,多子處理器分析模式。

分詞效率

下面是各個分詞產品官方提供的數據:

  • paoding :在PIII 1G 內存我的機器上,1 秒 可準確分詞 100 萬 漢字。
  • imdict :483.64 ( 字節/ 秒) ,259517( 漢字/ 秒) 。
  • mmseg4j : complex 1200kb/s 左右, simple 1900kb/s 左右。
  • ik :具備 50 萬字 / 秒的高速處理能力。

自定義詞庫

  • paoding :支持不限制個數的用戶自定義詞庫,純文本格式,一行一詞,使用後臺線程檢測詞庫的更新,自動編譯更新過的詞庫到二進制版本,並加載
  • imdict :暫時不支持用戶自定義詞庫。但 原版 ICTCLAS 支持。支持用戶自定義 stop words
  • mmseg4j :自帶 sogou 詞庫,支持名爲 wordsxxx.dic , utf8 文本格式的用戶自定義詞庫,一行一詞。不支持自動檢測。 -Dmmseg.dic.path
  • ik : 支持 api 級的用戶詞庫加載,和配置級的詞庫文件指定,無 BOM 的 UTF-8 編碼, \r\n 分割。不支持自動檢測。
  • ik 與 solr 集成

以上產品中只有 ik 提供了 Solr ( 1.3 , 1.4 )的分詞接口程序,只需修改配置文件便可實現中文分詞,配置方法以下;

使用 IKAnalyzer 的配置

<schema name="example" version="1.1">……<fieldType name="text" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType>……</schema>

使用 IKTokenizerFactory 的配置

<fieldType name="text" class="solr.TextField" ><analyzer type="index"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>……</analyzer><analyzer type="query"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true"/>……</analyzer></fieldType>
相關文章
相關標籤/搜索