1. 瞭解Solr Solr是一個獨立的企業級搜索應用伺服器,對外提供API介面。用戶可以通過HTTP請求向搜索引擎伺服器提交一定格式的XML文件,生成索引;也可以通過HTTP GET操作提出查找請求, 並得到XML格式的返回結果。Solr現在支持多種返回結果。 2. 安裝配置Solr 2.1Sol ...
1. 瞭解Solr
Solr是一個獨立的企業級搜索應用伺服器,對外提供API介面。用戶可以通過HTTP請求向搜索引擎伺服器提交一定格式的XML文件,生成索引;也可以通過HTTP GET操作提出查找請求, 並得到XML格式的返回結果。Solr現在支持多種返回結果。
2. 安裝配置Solr
2.1Solr安裝
(1)訪問鏡像網站,下載Solr壓縮包。
(2)在下載完成後解壓文件,在“cmd"控制台進入"solr/bin”目錄下,輸入"solr start" 命令啟動Solr。
如果出現以下提示,則表示成功啟動。
Waiting up to 30 to see Solr running on port 8983
Started Solr server on port 8983. Happy searching!
(3)訪問 http://localhost:8983/solr 就可以看到已經啟動了。
常用命令如下。
- 停止:"solr stop -p 8983" 或 "solr stop - all"。
- 查看運行狀態:solr status
2.2 Solr配置
(1)進入Solr 的安裝目錄下的server/solr/,創建一個名字為new_core的文件夾。
(2)將 conf 目錄(在安裝目錄/server/solr/configsets/sample_techproducts_configs 下) 複製到new_core目錄下。
(3)訪問 "http://localhost:8983/solr/#/"
單擊導航欄的“Core Admin”,在彈出視窗中單擊“Add Core"命令,彈出如圖13-8所示的對話框,輸入名字和目錄名,再單擊“Add Core”按鈕,完成創建。
圖 13-8
3. 整合 Spring Boot 和 Solr
(1)添加依賴,見以下代碼:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
(2)寫入Solr配置
spring:
data:
solr:
host: http://localhost:8983/solr/new_core
實例:
1.創建 User 類
User類必須繼承可序列化介面,見以下代碼:
package com.intehel.demo.domain;
import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import java.io.Serializable;
@Data
public class User implements Serializable {
@Field("id")
private String id;
@Field("name")
private String name;
}
2. 測試增加、刪除、修改和查詢功能
(1)測試増加功能
@RequestMapping("/addUser")
public String addUser() throws IOException, SolrServerException {
User user = new User();
user.setId("155371");
user.setName("雞蛋火腿餅");
solrClient.addBean(user);
UpdateResponse commit = solrClient.commit();
return commit.toString();
}
(2)測試増加功能,根據id查詢剛剛添加的內容,見以下代碼:
@RequestMapping("/getByIdFromSolr/{id}")
public String getByIdFromSolr(@PathVariable String id) throws IOException, SolrServerException {
//根據id查詢內容
SolrDocument solrDocument = solrClient.getById(id);
//獲取filedname
Collection<String> filedname = solrDocument.getFieldNames();
Map<String, Object> filedValueMap = solrDocument.getFieldValueMap();
List<SolrDocument> childDocuments = solrDocument.getChildDocuments();
String result = solrDocument.toString();
return result;
}
(3)測試修改功能,根據id修改內容,見以下代碼:
@RequestMapping("/updateUser")
public String updateUser() throws IOException, SolrServerException {
User user = new User();
user.setId("155371");
user.setName("烤冷面");
solrClient.addBean(user);
UpdateResponse commit = solrClient.commit();
return commit.toString();
}
所謂Solr的更新操作,就是對相同id的文檔重新添加一次。修改之後,Version變得不一樣了。
(4)測試刪除功能,根據id刪除內容,見以下代碼:
@RequestMapping("/deleteUser")
public String deleteUser() throws IOException, SolrServerException {
UpdateResponse updateResponse = solrClient.deleteById("155371");
long elapsedTime = updateResponse.getElapsedTime();
int qTime = updateResponse.getQTime();
//請求地址
String requestUrl = updateResponse.getRequestUrl();
//請求的結果
NamedList<Object> response = updateResponse.getResponseHeader();
//請求的狀態
solrClient.commit();
int status = updateResponse.getStatus();
//成功,則返回0,如果沒有文檔被刪除也會返回0,代表根本沒有
return String.valueOf(status);
}
(5)實現文檔高亮顯示,見以下代碼:
@RequestMapping("/queryAll")
public String queryAll() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery();
//設置預設搜索域
solrQuery.setQuery("*.*");
solrQuery.set("q","知然");
solrQuery.add("q", "知然");
//設置返回結果的排序規則
solrQuery.setSort("id",SolrQuery.ORDER.asc);
//設置查詢的條數
solrQuery.setRows(50);
//設置查詢的開始
solrQuery.setStart(0);
//設置分頁參數
solrQuery.setStart(0);
solrQuery.setRows(20);
//設置高亮
solrQuery.setHighlight(true);
//設置高亮的欄位
solrQuery.addHighlightField("name");
//設置高亮的樣式
solrQuery.setHighlightSimplePre("<font color='red'>");
solrQuery.setHighlightSimplePost("</font>");
System.out.println(solrQuery);
QueryResponse queryResponse = solrClient.query(solrQuery);
Map<String, Map<String, List<String>>> highlightMap = queryResponse.getHighlighting();
SolrDocumentList documents = queryResponse.getResults();
long numFound = documents.getNumFound();
System.out.println("查詢到的文檔數量"+numFound);
for (SolrDocument document : documents) {
System.out.println(document);
System.out.println(document.get("name"));
}
System.out.println(highlightMap);
return "true";
}
對比Elasticsearch和Solr:
(1)Solr的優點。
- Solr有一個更大、更成熟的用戶、開發和頁獻者社區。
- 支持添加多種格式的索引,如:HTML、PDF、微軟Office系列軟體格式,以及JSON、 XML、CSV等純文本格式。
- 比較成熟、穩定。
- 搜索速度更快(不建索引時)。
- Solr利用Zookeeper進行分散式管理,而Elasticsearch自身帶有分散式協調管理功能。 如果項目本身使用了 Zookeeper,那Solr可能是最好選擇。有時缺點在特點場景下可能會變成優點。
- 如果項目後期升級,要朝著Hadoop這塊發展,當數據量較大時,用Hadoop處理數據, Solr可以很方便地與Hadoop結合。
(2)Elasticsearch 的優點。
- Elasticsearch本身是分散式、分發實時的,不需要其他組件。
- Elasticsearch完全支持Apache Lucene的接近實時的搜索。
- 它處理多用戶不需要特殊配置,而Solr則需要更多的高級設置。
- Elasticsearch採用Gateway的槪念,備份更加簡單。各節點組成對等的網路結構,某節點出現故障會自動分配其他節點代替其進行工作。
(3)Solr的缺點。
- 建立索引時,搜索效率下降,實時索引搜索效率不高。
- 實時搜索應用效率明顯低於Elasticsearch.
(4)Elasticsearch 的缺點。
- 沒有Solr的生態系統發達。
- 僅支持JSON文件格式。
- 本身更註重核心功能,高級功能多由第三方插件提供。
總結:Solr是傳統搜索應用的有力解決方案,但Elasticsearch更適用於新興的實時搜索應用。