Solr09-SolrJ的簡介和使用
目錄
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"> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- solrj版本 --> <solrj.version>4.10.4</solrj.version> <!-- ...... --> </properties> <dependencies> <!-- solrj依賴 --> <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>${solrj.version}</version> </dependency> <!-- ...... --> </dependencies> </project>
2.3 新增和修改索引
說明: Solr是根據id域(唯一約束)執行索引的新增(或更新)的:
先根據id域執行查詢, 查詢到執行更新; 查詢不到則執行新增.
- 建立HttpSolrServer物件, 連線Solr服務;
- 建立文件物件(SolrInuptDocument);
- 使用HttpSolrServer物件, 執行新增(或更新);
- 提交.
/** * 新增與修改索引 */ @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 刪除索引
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.4.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 查詢索引
- 建立HttpSolrServer物件, 連線Solr服務;
- 建立查詢物件(SolrQuery);
- 使用HttpSolrServer物件, 執行查詢, 返回查詢響應物件QueryResponse;
- 使用QueryResponse物件, 獲取查詢的結果集SolrDocumentList;
- 處理結果集.
/** * 查詢索引 */ @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 實現步驟
- 建立HttpSolrServer物件, 連線Solr服務;
- 建立查詢物件(SolrQuery), 設定查詢條件;
- 使用HttpSolrServer物件, 執行查詢, 返回查詢響應物件(QueryResponse);
- 使用QueryResponse物件, 獲取查詢資料;
- 處理結果集.
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 分片統計資料結果
版權宣告
作者: ma_shoufeng(馬瘦風)
出處: 部落格園馬瘦風的部落格
您的支援是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但未經博主同意必須保留此段宣告, 且在文章頁面明顯位置給出原文連結, 否則博主保留追究法律責任的權利.