solr7.0.1的Java專案實現
阿新 • • 發佈:2019-02-06
上面一章節已經講完了solr的安裝與配置,現在說一下使用solrj來維護solr的索引及操作,solrj就是一個java的客戶端,是一個jar包的使用
首先引入MAVEN的依賴,solrj的版本號要對應solr的版本號
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.0.1</version>
</dependency>
一.solr的使用
package com.solr.web.app.util.solr; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.UpdateResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.StringUtils; import com.solr.web.app.pay.officeorder.entity.CompanyInfo; import com.solr.web.app.pay.officeorder.entity.Follow; public final class FollowTest { private static HttpSolrServer server; private static final String DEFAULT_URL = "http://localhost:8080/solr/crm_follow"; public static void init() { server = new HttpSolrServer(DEFAULT_URL); } public static void indexUser(List<Follow> list) { try { // 新增user bean到索引庫 try { UpdateResponse response = server.addBeans(list); server.commit(); System.out.println(response.getStatus()); } catch (IOException e) { e.printStackTrace(); } } catch (SolrServerException e) { e.printStackTrace(); } } public static void deleteAll() { try { server.deleteByQuery("*:*"); server.commit(false, false); } catch (Exception e) { e.printStackTrace(); } } public static List<Follow> testQueryAll(String name) { List<Follow> followList = null; SolrQuery params = new SolrQuery(); // 查詢關鍵詞,*:*代表所有屬性、所有值,即所有index if (StringUtils.isEmpty(name)) { params.set("q", "*:*"); } else { params.set("q", "content:" + name); } // 分頁,start=0就是從0開始,rows=5當前返回5條記錄,第二頁就是變化start這個值為5就可以了。 params.set("start", 0); params.set("rows", Integer.MAX_VALUE); // 排序,如果按照id排序,那麼將score desc 改成 id desc(or asc) // params.set("sort", "score desc"); params.set("sort", "id asc"); // 返回資訊*為全部,這裡是全部加上score,如果不加下面就不能使用score params.set("fl", "*,score"); QueryResponse response = null; try { response = server.query(params); } catch (SolrServerException | IOException e) { e.printStackTrace(); } if (response != null) { followList = new ArrayList<Follow>(); Follow follow = null; Map<String, Map<String, List<String>>> map = response.getHighlighting(); SolrDocumentList list = response.getResults(); for (int i = 0; i < list.size(); i++) { follow = new Follow(); SolrDocument solrDocument = list.get(i); follow.setId(solrDocument.getFieldValue("id").toString()); follow.setType(solrDocument.getFieldValue("type").toString()); follow.setContent(solrDocument.getFieldValue("content").toString()); follow.setRemarks(solrDocument.getFieldValue("remarks").toString()); followList.add(follow); } } return followList; } public static void main(String[] args) { init(); //刪除全部索引 deleteAll(); System.out.println("刪除成功--------------------------"); //新增索引 List<Follow> list = new ArrayList<Follow>(); Follow follow = new Follow(); follow.setId("12000"); follow.setContent("跟進客戶,預計明天成單!"); follow.setType("1"); follow.setRemarks("明天中午打電話");; list.add(follow); indexUser(list); System.out.println("新增成功--------------------------"); System.out.println("開始查詢--------------------------"); System.out.println(testQueryAll("").get(0).getContent()); } }
執行結果:
刪除成功--------------------------
新增成功--------------------------
開始查詢--------------------------
跟進客戶,預計明天成單!
二.solrJ的使用
1.solrJ新增和修改索引
/** * 往索引庫新增文件。id不存在,則增加,如果id存在,則是修改。 * @throws IOException * @throws SolrServerException */ public void addDoc(String id) throws SolrServerException, IOException{ //構造一篇文件 SolrInputDocument document = new SolrInputDocument(); //往doc中新增欄位,在客戶端這邊新增的欄位必須在服務端中有過定義 document.addField("id", id); document.addField("type", ""); document.addField("content", ""); document.addField("remakers", ""); //獲得一個solr服務端的請求,去提交 ,選擇具體的某一個solr core HttpSolrClient solr = new HttpSolrClient(SOLR_URL); solr.add(document); solr.commit(); solr.close(); }
2.solrJ刪除索引
/**
* 根據id從索引庫刪除文件
*/
public void deleteDocumentById() throws Exception {
//選擇具體的某一個solr core
HttpSolrClient server = new HttpSolrClient(SOLR_URL);
//刪除文件
//server.deleteById("1");
//刪除所有的索引
server.deleteByQuery("*:*");
//提交修改
server.commit();
server.close();
}
3.solrJ查詢索引
/**
* 查詢
* @throws Exception
*/
public static List<Follow> querySolr(String name) throws Exception{
HttpSolrClient solrServer = new HttpSolrClient(SOLR_URL);
SolrQuery query = new SolrQuery();
//下面設定solr查詢引數
//query.set("q", "*:*");// 引數q 查詢所有
query.set("q",name);//相關查詢,比如某條資料某個欄位含有周、星、馳三個字 將會查詢出來 ,這個作用適用於聯想查詢
//引數fq, 給query增加過濾查詢條件
query.addFilterQuery("id:[0 TO 9]");//id為0-4
//給query增加布爾過濾條件
//query.addFilterQuery("description:演員"); //description欄位中含有“演員”兩字的資料
//引數df,給query設定預設搜尋域
query.set("df", "name");
//引數sort,設定返回結果的排序規則
query.setSort("id",SolrQuery.ORDER.desc);
//設定分頁引數
query.setStart(0);
query.setRows(10);//每一頁多少值
//引數hl,設定高亮
query.setHighlight(true);
//設定高亮的欄位
query.addHighlightField("name");
//設定高亮的樣式
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
//獲取查詢結果
QueryResponse response = solrServer.query(query);
//兩種結果獲取:得到文件集合或者實體物件
//查詢得到文件的集合
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("通過文件集合獲取查詢的結果");
System.out.println("查詢結果的總數量:" + solrDocumentList.getNumFound());
//遍歷列表
for (SolrDocument doc : solrDocumentList) {
System.out.println("id:"+doc.get("id")+" content:"+doc.get("content")+" type:"+doc.get("type"));
}
//得到實體物件
List<Follow> tmpLists = response.getBeans(Follow.class);
if(tmpLists!=null && tmpLists.size()>0){
System.out.println("通過文件集合獲取查詢的結果");
for(Follow per:tmpLists){
System.out.println("id:"+per.getId()+" content:"+per.getContent()+" type:"+per.getType());
}
}
return tmpLists;
}