solr在使用solrj操作中的各個操作大全(在solrcores中測試)


package com.fjsh.SearchJobsFirst;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.RepaintManager;
import javax.swing.text.html.parser.Entity;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.Group;
import org.apache.solr.client.solrj.response.GroupCommand;
import org.apache.solr.client.solrj.response.GroupResponse;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.GroupParams;
import org.apache.solr.common.params.ModifiableSolrParams;
/** * @Project JobsOtherWebSearch * @Package com.fjsh.SearchJobsFirst * @ClassName: SearchJobs  * @Author fjsh * @Description: 對solr中的各個功能進行測試 * @Date 2014-3-5 下午3:38:09  */public class SearchJobs {	private static String url = "jdbc:sqlserver://192.168.2.106:1433;DatabaseName=JobsOtherweb51jobDB";	private static String user = "sa";	private static String password = "sa";	private String Corenum;	public static int JobsId = 219443;// start jobsid	public SolrServer solrServer = null;// new										// HttpSolrServer("http://192.168.2.100:8080/solr/JobsOtherWeb1");	// 1、 創建solrserver對象:	public SolrServer createSolrServer() {		HttpSolrServer solr = null;		try {			solr = new HttpSolrServer(					"http://192.168.2.106:8080/solr/JobsOtherWeb0");			solr.setConnectionTimeout(100);			solr.setDefaultMaxConnectionsPerHost(100);			solr.setMaxTotalConnections(100);		} catch (Exception e) {			System.out.println("請檢查tomcat服務器或端口是否開啟!");			e.printStackTrace();		}		return solr;	}	// 簡單的查詢,取出二十個	public void querytop20() {		solrServer = createSolrServer();		System.out.println("簡單查詢取出前二十個");		String dtStart = new SimpleDateFormat("yyyyMMddHHmmssSSS")				.format(new Date());		System.out.println("開始時間:" + dtStart + "\n");		try {			SolrQuery query = new SolrQuery();// 查詢			query.setQuery("jobsName:計算機");			query.setRows(20);			SolrDocumentList docs = solrServer.query(query).getResults();			for (SolrDocument sd : docs) {				System.out.println(sd.getFieldValue("jobsName"));				System.out.println(sd.getFieldValue("publishDate"));			}			solrServer.shutdown();			String dtEnd = new SimpleDateFormat("yyyyMMddHHmmssSSS")					.format(new Date());			System.out.println(query);		} catch (SolrServerException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}	// 刪除索引	// 據查詢結果刪除:	public void DeleteByQuery() {		solrServer = createSolrServer();		try {			// 刪除所有的索引			solrServer.deleteByQuery("jobsName:高級技術支持");			solrServer.commit();		} catch (Exception e) {			e.printStackTrace();		}	}	// 根據索引號刪除索引:	public void DeleteByQueryJobsId() {		solrServer = createSolrServer();		try {			solrServer.deleteById("515792");			solrServer.commit();		} catch (Exception e) {			e.printStackTrace();		}	}	// 查詢	// SolrJ提供的查詢功能比較強大,可以進行結果中查詢、范圍查詢、排序等。	// 補充一下范圍查詢的格式:[star t TO end],start與end是相應數據格式的值的字符串形式,“TO” 一定要保持大寫!	/*	 * field 查詢的字段名稱數組 key 查詢的字段名稱對應的值 start 查詢的起始位置 count 一次查詢出來的數量 sortfield	 * 需要排序的字段數組 flag 需要排序的字段的排序方式如果為true 升序 如果為false 降序 hightlight 是否需要高亮顯示	 */	public QueryResponse Search(String[] field, String[] key, int start,			int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {		solrServer = createSolrServer();		// 檢測輸入是否合法		if (null == field || null == key || field.length != key.length) {			return null;		}		if (null == sortfield || null == flag				|| sortfield.length != flag.length) {			return null;		}		SolrQuery query = null;		try {			// 初始化查詢對象			query = new SolrQuery(field[0] + ":" + key[0]);			for (int i = 0; i < field.length; i++) {				query.addFilterQuery(field[i] + ":" + key[i]);			}			// 設置起始位置與返回結果數			query.setStart(start);			query.setRows(count);			// 設置排序			for (int i = 0; i < sortfield.length; i++) {				if (flag[i]) {					query.addSortField(sortfield[i], SolrQuery.ORDER.asc);				} else {					query.addSortField(sortfield[i], SolrQuery.ORDER.desc);				}			}			// 設置高亮			if (null != hightlight) {				query.setHighlight(true); // 開啟高亮組件				query.addHighlightField("jobsName");// 高亮字段				query.setHighlightSimplePre("<font color=\"red\">");// 標記				query.setHighlightSimplePost("</font>");				query.setHighlightSnippets(1);// 結果分片數,默認為1				query.setHighlightFragsize(1000);// 每個分片的最大長度,默認為100			}		} catch (Exception e) {			e.printStackTrace();		}		QueryResponse rsp = null;		try {			rsp = solrServer.query(query);		} catch (Exception e) {			e.printStackTrace();			return null;		}		// 返回查詢結果		return rsp;	}	// Facet的一個應用:自動補全	// prefix為前綴,min為最大返回結果數	// field需要查詢並返回不全的字段,prefix需要查詢並返回的字段不全值	public String[] autoComplete(String field, String prefix, int min) {		/*------------第一處標記------------------------*/		solrServer = createSolrServer();		String words[] = null;		StringBuffer sb = new StringBuffer("");		SolrQuery query = new SolrQuery(field + ":" + prefix);		QueryResponse rsp = new QueryResponse();		// Facet為solr中的層次分類查詢		/*------------第二處標記:程序從第一處標記執行到這里需要300ms所以將上面的代碼進行實例化最好------------------------*/		try {			query.setFacet(true);			// query.setQuery("*:*");			query = new SolrQuery(field + ":" + prefix);			query.setFacetPrefix(prefix);			query.addFacetField(field);			rsp = solrServer.query(query);			/*------------第三處標記:程序從第二處標記執行到這里需要200ms但此處很難再進行優化,由於查詢的復雜性------------------------*/		} catch (Exception e) {			// TODO: handle exception			e.printStackTrace();			return null;		}		if (null != rsp) {			FacetField ff = rsp.getFacetField(field);			List<Count> countList = ff.getValues();			if (null == countList) {				return null;			}			for (int i = 0; i < countList.size(); i++) {				String tmp[] = countList.get(i).toString().split(" ");				// 排除單個字				if (tmp[0].length() < 2) {					continue;				}				sb.append(tmp[0] + " ");				min--;				if (min == 0) {					break;				}			}			words = sb.toString().split(" ");		} else {			return null;		}		return words;	}	/**	 * @Author fjsh	 * @Title SearchGroup	 * @Description 按group進行查找	 * @param QUERY_CONTENT 查詢內容	 * @param QUERY_ROWS 查找的數量,默認是10	 * @param GROUP true or false 是否按group查詢	 * @param GROUP_FIELD 查詢field	 * @param GROUP_LIMIT The number of results (documents) to return for each group. Defaults to 1	 * @Return void	 * @Throws 	 * @Date 2014-5-7	 * 輸出結果的時候,由於定義的數據索引沒有做很好是調整,顯示的結果並不理想,不過此方法可以作為參考	 */	public void SearchGroup(String QUERY_CONTENT,int QUERY_ROWS, Boolean GROUP, String GROUP_FIELD,String GROUP_LIMIT) {		 SolrServer server = createSolrServer();  		 SolrQuery param = new SolrQuery();  		 param.setQuery("jobsName:"+QUERY_CONTENT);  		 param.setRows(QUERY_ROWS);  		 param.setParam(GroupParams.GROUP, GROUP);  		 param.setParam(GroupParams.GROUP_FIELD, GROUP_FIELD);  				 param.setParam(GroupParams.GROUP_LIMIT, GROUP_LIMIT);  		 QueryResponse response = null;  		 try {  		     response = server.query(param);  		 } catch (SolrServerException e) {  		    // logger.error(e.getMessage(), e);  		 }  		 Map<String, Integer> info = new HashMap<String, Integer>();  		 GroupResponse groupResponse = response.getGroupResponse();  		 if(groupResponse != null) {  		     List<GroupCommand> groupList = groupResponse.getValues();  		     for(GroupCommand groupCommand : groupList) {  		         List<Group> groups = groupCommand.getValues();  		         for(Group group : groups) {  		             info.put(group.getGroupValue(), (int)group.getResult().getNumFound()); 		             System.out.println(group.getGroupValue()+"---"+group.getResult().getNumFound());		         }  		     }  		 }  	}	/*	 * 介紹了一下facet之后,來說說怎么實現facet。facet的實現其實很簡單,主要在搜索參數上帶上就OK。	 * 	 * facet=on/true #代表開啟facet facet.field=cate #代表要統計的面(分組),比如上面的分類,品牌,可以多次出現	 * facet.limit =20 #每個分組最多返回條數 facet.mincount = 1 #這個表示分組下某一條目的最小數據量	 * facet.missing = on/true #統計null的值 facet.method = #默認為fc, fc表示Field Cache	 * 比如	 * :http://localhost/product/select/?q=鐵觀音&facet=on&facet.field=category&facet	 * .field=brand&facet.mincount=1在搜索結果中返回xml的facet結果	 * 	 * 	 * view sourceprint? 01 <lst name="facet_counts"> 02 <lst	 * name="facet_queries"/> 03 <lst name="facet_fields"> 04 <lst	 * name="category"> 05 <int name="2742">64</int> 06 <int name="793">48</int>	 * 07 <int name="2741">12</int> 08 <int name="801">6</int> 09 <int	 * name="1087">1</int> 10 </lst> 11 <lst name="brand"> 12 <int	 * name="229">74</int> 13 <int name="227">16</int> 14 <int	 * name="270">13</int> 15 <int name="317">10</int> 16 <int name="0">4</int>	 * 17 <int name="165">4</int> 18 <int name="203">3</int> 19 <int	 * name="147">2</int> 20 <int name="166">2</int> 21 <int name="217">1</int>	 * 22 <int name="342">1</int> 23 <int name="343">1</int> 24 </lst> 25 </lst>	 * <lst name="category"> 分組名 <int name="2742">64</int>	 * 分組內條目,name表示條目,64是統計結果數。	 * 	 * 	 * 	 * 	 * Date Facet 日期類型的字段在文檔中很常見 , 如商品上市時間 , 貨物出倉時間 , 書籍上架時間等等 . 某些情況下需要針對這些字段進行	 * Facet. 不過時間字段的取值有無限性 , 用戶往往關心的不是某個時間點而是某個時間段內的查詢統計結果 . Solr	 * 為日期字段提供了更為方便的查詢統計方式 . 當然 , 字段的類型必須是 DateField( 或其子類型 ). 需要注意的是 , 使用 Date	 * Facet 時 , 字段名 , 起始時間 , 結束時間 , 時間間隔這 4 個參數都必須提供 . 與 Field Facet 類似 ,Date	 * Facet 也可以對多個字段進行 Facet. 並且針對每個字段都可以單獨設置參數 . 2.1 facet.date 該參數表示需要進行 Date	 * Facet 的字段名 , 與 facet.field 一樣 , 該參數可以被設置多次 , 表示對多個字段進行 Date Facet. 2.2	 * facet.date.start 起始時間 , 時間的一般格式為 ” 1995-12-31T23:59:59Z”, 另外可以使用	 * ”NOW”,”YEAR”,”MONTH” 等等 , 具體格式可以參考 org.apache.solr.schema. DateField 的	 * java doc. 2.3 facet.date.end 結束時間 . 2.4 facet.date.gap 時間間隔 . 如果 start 為	 * 2009-1-1,end 為 2010-1-1.gap 設置為 ”+1MONTH” 表示間隔 1 個月 , 那么將會把這段時間划分為 12	 * 個間隔段 . 注意 ”+” 因為是特殊字符所以應該用 ”%2B” 代替 . 2.5 facet.date.hardend 取值可以為	 * true|false, 默認為 false. 它表示 gap 迭代到 end 處采用何種處理 . 舉例說明 start 為	 * 2009-1-1,end 為 2009-12-25,gap 為 ”+1MONTH”,hardend 為 false 的話最后一個時間段為	 * 2009-12-1 至 2010-1-1;hardend 為 true 的話最后一個時間段為 2009-12-1 至 2009-12-25.	 * 2.6 facet.date.other 取值范圍為 before|after|between|none|all, 默認為 none.	 * before 會對 start 之前的值做統計 . after 會對 end 之后的值做統計 . between 會對 start 至 end	 * 之間所有值做統計 . 如果 hardend 為 true 的話 , 那么該值就是各個時間段統計值的和 . none 表示該項禁用 . all 表示	 * before,after,all 都會統計 . 舉例 : &facet=on &facet.date=date	 * &facet.date.start=2009-1-1T0:0:0Z &facet.date.end=2010-1-1T0:0:0Z	 * &facet.date.gap=%2B1MONTH &facet.date.other=all	 */	public void FacetFieldQuery() throws Exception {		solrServer = createSolrServer();		SolrQuery query = new SolrQuery();// 建立一個新的查詢		query.setQuery("jobsName:計算機維護");		query.setFacet(true);// 設置facet=on		// 分類信息分為:薪水,發布時間,教育背景,工作經驗,公司類型,工作類型		query.addFacetField(new String[] { "salary", "publishDate",				"educateBackground", "jobExperience", "companytype", "jobsType" });// 設置需要facet的字段		query.setFacetLimit(10);// 限制facet返回的數量		query.setFacetMissing(false);// 不統計null的值		query.setFacetMinCount(1);// 設置返回的數據中每個分組的數據最小值,比如設置為1,則統計數量最小為1,不然不顯示		// query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO 2014-04-13T00:00:00Z]");		QueryResponse response = solrServer.query(query);		System.out.println("查詢時間:" + response.getQTime());		List<FacetField> facets = response.getFacetFields();// 返回的facet列表		for (FacetField facet : facets) {			System.out.println(facet.getName());			System.out.println("----------------");			List<Count> counts = facet.getValues();			for (Count count : counts) {				System.out.println(count.getName() + ":" + count.getCount());			}			System.out.println();		}	}	// 時間片使用方法	public void FacetFieldQueryDate() throws Exception {		solrServer = createSolrServer();		SolrQuery query = new SolrQuery();// 建立一個新的查詢		query.setQuery("jobsName:計算");		query.setFacet(true);// 設置facet=on		query.setFacetLimit(10);// 限制facet返回的數量		query.setFacetMissing(false);// 不統計null的值		query.setFacetMinCount(1);// 設置返回的數據中每個分組的數據最小值,比如設置為1,則統計數量最小為1,不然不顯示		query.addFacetField(new String[] { "salary", "educateBackground",				"jobExperience", "companytype", "jobsType" });// 設置需要facet的字段		// query.addFacetQuery("publishDate:[2014-04-21T00:00:00Z TO 2014-04-23T00:00:00Z]");		// query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO 2014-04-13T00:00:00Z]");		SimpleDateFormat time0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");		SimpleDateFormat time1 = new SimpleDateFormat("yyyy-MM-dd");		SimpleDateFormat time2 = new SimpleDateFormat("HH:mm:ss");		// return		// date.getYear()+"-"+date.getMonth()+"-"+date.getDay()+"T"+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();		Calendar c = Calendar.getInstance();		c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));		Date date = c.getTime();		String dateNow = time1.format(date) + "T" + time2.format(date) + "Z";		c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));		c.add(Calendar.DATE, -1);		date = c.getTime();		// 當天		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -2);		date = c.getTime();		// 前三天		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -4);		date = c.getTime();		// 前一周		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -7);		date = c.getTime();		// 前兩周		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -16);		date = c.getTime();		// 前一個月		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -30);		date = c.getTime();		// 前兩個月		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		QueryResponse response = solrServer.query(query);		System.out.println("查詢時間:" + response.getQTime());		List<FacetField> facets = response.getFacetFields();// 返回的facet列表		for (FacetField facet : facets) {			System.out.println(facet.getName());			System.out.println("----------------");			List<Count> counts = facet.getValues();			for (Count count : counts) {				System.out.println(count.getName() + ":" + count.getCount());			}			System.out.println();		}		// 根據時間段來獲取數據		Map<String, Integer> maps = response.getFacetQuery();		for (Entry<String, Integer> entry : maps.entrySet()) {			System.out.println(entry.getKey() + ":" + entry.getValue());		}	}	// 最終使用的查詢方式	// SolrJ提供的查詢功能比較強大,可以進行結果中查詢、范圍查詢、排序等。	// 補充一下范圍查詢的格式:[star t TO end],start與end是相應數據格式的值的字符串形式,“TO” 一定要保持大寫!	/*	 * field 查詢的字段名稱數組 key 查詢的字段名稱對應的值 start 查詢的起始位置 count 一次查詢出來的數量 sortfield	 * 需要排序的字段數組 flag 需要排序的字段的排序方式如果為true 升序 如果為false 降序 hightlight 是否需要高亮顯示	 */	public QueryResponse searchResult(String[] field, String[] key, int start,			int count, String[] sortfield, Boolean[] flag, Boolean hightlight)			throws Exception {		solrServer = createSolrServer();		// 檢測輸入是否合法		if (null == field || null == key || field.length != key.length) {			return null;		}				SolrQuery query = null;		try {			// 初始化查詢對象			query = new SolrQuery(field[0] + ":" + key[0]);			for (int i = 0; i < field.length; i++) {				query.addFilterQuery(field[i] + ":" + key[i]);			}			// 設置起始位置與返回結果數			query.setStart(start);			query.setRows(count);			// 設置排序			if (!(null == sortfield || null == flag					|| sortfield.length != flag.length)) {				for (int i = 0; i < sortfield.length; i++) {					if (flag[i]) {						query.addSortField(sortfield[i], SolrQuery.ORDER.asc);					} else {						query.addSortField(sortfield[i], SolrQuery.ORDER.desc);					}				}			}						// 設置高亮			if (null != hightlight) {				query.setHighlight(true); // 開啟高亮組件				query.addHighlightField("jobsName");// 高亮字段				query.setHighlightSimplePre("<font color=\"red\">");// 標記				query.setHighlightSimplePost("</font>");				query.setHighlightSnippets(1);// 結果分片數,默認為1				query.setHighlightFragsize(1000);// 每個分片的最大長度,默認為100			}		} catch (Exception e) {			e.printStackTrace();		}		query.setFacet(true);// 設置facet=on		query.setFacetLimit(10);// 限制facet返回的數量		query.setFacetMissing(false);// 不統計null的值		query.setFacetMinCount(1);// 設置返回的數據中每個分組的數據最小值,比如設置為1,則統計數量最小為1,不然不顯示		query.addFacetField(new String[] { "salary", "educateBackground",				"jobExperience", "companytype", "jobsType" });// 設置需要facet的字段		// query.addFacetQuery("publishDate:[2014-04-21T00:00:00Z TO 2014-04-23T00:00:00Z]");		// query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO 2014-04-13T00:00:00Z]");		SimpleDateFormat time0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");		SimpleDateFormat time1 = new SimpleDateFormat("yyyy-MM-dd");		SimpleDateFormat time2 = new SimpleDateFormat("HH:mm:ss");		// return		// date.getYear()+"-"+date.getMonth()+"-"+date.getDay()+"T"+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();		Calendar c = Calendar.getInstance();		c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));		Date date = c.getTime();		String dateNow = time1.format(date) + "T" + time2.format(date) + "Z";		c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));		c.add(Calendar.DATE, -1);		date = c.getTime();		// 當天		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -2);		date = c.getTime();		// 前三天		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -4);		date = c.getTime();		// 前一周		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -7);		date = c.getTime();		// 前兩周		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -16);		date = c.getTime();		// 前一個月		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		c.add(Calendar.DATE, -30);		date = c.getTime();		// 前兩個月		query.addFacetQuery("publishDate:[" + time1.format(date) + "T"				+ time2.format(date) + "Z" + " TO " + dateNow + "]");		QueryResponse rsp = null;		try {			rsp = solrServer.query(query);			System.out.println("此次查詢時間qtime :" + rsp.getQTime());			List<FacetField> facets = rsp.getFacetFields();// 返回的facet列表			for (FacetField facet : facets) {				System.out.println(facet.getName());				System.out.println("----------------");				List<Count> counts = facet.getValues();				for (Count countitem : counts) {					System.out.println(countitem.getName() + ":"							+ countitem.getCount());				}				System.out.println();			}			// 根據時間段來獲取數據			Map<String, Integer> maps = rsp.getFacetQuery();			for (Entry<String, Integer> entry : maps.entrySet()) {				System.out.println(entry.getKey() + ":" + entry.getValue());			}			// 獲取返回的結果			SolrDocumentList docs = rsp.getResults();						for (SolrDocument doc : docs) {				System.out.println("-----");				System.out.println(doc.getFieldValue("jobsName"));				System.out.println(doc.getFieldValue("publishDate"));			}		} catch (Exception e) {			e.printStackTrace();			return null;		}		// 返回查詢結果		return rsp;	}}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com