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 :

安裝中間件

  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 启動時加載。

如何 設置 主目錄

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

  2. 通過JNDI 將主目錄的路徑绑定到java:comp/env/solr/home 。

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

1
2
3
4
5
<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/ ,顯示如下界面表示启動成功。

solr_1  

圖 1 Solr 歡迎界面

solr_2  

圖 2 管理控制台界面

使用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
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, "");

添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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();

查詢

1
2
3
4
5
6
7
8
// 得到一個 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 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 的配置

1
2
3
4
5
6
7
<schema name="example" version="1.1">
……
<fieldType name="text" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
……
</schema>

使用 IKTokenizerFactory 的配置

1
2
3
4
5
6
7
8
9
10
<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>
創作者介紹

資訊園

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()