Apache Solr 介紹Solr 是什麼?
Solr 是一個開源的企業級搜索服務器,底層使用易於擴展和修改的Java 來實現。服務器通信使用標準的HTTP 和XML,所以如果使用Solr 瞭解Java 技術會有用卻不是必須的要求。
Solr 主要特性有:強大的全文檢索功能,高亮顯示檢索結果,動態集羣,數據庫接口和電子文檔(Word ,PDF 等)的處理。而且Solr 具有高度的可擴展,支持分佈搜索和索引的複製。
Lucene 是什麼?
Lucene 是一個基於 Java 的全文信息檢索工具包,它不是一個完整的搜索應用程序,而是爲你的應用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一個開源項目。也是目前最爲流行的基於 Java 開源全文檢索工具包。
目前已經有很多應用程序的搜索功能是基於 Lucene ,比如 Eclipse 幫助系統的搜索功能。Lucene 能夠爲文本類型的數據建立索引,所以你只要把你要索引的數據格式轉化的文本格式,Lucene 就能對你的文檔進行索引和搜索。
Solr VS Lucene
Solr 與Lucene 並不是競爭對立關係,恰恰相反Solr 依存於Lucene ,因爲Solr 底層的核心技術是使用Apache Lucene 來實現的,簡單的說Solr 是Lucene 的服務器化。需要注意的是Solr 並不是簡單的對Lucene 進行封裝,它所提供的大部分功能都區別於Lucene 。
安裝搭建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 Solr下載最新的Solr
本文發佈時Solr1.4 爲最新的版本,下文介紹內容均針對該版本,如與Solr 最新版本有出入請以官方網站內容爲準。Solr官方網站下載地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/
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 中。
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 第一行添加如下內容:
注:Windows 以外操作系統需修改 catalina.sh 文件。
啓動tomcat ,apache-solr-1.4.0.war 自動發佈爲web 應用。
點擊鏈接訪問Solr 控制檯界面,http://localhost:8080/apache-solr-1.4.0/ ,顯示如下界面表示啓動成功。
圖 1 Solr 歡迎界面
圖 2 管理控制檯界面
使用Java 接口訪問Solr 服務
SolrJ 是Solr 服務器的一個Java 接口,使用該接口再也不同爲慮客戶端與服務器端交互時格式解析和轉換的問題煩惱了,取而代之的是用你熟悉的對象來進行相關的操作,而且隨着Solr 的不斷升級SolrJ 也會同樣提供這些新加入的功能。
SolrJ (Solr1.4 )依賴的Jar 包commons-codec-1.3.jarcommons-fileupload-1.2.1.jarcommons-httpclient-3.1.jarcommons-logging-1.0.4.jarcommons-io-1.4.jargeronimo-stax-api_1.0_spec-1.0.1.jarsolr-solrj-1.4.0.jarwstx-asl-3.2.7.jarstax-api-1.0.1.jarslf4j-api-1.5.5.jarslf4j-simple-1.5.5.jar創建 SolrServer
SolrJ 中有2 種SolrServer 對象,CommonsHttpSolrServer 與EmbeddedSolrServer ,他們都是線程安全的並建議使用單例模式來使用他們,因爲動態創建會造成連接泄露。
Create CommonsHttpSolrServer
1 2 | String url ="http://localhost:8983/solr"; SolrServer server =new CommonsHttpSolrServer( url ); |
Create EmbeddedSolrServer
1 2 3 4 5 | // 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(){// 對象實例可以重複使用returnnew 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(); |
中文分詞分詞產品
目前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 wordsmmseg4j :自帶 sogou 詞庫,支持名爲 wordsxxx.dic , utf8 文本格式的用戶自定義詞庫,一行一詞。不支持自動檢測。 -Dmmseg.dic.pathik : 支持 api 級的用戶詞庫加載,和配置級的詞庫文件指定,無 BOM 的 UTF-8 編碼, \r\n 分割。不支持自動檢測。ik 與 solr 集成
以上產品中只有 ik 提供了 Solr ( 1.3 , 1.4 )的分詞接口程序,只需修改配置文件即可實現中文分詞,配置方法如下;
使用 IKAnalyzer 的配置
1 2 3 4 5 6 7 | <schemaname="example"version="1.1"> …… <fieldTypename="text"class="solr.TextField"><analyzerclass="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType> …… </schema> |
使用 IKTokenizerFactory 的配置
1 2 3 4 5 6 7 8 9 10 |
<fieldTypename="text"class="solr.TextField"><analyzertype="index"><tokenizerclass="org.wltea.analyzer.solr.IKTokenizerFactory"isMaxWordLength="false"/> …… </analyzer><analyzertype="query"><tokenizerclass="org.wltea.analyzer.solr.IKTokenizerFactory"isMaxWordLength="true"/> …… </analyzer></fieldType>
|