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;
[java] view plaincopy
/** * @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("");// 標記 query.setHighlightSimplePost(""); 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); ListcountList = 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 info = new HashMap(); GroupResponse groupResponse = response.getGroupResponse(); if(groupResponse != null) { ListgroupList = groupResponse.getValues(); for(GroupCommand groupCommand : groupList) { Listgroups = 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? 0102 0304 05640648* 071208609 1101112 74131614 131510164* 17418319 2202211* 2212312425*分組名64* 分組內條目,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()); Listfacets = response.getFacetFields();// 返回的facet列表 for (FacetField facet : facets) { System.out.println(facet.getName()); System.out.println("----------------"); Listcounts = 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()); Listfacets = response.getFacetFields();// 返回的facet列表 for (FacetField facet : facets) { System.out.println(facet.getName()); System.out.println("----------------"); Listcounts = facet.getValues(); for (Count count : counts) { System.out.println(count.getName() + ":" + count.getCount()); } System.out.println(); } // 根據時間段來獲取數據 Map maps = response.getFacetQuery(); for (Entry 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("");// 標記 query.setHighlightSimplePost(""); 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()); Listfacets = rsp.getFacetFields();// 返回的facet列表 for (FacetField facet : facets) { System.out.println(facet.getName()); System.out.println("----------------"); Listcounts = facet.getValues(); for (Count countitem : counts) { System.out.println(countitem.getName() + ":" + countitem.getCount()); } System.out.println(); } // 根據時間段來獲取數據 Map maps = rsp.getFacetQuery(); for (Entry 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; } } </pre>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!