使用SolrJ(即java客戶端)開發Solr。


1、什么是SolrJ呢?
  答:Solrj是訪問Solr服務的java客戶端,提供索引和搜索的請求方法,SolrJ通常在嵌入在業務系統中,通過SolrJ的API接口操作Solr服務。開始配置schema.xml,/home/hadoop/soft/solr-4.10.3/example/solr/collection1/conf。添加IK中文分析器,然后定義定義自己的業務域。

注意:

  a、Indexed,Indexed Field可以進行搜索和排序。你還可以在indexed Field上運行Solr分析過程,此過程可修改內容以改進或更改結果。
  b、Stored,Stored Field內容保存在索引中。這對於檢索和醒目顯示內容很有用,但對於實際搜索則不是必須的,例如,很多應用程序存儲指向內容位置的指針而不是存儲實際的文件內容。

 1 [root@localhost tomcat]# cd /home/hadoop/soft/solr-4.10.3/
 2 [root@localhost solr-4.10.3]# ls
 3 bin  CHANGES.txt  contrib  dist  docs  example  licenses  LICENSE.txt  LUCENE_CHANGES.txt  NOTICE.txt  README.txt  SYSTEM_REQUIREMENTS.txt
 4 [root@localhost solr-4.10.3]# cd example/solr
 5 [root@localhost solr]# ls
 6 bin  collection1  README.txt  solr.xml  zoo.cfg
 7 [root@localhost solr]# cd collection1/
 8 [root@localhost collection1]# ls
 9 conf  core.properties  data  README.txt
10 [root@localhost collection1]# cd conf/
11 [root@localhost conf]# ls
12 admin-extra.html              clustering    lang                         protwords.txt                            _schema_analysis_synonyms_english.json  solrconfig.xml  synonyms.txt      xslt
13 admin-extra.menu-bottom.html  currency.xml  mapping-FoldToASCII.txt      _rest_managed.json                       schema.xml                              spellings.txt   update-script.js
14 admin-extra.menu-top.html     elevate.xml   mapping-ISOLatin1Accent.txt  _schema_analysis_stopwords_english.json  scripts.conf                            stopwords.txt   velocity
15 [root@localhost conf]# 

然后添加IK中文分詞器,自定義業務域:

其中IK中文分詞器,自定義業務域具體內容如下所示:

將這些添加完畢以后,重啟Tomcat,然后看看,可以搜索到新增的業務域字段。

 1 <!-- 然后添加如下配置即可:-->
 2 <fieldType name="text_ik" class="solr.TextField">
 3 <!-- 索引時候的分詞器 -->
 4 <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"></analyzer>
 5 <!-- 查詢時候的分詞器 -->
 6 <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"></analyzer>
 7 </fieldType>
 8 
 9 <!--IKAnalyzer Field-->
10 <!-- type="text_ik"代表使用了Ik中文分詞器。 -->
11 <!-- indexed="true"代表進行索引操作。 -->
12 <!-- stored="true"代表將該字段內容進行存儲。 -->
13 <field name="product_name" type="text_ik" indexed="true" stored="true" />
14 <field name="product_price" type="long" indexed="true" stored="true" />
15 <field name="product_picture" type="string" indexed="false" stored="true" />
16 <field name="product_description" type="text_ik" indexed="true" stored="true" />
17 <field name="product_catalog_name" type="string" indexed="true" stored="false" />

可以看到搜索到新增的業務域字段。

2、然后你可以愉快的編程了,嘻嘻。

  1 package com.taotao.search.service;
  2 
  3 import java.io.IOException;
  4 import java.util.List;
  5 import java.util.Map;
  6 
  7 import org.apache.solr.client.solrj.SolrQuery;
  8 import org.apache.solr.client.solrj.SolrServer;
  9 import org.apache.solr.client.solrj.SolrServerException;
 10 import org.apache.solr.client.solrj.impl.HttpSolrServer;
 11 import org.apache.solr.client.solrj.response.QueryResponse;
 12 import org.apache.solr.client.solrj.response.UpdateResponse;
 13 import org.apache.solr.common.SolrDocument;
 14 import org.apache.solr.common.SolrDocumentList;
 15 import org.apache.solr.common.SolrInputDocument;
 16 import org.junit.Before;
 17 import org.junit.Test;
 18 
 19 /**
 20  * 使用SolrJ創建索引,通過調用SolrJ提供的API請求Solr服務,Document通過SolrInputDocument進行構建。
 21  * 創建索引,使用SolrJ創建索引,通過調用SolrJ提供的API請求Solr服務,Document通過SolrInputDocument進行構建。
 22  * 
 23  * @ClassName: ProductSolrUtils.java
 24  * @author: biehl
 25  * @since: 2019年9月12日 上午10:49:13
 26  * @Copyright: ©2019 biehl 版權所有
 27  * @version: 0.0.1
 28  * @Description:
 29  */
 30 public class ProductSolrUtils {
 31 
 32     // solr的地址路徑
 33     private String solrServerUrl = "http://192.168.110.142:8080/solr-4.10.3/collection1";
 34     private SolrServer solrServer = null;
 35 
 36     /**
 37      * 
 38      */
 39     @Before
 40     public void before() {
 41         // 初始化執行
 42         // 1、創建SolrServer對象。創建一個HttpSolrServer對象
 43         solrServer = new HttpSolrServer(this.solrServerUrl);
 44     }
 45 
 46     /**
 47      * 說明:根據id(唯一約束)域來更新Document的內容,如果根據id值搜索不到id域則會執行添加操作,如果找到則更新。
 48      * 
 49      * @throws IOException
 50      * @throws SolrServerException
 51      * 
 52      */
 53     @Test
 54     public void productSolrCreateIndex() {
 55         try {
 56             // 2、需要指定Solr服務的url
 57             // 3、創建一個文檔對象SolrInputDocument
 58             SolrInputDocument document = new SolrInputDocument();
 59             // 4、向文檔中添加域,必須寫id域,域的名稱必須在schema.xml中定義
 60             document.addField("id", "p0001");
 61             document.addField("product_name", "小米手機9x");
 62             document.addField("product_price", 8888);
 63             document.addField("product_picture", "好用得咧");
 64             document.addField("product_description", "什么玩意?");
 65             document.addField("product_catalog_name", "手機");
 66 
 67             // 5、把文檔對象寫入到索引庫中
 68             // 向solr里面添加文檔
 69             UpdateResponse response = solrServer.add(document);
 70             // 6、提交
 71             solrServer.commit();
 72         } catch (Exception e) {
 73             e.printStackTrace();
 74         }
 75     }
 76 
 77     /**
 78      * 刪除索引
 79      * 
 80      * 說明:deleteById(String id)根據id刪除索引,此方法為重載方法,也可以傳個多個id批量刪除, 也可以調用deleteByQuery()
 81      * 根據查詢條件刪除
 82      */
 83     @Test
 84     public void taotaoSolrJDeleteById() {
 85         try {
 86             // 向solr里面添加文檔
 87             // 1、創建SolrServer對象。創建一個HttpSolrServer對象
 88             // SolrServer server = new
 89             // HttpSolrServer("http://192.168.110.142:8080/solr-4.10.3/collection1");
 90 
 91             // 2、 刪除操作,//根據id刪除
 92             solrServer.deleteById("p0001");
 93 
 94             // 3、提交
 95             solrServer.commit();
 96         } catch (SolrServerException e) {
 97             e.printStackTrace();
 98         } catch (IOException e) {
 99             e.printStackTrace();
100         }
101 
102     }
103 
104     /**
105      * 刪除索引,查詢條件刪除
106      * 
107      */
108     @Test
109     public void taotaoSolrJDeleteByQuery() {
110         try {
111             // 向solr里面添加文檔
112             // 1、創建SolrServer對象。創建一個HttpSolrServer對象
113             // SolrServer server = new
114             // HttpSolrServer("http://192.168.110.142:8080/solr-4.10.3/collection1");
115 
116             // 2、 刪除操作
117             solrServer.deleteByQuery("id:p0002");
118 
119             // 3、提交
120             solrServer.commit();
121         } catch (SolrServerException e) {
122             e.printStackTrace();
123         } catch (IOException e) {
124             e.printStackTrace();
125         }
126     }
127 
128     /**
129      * 
130      */
131     @Test
132     public void searchDocument() {
133         try {
134             // 1、創建一個SolrServer對象
135             // SolrServer solrServer = new
136             // HttpSolrServer("http://192.168.110.142:8080/solr-4.10.3/collection1");
137             // 2、創建一個SolrQuery對象
138             SolrQuery solrQuery = new SolrQuery();
139             // 3、設置查詢條件,過濾條件,分頁條件,排序條件,高亮
140             // key的q就是指查詢條件。
141             // solrQuery.set("q", "*:*"); //等價於solrQuery.setQuery("*:*");
142             // 查詢所有的不能指定高亮的。
143             // solrQuery.setQuery("*:*");// *:*是查詢出所有的。
144             // 這里沒有指定在那里域上面進行搜索,所以需要指定默認搜索域
145             solrQuery.setQuery("小米手機9");
146             // 分頁默認是0-10。分頁條件。
147             solrQuery.setStart(0);// 起始數
148             solrQuery.setRows(20);// 查詢出多少條
149             // 設置默認搜索域。就是如果Query不設置查詢那個字段,這里必須指定一個默認值,進行搜索。
150             solrQuery.set("df", "product_name");
151             // 設置高亮。
152             solrQuery.setHighlight(true);// 開啟高亮
153             // 設置高亮顯示的域
154             solrQuery.addHighlightField("product_catalog_name");
155             // 設置高亮顯示的前綴和后綴
156             solrQuery.setHighlightSimplePre("<em>");
157             solrQuery.setHighlightSimplePost("</em>");
158 
159             // 4、執行查詢,得到一個Response對象
160             QueryResponse response = solrServer.query(solrQuery);
161 
162             // 5、取出查詢結果總記錄數
163             SolrDocumentList solrDocumentList = response.getResults();
164             // 查詢出結果總記錄數
165             System.out.println("查詢結果總記錄數: " + solrDocumentList.getNumFound());
166 
167             for (SolrDocument solrDocument : solrDocumentList) {
168                 System.out.println("id : " + solrDocument.get("id"));
169                 // 取出高亮顯示
170                 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
171                 List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
172                 String product_name = "";
173                 if (list != null && list.size() > 0) {
174                     product_name = list.get(0);
175                 } else {
176                     product_name = (String) solrDocument.get("product_name");
177                 }
178                 System.out.println(product_name);
179                 System.out.println("product_price : " + solrDocument.get("product_price"));
180                 System.out.println("product_picture : " + solrDocument.get("product_picture"));
181                 System.out.println("product_description : " + solrDocument.get("product_description"));
182                 System.out.println("product_catalog_name : " + solrDocument.get("product_catalog_name"));
183                 System.out.println("=============================================");
184             }
185 
186             // 提交
187             solrServer.commit();
188         } catch (SolrServerException e) {
189             e.printStackTrace();
190         } catch (IOException e) {
191             e.printStackTrace();
192         }
193 
194     }
195 
196 }

查詢刪除效果如下所示:




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM