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 }
查詢刪除效果如下所示:

