Solr4.0的tomcat部署及Solrj的簡單使用

Solr簡介

Solr是一個很是流行的,高性能的開源企業級搜索引擎平臺,屬於Apache Lucene項目。主要功能包括強大的全文檢索、結果高亮、切面檢索、動態聚類、數據庫整合、富文本(例如Word,PDF)的處理,以及地理信息搜索。Solr是高度可擴展的,提供分佈式檢索和索引複製,併爲世界上衆多的大型網站提供搜索和導航功能。
Solr使用Java編寫,可運行於servlet容器(如Tomcat)做爲一個獨立的全文搜索服務器。Solr以Lucene 爲核心來建立索引和進行搜索,並提供相似REST的HTTP / XML和JSON API,這些API能夠在任何編程語言中使用。經過Solr強大的擴展配置可適應幾乎任何類型非Java編寫應用程序,同時擁有豐富的插件來擴展高級功能。html

Solr特性

  • 先進的全文檢索功能
  • 專爲高通量的網絡流量進行的優化
  • 基於標準的開放接口 - XML,JSON和HTTP
  • 綜合的HTML管理界面
  • 暴露JMX接口以方便監控服務器統計
  • 可擴展性 - 有效地複製到其餘Solr搜索服務器
  • 使用XML配置達到靈活性和適配性
  • 可擴展的插件體系結構

Solr使用Lucene並進行了擴展

  • 一個真正的擁有動態域(Dynamic Field)和惟一鍵(Unique Key)的數據模式(Data Schema)
  • 對Lucene的查詢語言進行了強大的擴展
  • 切面搜索和過濾
  • 地理空間信息搜索
  • 先進的,可配置的文本分析
  • 高度可配置、可擴展的緩存機制
  • 性能優化
  • 支持經過XML配置
  • 提供管理界面
  • 可監控日誌記錄
  • 支持高速增量式更新(Fast incremental Updates)和快照發布(Snapshot Distribution)
  • 高度可擴展的分佈式搜索,片式指數在多臺主機
  • JSON,XML,CSV /分隔的文本和二進制更新格式
  • 使用簡單的方法便可從數據庫、XML文件數據、本地磁盤、HTTP等來源獲取數據
  • 基於Apache Tika對富文本進行解析和索引(PDF,WORD,HTML等)
  • Apache UIMA集成的可配置的元數據提取
  • 支持多個搜索索引

以上的介紹翻譯自:http://lucene.apache.org/solr/。大概的翻譯,若有錯誤歡迎指出。java

Solr的運行

從Solr的官方網站上下載的Solr包裏面有一個基於jetty的示例運行環境。下載Solr包,打開裏面的example目錄,點擊裏面的start.jar。在瀏覽器裏面輸入http://localhost:8983/solr,能夠看到以下界面。web

Solr4.0首頁截圖

以上是Solr管理控制檯的主頁,左邊是導航。可使用http://localhost:8983/solr/#/collection1/query進行查詢結果的查看。這裏提供的是一個方便示例界面。如今應該是沒有數據的,由於沒有向裏面添加索引。可使用solr提供的post.jar包進行簡單的索引添加。這裏再也不介紹此方法,後面使用Solrj進行操做。具體的能夠查看Solr目錄下面的/docs/tutorial.html文檔。數據庫

在Tomcat中部署Solr

上面的運行是Solr默認綁定的一個jetty,若是須要在tomcat中運行solr,方法以下:apache

一、將Solr/dist/apache-solr-4.0.0.war此war包複製到tomcat的webapps目錄下面,並重命名成solr。編程

二、點擊tomcat/bin/startup.bat運行tomcat,這時tomcat會解壓solr.war包到webapps目錄下面。看到控制檯裏面會有報錯提示,是找不到solr的實例運行環境。這時關閉tomcat。瀏覽器

三、刪除webapps目錄下面的solr.war包。將下載的solr目錄下面的example下面的solr目錄複製到tomcat的webapps/solr下面。下面的目錄結構大概是這樣的webapps/solr/solr/collection1相似這樣的。緩存

四、打開webapps/solr/WEB-INF/web.xml文件,在裏面添加以下內容。env-entry-value這個目錄是指向上一個步驟中的目錄。這裏使用的是相對目錄(相對於tomcat的bin目錄),也可使用絕對路徑,如d:/solr等。步驟3中的目錄不必定要位於tomcat中,只要此步驟中將路徑配置正確便可。tomcat

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

五、再次運行tomcat,輸入http://localhost:8080/solr便可訪問在tomcat中運行的solr環境。性能優化

使用Solrj操做Solr

從上面的步驟中能夠看出Solr提供了一個企業搜索引擎平臺的核心,能夠經過他的接口進行索引的建立、修改、刪除。並提交關鍵字進行搜索。但若是要真正的投入使用,仍是有不和工做須要作,如:

一、對向Solr提交索引進行必定的封裝以方便業務系統進行操做

二、對搜索進行封裝,以方便結果的展示分析等等。

Solrj是使用java編寫的一個操做Solr的工具,方便於進行索引的更新、搜索結果的獲取等等。

在Solr的發佈包裏面有Solrj的相關jar包。Solrj須要的jar包爲:

apache-solr-solrj-4.0.0.jar和他的依賴包solr/dist/solrj-lib

若是是使用maven,能夠添加:

<dependency>
 <groupId>org.apache.solr</groupId>
 <artifactId>solr-solrj</artifactId>
 <version>4.0.0</version>
</dependency>

使用Solrj更新索引

使用Solrj是首先咱們實例化一個SolrServer,這裏使用HttpSolrServer。咱們再建立一個SolrInputDocument以方便來添加要索引的數據。這裏的Field是在\solr\solr\collection1\conf\schema.xml裏面定義的,若是裏面沒有定義的字段在這裏是不能添加的,除非是使用動態字段。示例代碼以下:

String url = "http://localhost:8080/solr"; 
SolrServer server = new HttpSolrServer(url);
SolrInputDocument doc1 = new SolrInputDocument(); 
doc1.addField("id", "1");
doc1.addField("title", "雲南xxx科技");
doc1.addField("cat", "企業信息門戶,元數據,數字沙盤,知識管理");
SolrInputDocument doc2 = new SolrInputDocument(); 
doc2.addField("id", "2");
doc2.addField("title", "胡啓穩");
doc2.addField("cat", "知識管理,企業信息門戶,雲南,昆明");
SolrInputDocument doc3 = new SolrInputDocument(); 
doc3.addField("id", "3");
doc3.addField("title", "liferay");
doc3.addField("test_s", "這個內容能添加進去麼?這是動態字段呀");
List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
docs.add(doc1);
docs.add(doc2);
docs.add(doc3);
server.add(docs);
server.commit();

到此就添加了三個document到solr的索引庫裏面。下面介紹如何進行搜索。

使用Solrj進行搜索

搜索的第一步和上面同樣,先取得一個SolrServer。而後建立一個SolrQuery進行搜索,搜索取得的數據已經封裝在QueryResponse裏面,經過相關API獲取結果數據。示例代碼以下:

String url = "http://localhost:8080/solr"; 
SolrServer server = new HttpSolrServer(url); 
SolrQuery query = new SolrQuery("雲南");
try {
 QueryResponse response = server.query(query);
 SolrDocumentList docs = response.getResults();
 System.out.println("文檔個數:" + docs.getNumFound()); 
 System.out.println("查詢時間:" + response.getQTime());
for (SolrDocument doc : docs) { 
 System.out.println("id: " + doc.getFieldValue("id")); 
 System.out.println("name: " + doc.getFieldValue("title")); 
 System.out.println(); 
 }
相關文章
相關標籤/搜索