1. 程式人生 > >solr7.0.1的Java專案實現

solr7.0.1的Java專案實現

  上面一章節已經講完了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;
	     }