Solr是一個很是流行的,高性能的開源企業級搜索引擎平臺,屬於Apache Lucene項目。主要功能包括強大的全文檢索、結果高亮、切面檢索、動態聚類、數據庫整合、富文本(例如Word,PDF)的處理,以及地理信息搜索。Solr是高度可擴展的,提供分佈式檢索和索引複製,併爲世界上衆多的大型網站提供搜索和導航功能。
Solr使用Java編寫,可運行於servlet容器(如Tomcat)做爲一個獨立的全文搜索服務器。Solr以Lucene 爲核心來建立索引和進行搜索,並提供相似REST的HTTP / XML和JSON API,這些API能夠在任何編程語言中使用。經過Solr強大的擴展配置可適應幾乎任何類型非Java編寫應用程序,同時擁有豐富的插件來擴展高級功能。html
以上的介紹翻譯自:http://lucene.apache.org/solr/。大概的翻譯,若有錯誤歡迎指出。java
從Solr的官方網站上下載的Solr包裏面有一個基於jetty的示例運行環境。下載Solr包,打開裏面的example目錄,點擊裏面的start.jar。在瀏覽器裏面輸入http://localhost:8983/solr,能夠看到以下界面。web
以上是Solr管理控制檯的主頁,左邊是導航。可使用http://localhost:8983/solr/#/collection1/query進行查詢結果的查看。這裏提供的是一個方便示例界面。如今應該是沒有數據的,由於沒有向裏面添加索引。可使用solr提供的post.jar包進行簡單的索引添加。這裏再也不介紹此方法,後面使用Solrj進行操做。具體的能夠查看Solr目錄下面的/docs/tutorial.html文檔。數據庫
上面的運行是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環境。性能優化
從上面的步驟中能夠看出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是首先咱們實例化一個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的索引庫裏面。下面介紹如何進行搜索。
搜索的第一步和上面同樣,先取得一個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(); }