JAVA操作solr的實現其實很簡單,但是很多細節要注意,在實際的開發中,很多人喜歡自己封裝這些基礎的方法以一個全新的“面貌”出現,其實都是一回事,操作熟了自然就會想到將一些實現功能用到的方法重新封裝,這也是編程進階的表現。
SolrJ的使用
SolrJ覆蓋了solr的全部功能,下面將自己在實際開發中所使用的程序粘貼出來並適當加以解釋,由於本人比較菜,代碼書寫不是那麼的精練,還請見諒。
1、 創建solrserver對象:
try {
solr = new CommonsHttpSolrServer("http://localhost:8983/solr");
solr.setConnectionTimeout(100);
solr.setDefaultMaxConnectionsPerHost(100);
solr.setMaxTotalConnections(100);
} catch (Exception e) {
System.out.println("請檢查tomcat服務器或端口是否開啓!");
e.printStackTrace();
}
2、 添加索引
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
for (int i = 0; i < list.size(); i++) {
Item item = list.get(i);
//設置每個字段不得爲空,可以在提交索引前進行檢查
if (CheckItem(item)) {
SolrInputDocument doc = new SolrInputDocument();
//在這裏請注意date的格式,要進行適當的轉化,上文已提到
doc.addField("id", item.getId());
…………
docs.add(doc);
}
}
try {
solr.add(docs);
//對索引進行優化
solr.optimize();
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
3、 使用bean對象添加索引
創建一個對應於solr索引的類別:
public class Item {
@Field
private String id;
…………
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
…………
public Item(){
}
}
使用數據創建bean對象列表,
try {
solr.addBeans(beansList);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
solr.optimize();
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
索引提交完畢。
4、 刪除索引
據查詢結果刪除:
try {
//刪除所有的索引
solr.deleteByQuery("*:*");
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
根據索引號刪除索引:
try {
solr.deleteById(ids);
solr.commit();
} catch (Exception e) {
e.printStackTrace();
}
5、 查詢
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” 一定要保持大寫!
6、 讀取查詢結果
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);
}
}
7、 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;
}
轉載地址:http://blog.csdn.net/ITbasketplayer/article/details/8086160