solr

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. }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章