1 SolrJ是什么
說明: SolrJ是訪問Solr服務的Java客戶端程序, 提供了索引和搜索的請求方法.
SolrJ通常嵌入在業務系統中, 通過SolrJ的API接口操作Solr服務, 流程如下圖:
2 SolrJ對索引的CRUD操作
使用SolrJ訪問Solr服務, 完成索引的增、刪、改、查操作.
2.1 創建Maven工程(打包方式選擇為jar)

2.2 配置pom.xml文件, 加入SolrJ的依賴
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- solrj版本 -->
<solrj.version>4.10.4</solrj.version>
<!-- log4j日志版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<!-- jcl版本 -->
<jcl.version>1.7.6</jcl.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<!-- solrj依賴 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solrj.version}</version>
</dependency>
<!-- log4j日志包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${jcl.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${jcl.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.3 添加和修改索引
說明: Solr是根據id域(唯一約束)執行索引的添加(或更新)的:
先根據id域執行查詢, 查詢到執行更新; 查詢不到則執行添加.
步驟:
(1) 創建HttpSolrServer對象, 連接Solr服務;
(2) 創建文檔對象(SolrInuptDocument);
(3) 使用HttpSolrServer對象, 執行添加(或更新);
(4) 提交.
/**
* 添加與修改索引
*/
@Test
public void testSaveAndUpdateIndex() throws Exception {
// 1. 創建HttpSolrServer對象, 連接Solr服務
// 參數baseURL: 指定Solr的服務地址
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr");
// 2. 創建文檔對象(SolrInputDocument)
SolrInputDocument document = new SolrInputDocument();
// 在Solr中, id域是必需的
document.addField("id", "9527");
// 先設置如下值:
// document.addField("name", "solr solrj");
// 再次設置, 測試更新索引 -- 如果存在則更新, 不存在則添加
document.addField("name", "solr123 solrj");
// 3. 使用HttpSolrServer對象, 執行添加(或更新)
server.add(document);
// 4. 提交更新
server.commit();
}

2.4 刪除索引
(1) 根據id刪除索引, 步驟為:
① 創建HttpSolrServer對象, 連接Solr服務;
② 使用HttpSolrServer對象, 執行刪除;
③ 提交.
/**
* 根據id刪除索引
*/
@Test
public void testDeleteIndexById() throws SolrServerException, IOException {
// 1. 創建HttpSolrServer對象, 連接Solr服務
// 參數baseURL: 指定Solr的服務地址
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr");
// 2. 使用HttpSolrServer對象, 執行刪除
server.deleteById("9527");
// 3. 提交
server.commit();
}
(2) 根據條件刪除索引, 步驟為:
① 創建HttpSolrServer對象, 連接solr服務;
② 使用HttpSolrServer對象, 執行刪除;
③ 提交.
/**
* 根據條件刪除索引
*/
@Test
public void testDeleteIndexByQuery() throws Exception {
// 1. 創建HttpSolrServer對象, 連接Solr服務
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr");
// 2. 使用HttpSolrServer對象, 執行刪除
server.deleteByQuery("name: solr");
// 3. 提交更新
server.commit();
}
2.5 查詢索引
查詢步驟:
(1) 創建HttpSolrServer對象, 連接Solr服務;
(2) 創建查詢對象(SolrQuery);
(3) 使用HttpSolrServer對象, 執行查詢, 返回查詢響應對象QueryResponse;
(4) 使用QueryResponse對象, 獲取查詢的結果集SolrDocumentList;
(5) 處理結果集.
/**
* 查詢索引
*/
@Test
public void testQueryIndex() throws Exception {
// 1. 創建HttpSolrServer對象, 連接Solr服務
HttpSolrServer server = new HttpSolrServer("http://127.0.0.1:7070/solr");
// 2. 創建查詢對象(Query)
// : 表示查詢所有
SolrQuery query = new SolrQuery(":");
// 3.使用HttpSolrServer對象, 執行查詢, 返回查詢響應對象QueryResponse
QueryResponse queryResponse = server.query(query);
// 4.使用QueryResponse對象, 獲取查詢的結果集SolrDocumentList
SolrDocumentList results = queryResponse.getResults();
// 5.處理結果集
// 打印查詢到的結果數量
System.out.println("結果數量: " + results.getNumFound());
for (SolrDocument doc : results) {
System.out.println("= = = = = = = = = = = = = = = = = = =");
// 打印id域和name域
System.out.println("id: " + doc.get("id"));
System.out.println("name: " + doc.get("name"));
}
}

3 SolrJ的查詢方案
3.1 實現步驟
(1) 創建HttpSolrServer對象, 連接Solr服務;
(2) 創建查詢對象(SolrQuery), 設置查詢條件;
(3) 使用HttpSolrServer對象, 執行查詢, 返回查詢響應對象(QueryResponse);
(4) 使用QueryResponse對象, 獲取查詢數據;
(5) 處理結果集.
3.2 示例代碼
/**
* SolrJ高級查詢
*/
@Test
public void queryIndexSenior() throws Exception {
// 1. 創建HttpSolrServer對象, 連接Solr服務
// 參數baseURL:指定Solr的服務地址
HttpSolrServer solrServer = new HttpSolrServer("http://127.0.0.1:7070/solr/collection1");
// 2. 創建查詢對象(SolrQuery), 設置查詢條件
SolrQuery solrQuery = new SolrQuery();
// 2.1 設置查詢表達式
solrQuery.setQuery("花兒朵朵");
// 2.2 設置過濾條件
solrQuery.setFilterQueries("product_price:[* TO 20]");
// 2.3 設置排序sort
solrQuery.setSort("product_price", ORDER.desc);
// 2.4 設置分頁: start, rows
solrQuery.setStart(0);
solrQuery.setRows(10);
// 2.5 設置顯示的域列表
solrQuery.setFields("id", "product_name", "product_price", "product_catalog_name");
// 2.6 設置默認的搜索域
solrQuery.set("df", "product_name");
// 2.7 設置響應格式
solrQuery.set("wt", "json");
// 2.8 設置高亮顯示
solrQuery.setHighlight(true); // 開啟高亮顯示
// 或者: solrQuery.setParam("hl", "true");
solrQuery.addHighlightField("product_name"); // 添加高亮顯示的域
solrQuery.setHighlightSimplePre("<font color='red'>"); // 設置高亮顯示的HTML標簽的前綴
solrQuery.setHighlightSimplePost("<font>"); // 設置高亮顯示的HTML標簽的后綴
// 2.9 設置分片統計facet
solrQuery.setFacet(true); // 開啟分片統計
solrQuery.addFacetField("product_catalog_name"); // 添加分片統計的域
// 3. 使用HttpSolrServer對象, 執行查詢, 返回查詢相應對象
QueryResponse queryResponse = solrServer.query(solrQuery);
/* 處理結果集
NamedList list = (NamedList) queryResponse.getResponse().get("highlighting");
for (int i = 0; i < list.size(); i++) {
System.out.println("id=" + list.getName(i) + "高亮字段: " + list.getVal(i));
}
*/
// 4. 使用QueryResponse對象, 獲取查詢數據
// 4.1 獲取查詢結果集
SolrDocumentList results = queryResponse.getResults();
// 4.2 獲取高亮顯示數據
// 第一個Map的key是文檔的id, 第二個Map的key是高亮顯示的字段名, 第二個Map中的value是處理過的高亮顯示結果集, 類型為List<String>
Map<String, Map<String, List<String>>> hlMap = queryResponse.getHighlighting();
// 4.3 獲取分片統計數據
List<FacetField> facetFields = queryResponse.getFacetFields();
// 6. 處理結果集
System.out.println("結果數量:" + results.getNumFound());
for (SolrDocument doc : results) {
System.out.println("= = = = = = = = = = = = = = = = = = =");
// id, product_name, product_price, product_catalog_name
// 獲取商品id
String pid = doc.get("id").toString();
// 獲取商品名稱: 先從高亮顯示結果中獲取, 若沒有獲取到, 再從doc中獲取
String pname = "";
List<String> list = hlMap.get(pid).get("product_name");
if (null != list && list.size() > 0) {
pname = list.get(0);
} else {
pname = doc.get("product_name").toString();
}
// 獲取商品價格
String pprice = doc.get("product_price").toString();
// 獲取商品的分類名稱
String pcatalogName = doc.get("product_catalog_name").toString();
// 輸出結果
System.out.println("商品id: " + pid);
System.out.println("商品名稱: " + pname);
System.out.println("商品價格: " + pprice);
System.out.println("商品分類名稱: " + pcatalogName);
}
}
3.3 代碼搜索結果

3.4 查看分片統計數據
// 5. 處理分片統計數據(如有)
System.out.println("分片統計數據 = = = = = = = = = = = Begin");
for (FacetField field : facetFields) {
System.out.println("統計域名稱: " + field.getName() + " , 統計到的組數量: " + field.getValueCount());
// 查看各個組的數量
List<Count> values = field.getValues();
for (Count count : values) {
System.out.println("組名稱: " + count.getName() + " , 該組的數量: " + count.getCount());
}
}
System.out.println("分片統計數據 = = = = = = = = = = = End");
3.5 分片統計數據結果

版權聲明
作者: 馬瘦風
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.