Solr
一、solr概述
1、 解壓
2、、Solr 的目錄結構如下。
這裏我們需要注意的是:
Solr 目錄用來存放 Solr 的 Core,主要包含索引和配置文件。
solr-webapp 目錄中管理者 Jetty 運行的 Solr 服務去程序。
Webapps 目錄中的 solr.war 爲 solr 服務的文本應用程序。
3、 打開solr-jetty-context.Xml文件
二、運行 Solr 服務
第一種:使用 Solr 內置的 Jetty 服務器啓動 Solr
使用內置的 Jetty 來啓動 Solr 服務器只需要在example 目錄下,執行 start.jar 程序即可,我們可以直接執行命令:java -jar start.jar。
當服務啓動後,默認發佈在 8983 端口,所以可以訪問該端口來訪問 Solr 服務。
訪問Solr如圖:
第二種:(常用)
將 Solr 部署到 Tomcat 中
1、在 Tomcat 中部署 Web 服務,將solr-4.10.2/example/webapps/solr.war 複製到自己的 tomcat/webapps目錄中,進行並解壓。
刪除solr.war的圖:
2、將 Solr 用到的 jar 包拷貝到項目的 lib 目錄下
、
3、創建log4j配置文件
先新建classes如圖:
複製log4j.properties
粘貼log4j.properties
4、 在啓動前還需要設置solr.solr.home 啓動參數,
複製後solr文件夾的路徑:
在 catalina.bat 文件添加配置:set "JAVA_OPTS=-Dsolr.solr.home=d:/test/solr"。
啓動 Tomcat 則 Solr 的服務器發佈就完成了。
訪問solr如圖:
三、Solr 管理頁面
1、DashBoard
2、 Logging
總結:標籤 用途:配置插件依賴的jar 包
注意事項:
o 如果引入多個 jar 包,要注意包和包的依賴關係,被依賴的包配置在前面
o 這裏的 jar 包目錄如果是相對路徑,那麼是相對於 core 所在目錄
第一種:不復制solr文件夾(直接使用解壓後的solr)
第二種:複製solr文件夾
報錯原因:
所有collection裏的solrconfig.xml都需要配置依賴文件夾路徑:
成功
3、Core Admin
在 Solr 中,每一個 Core,代表一個索引庫,裏面包含索引數據及其信息。Solr 中可以擁有多個 Core,也就同時管理多個索引庫!就像在 MySQL 中可以有多個 database 一樣。
CoreSelector:
選擇一個 Core,可以進行更詳細的操作:
a) 通過 Solr 管理界面添加索引數據
b) 通過 Solr 管理界面查詢索引數據
四、Solr中的Core詳解
1、Core 的概念在 Solr 中一個 core 就是一個索引庫,裏面包含索引信息和配置文件。
2、目錄結構 Core 中有兩個重要目錄:conf 和 data
conf 目錄中有兩個非常重要的配置文件:schema.xml 和 solrconfig.xml
Core 的配置文件詳解 core.properties
a)修改 core 名稱 Core 的屬性文件,記錄當前core 的名稱、索引位置、配置文件名稱等信息。一般要求 Core 名稱跟 Core 的文件夾名稱一致!這裏都是 Collection1,我們可以手動修改這個屬性。
此時重啓 Tomcat,可以看到 core 的名字已經改變!
b)添加多個 core
在 solr 目錄下創建新的文件夾core2,作爲新的 core 目錄,創建 conf 目錄和 data 目錄,並且創建文件 core.properties,從 core1/conf 目錄下複製配置文件 core2/conf/下。
Collection1-副本重命名collection2
打開core.properties編輯
C)schema.xmlSolr 中會提前對文檔中的字段進行定義,並且在 schema.xml 中對這些字段的屬性進行約束,例如:字段數據類型、字段是否索引、是否存儲、是否分詞等等。
d)通過 Field 字段定義字段的屬性信息
e) 通過 FieldType 指定數據類型
屬性及含義
f) 、唯一主鍵 Lucene 中本來是沒有主鍵的。刪除和修改都需要根據詞條進行匹配。而 Solr 卻可以設置一個字段爲唯一主鍵,這樣增刪改操作都可以根據主鍵來進行。
g) 動態字段 動態字段可以動態匹配,一般使用比較少,使用dynamicField 來定義。
h) solrconfig.xml這個配置文件主要配置跟索引庫和請求處理相關的配置。
<lib>標籤 用途:配置插件依賴的 jar 包
注意事項:
o 如果引入多個 jar 包,要注意包和包的依賴關係,被依賴的包配置在前面
o 這裏的 jar 包目錄如果是相對路徑,那麼是相對於 core 所在目錄
<requestHandler>標籤
用途:配置 Solr 處理各種請求(搜索/select、更新索引/update、等)的各種參數
主要參數:
o name:請求類型,例如:select、query、get、update
o class:處理請求的類
o initParams:可選。引用標籤中的配置
o :定義各種缺省的配置,比如缺省的 parser、缺省返回條數
五、SolrJ的使用
1、概述 SolrJ 是 Apache 官方提供的一套 Java 開發的,訪問 Solr 服務的 API,通過這套 API 可 以讓我們的程序與 Solr 服務產生交互,讓我們的程序可以實現對 Solr 索引庫的增刪改查。
添加依賴:
<!-- Junit單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>4.10.2</version> </dependency> <!-- Solr底層會使用到slf4j日誌系統 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.22</version> </dependency> <dependency> <groupId>commons-logging</groupId> |
<artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> |
2、使用 SolrJ 添加或修改索引庫數據
a、以 Document 形式添加或修改數據
@Test public void testInsertIndexByDocument() throws Exception { //創建服務器對象 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2"); //創建文檔對象 SolrInputDocument document = new SolrInputDocument(); //添加索引數據 document.addField("id", "1"); document.addField("title", "這是第一條測試數據"); //添加文檔 server.add(document); //提交請求,如果ID對應的數據存在則進行更新操作,如果不存在則創建索 引 server.commit(); } |
b、使用註解和JavaBean 添加或修改數據
創建 JavaBean,並且用註解標明要添加到索引庫的字段,直接通過 SolrServer 添加 JavaBean。
@Test public void testInsertIndexByBean() throws Exception { //創建服務器對象 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2"); //添加數據 server.addBean(new Person("1","張三","張三是一個好學生")); //提交請求,如果ID對應的數據存在則進行更新操作,如果不存在則創建索 引 server.commit(); } |
3、 使用 SolrJ 刪除索引庫數據
刪除索引可以根據 ID 刪除,也可以寫一個查詢條件,匹配到條件的都會被刪除
@Test public void testDleteIndex() throws Exception{ //創建服務器對象 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2"); //根據條件進行刪除 server.deleteByQuery("name:張三"); //提交請求 server.commit(); } |
4、使用 SolrJ 查詢索引庫數據
a、以 Document 形式返回查詢結果
@Test public void testQueryIndex() throws Exception{ //創建服務器對象 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2"); //定義查詢條件 SolrQuery query = new SolrQuery("name:李四"); //進行查詢處理 QueryResponse queryResponse = server.query(query); SolrDocumentList results = queryResponse.getResults(); System.out.println("找到了"+results.size()+"條記錄"); //便利數據 for (SolrDocument solrDocument : results) { System.out.println(solrDocument.get("id")); System.out.println(solrDocument.get("name")); System.out.println(solrDocument.get("description")); } } |
b、以 JavaBean 形式返回查詢結果
@Test public void testQueryIndexBean() throws Exception{ //創建服務器對象 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2"); //定義查詢條件 SolrQuery query = new SolrQuery("name:李四"); //進行查詢處理 QueryResponse queryResponse = server.query(query); List<Person> beans = queryResponse.getBeans(Person.class); for (Person person : beans) { System.out.println("id:"+person.getId()); System.out.println("name:"+person.getName()); |
System.out.println("description:"+person.getDescription()); } } |
c、SolrQuery對象的高級查詢
在創建 SolrQuery時,我們填寫的 Query 語句,可以有以下高級寫法:
查詢語句中如果有特殊字符,需要轉義,可以使用:””
1、匹配所有文檔:*:* (通配符?和*:“*”表示匹配任意字符;“?”表示匹配出現的位 置)
2、布爾操作:AND、OR 和 NOT 布爾操作(推薦使用大寫,區分普通字段)
3、子表達式查詢(子查詢):可以使用“()”構造子查詢。比如:(query1 AND query2) OR (query3 AND query4)
4、相似度查詢:
(1)默認相似度查詢:title:appla~ ,此時編輯舉例是 2
(2)指定編輯舉例的相似度查詢:對模糊查詢可以設置編輯舉例,可選 0~2 的整數。
5、範圍查詢(Range Query):Lucene 支持對數字、日期甚至文本的範圍查詢。結束的範圍可以使用“*”通配符。
(1)日期範圍(ISO-8601 時間 GMT):a_begin_date:[1990-01-01T00:00:00.000Z TO 1999-12-31T24:59:99.999Z]
(2)數字:salary:[2000 TO *]
(3)文本:entryNm:[a TO a]
6、日期匹配:YEAR, MONTH, DAY, DATE (synonymous with DAY) HOUR, MINUTE, SECOND,MILLISECOND, and MILLI (synonymous with MILLISECOND)可以被標誌成 日期。
(1)r_event_date:[* TO NOW-2YEAR]:2 年前的現在這個時間
(2)r_event_date:[* TO NOW/DAY-2YEAR]:2 年前前一天的這個時間
d) SolrQuery 實現排序
@Test public void testQueryIndexSort() throws Exception{ //創建服務器對象 HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2"); //定義查詢條件 SolrQuery query = new SolrQuery("*:*"); //設置按ID排序 query.setSort("id", ORDER.desc); //進行查詢處理QueryResponse queryResponse = server.query(query); SolrDocumentList results = queryResponse.getResults();
System.out.println("找到了"+results.size()+"條記錄");
//便利數據 for (SolrDocument solrDocument : results) { System.out.println(solrDocument.get("id")); System.out.println(solrDocument.get("title")); } } |
e) SolrQuery 實現分頁
@Test 6. public void testQueryIndexPages() throws Exception{ 7. //要查詢的頁數 8. int pageNum = 2; 9. //每頁顯示條數 10. int pageSize = 2; 11. //當前頁的起始條數 12. int start = (pageNum - 1) * pageSize; 13. 14. //創建服務器對象 15. HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2") ; |
16. //定義查詢條件 17. SolrQuery query = new SolrQuery("*:*"); 18. //設置按ID排序 19. query.setSort("id", ORDER.desc); 20. 21. //設置起始條數 22. query.setStart(start); 23. //設置每頁條數 24. query.setRows(pageSize); 25. 26. //進行查詢處理 27. QueryResponse queryResponse = server.query(query); 28. SolrDocumentList results = queryResponse.getResults(); 29. 30. System.out.println("當前第" + pageNum + "頁,本頁共" + results.size() + "條數據。 "); 31. 32. //便利數據 33. for (SolrDocument solrDocument : results) { 34. System.out.println(solrDocument.get("id")); 35. System.out.println(solrDocument.get("title")); 36. } 37. } |
f) SolrQuery 實現高亮顯示
@Test 6. public void testQueryIndexHighlighting() throws Exception{ 7. //創建服務器對象 8. HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/collection2") ; 9. //定義查詢條件 10. SolrQuery query = new SolrQuery("title:測試"); 11. 12. //設置高亮的標籤 13. query.setHighlightSimplePre("<em>"); 14. query.setHighlightSimplePost("</em>"); 15. //高亮字段 16. query.addHighlightField("title"); 17. 18. //進行查詢處理 19. QueryResponse queryResponse = server.query(query); 20. SolrDocumentList results = queryResponse.getResults(); |
21. 22. //獲取高亮字段 23. Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting(); 24. 25. System.out.println("找到了"+results.size()+"條記錄"); 26. 27. //便利數據 28. for (SolrDocument solrDocument : results) { 29. String id = solrDocument.get("id").toString(); 30. System.out.println("id:"+id); 31. System.out.println(highlighting.get(id).get("title"). get(0)); 32. } 33. } |