1:查詢
SolrJ提供的查詢功能比較強大,可以進行結果中查詢、範圍查詢、排序等。
下面是筆者封裝的一個查詢函數:
public static QueryResponse Search(String[] field, String[] key, int start,
int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {
//檢測輸入是否合法
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("title");// 高亮字段
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 = solr.query(query);
} catch (Exception e) {
e.printStackTrace();
return null;
}
//返回查詢結果
return rsp;
}
補充一下範圍查詢的格式:[star t TO end],start與end是相應數據格式的值的字符串形式,“TO” 一定要保持大寫!
2: 讀取查詢結果
DocList讀取返回結果:
SolrDocumentList solrList = rsp.getResults();
Beans讀取返回結果:
List<Item> tmpLists = rsp.getBeans(Item.class);
讀取高亮顯示結果:
rsp = Search(field, key, 0, 10, sortfield, flag, true);
if(null == rsp){
return;
}
Map<String, Map<String, List<String>>> hightlight = rsp.getHighlighting();
//Item即爲上面定義的bean類
List<Item> tmpLists = rsp.getBeans(Item.class);
for (int i = 0; i < tmpLists.size(); i++) {
//hightlight的鍵爲Item的id,值唯一,我們設置的高亮字段爲title
String hlString = hightlight.get(tmpLists.get(i).getId()).get("title").toString();
if (null != hlString) {
System.out.println(hlString);
}
}
3: Facet的一個應用:自動補全
//prefix爲前綴,min爲最大返回結果數
public static String[] autoComplete(String prefix, int min) {
String words[] = null;
StringBuffer sb = new StringBuffer("");
SolrQuery query = new SolrQuery("*.*");
QueryResponse rsp= new QueryResponse();
//Facet爲solr中的層次分類查詢
try {
query.setFacet(true);
query.setQuery("*:*");
query.setFacetPrefix(prefix);
query.addFacetField("title");
rsp = solr.query(query);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
}
if(null != rsp){
FacetField ff = rsp.getFacetField("title");
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;
}
solr Java 操作 solr query + facet
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.