一、solr用普通方法處理查詢結果
代碼展示:
這個方法不是常用,因爲在solr的軟件裏都有對應的查詢功能,只不過這裏把軟件轉換成Java代碼了,話不多說,現在來看看具體代碼,只瞭解一下即可。
代碼如下:
packagesolrPublicToQueryPackage;
importjava.io.IOException;
importorg.apache.solr.client.solrj.SolrQuery;
importorg.apache.solr.client.solrj.SolrQuery.ORDER;
importorg.apache.solr.client.solrj.SolrServerException;
importorg.apache.solr.client.solrj.impl.BinaryRequestWriter;
importorg.apache.solr.client.solrj.impl.HttpSolrServer;
importorg.apache.solr.client.solrj.impl.XMLResponseParser;
importorg.apache.solr.client.solrj.response.QueryResponse;
importorg.apache.solr.common.SolrDocument;
importorg.apache.solr.common.params.ModifiableSolrParams;
//普通方式處理查詢結果
publicclass solrPublicQuery {
public static final String SOLR_URL ="http://localhost:8080/solr";
publicstatic void main(String[] args) throws SolrServerException, IOException {
HttpSolrServer server = newHttpSolrServer(SOLR_URL);
server.setMaxRetries(1);
server.setMaxRetries(1); // defaults to0. > 1 not recommended.
server.setConnectionTimeout(5000); // 5seconds to establish TCP
//正常情況下,以下參數無須設置
//使用老版本solrj操作新版本的solr時,因爲兩個版本的javabinincompatible,所以需要設置Parser
server.setParser(new XMLResponseParser());
server.setSoTimeout(1000); // socket readtimeout
server.setDefaultMaxConnectionsPerHost(100);
server.setMaxTotalConnections(100);
server.setFollowRedirects(false); //defaults to false
//allowCompression defaults to false.
// Server side must support gzip ordeflate for this to have any effect.
server.setAllowCompression(true);
//1、使用ModifiableSolrParams傳遞參數
ModifiableSolrParamsparams = new ModifiableSolrParams();
//192.168.230.128:8983/solr/select?q=video&fl=id,name,price&sort=priceasc&start=0&rows=2&wt=json
// 設置參數,實現上面URL中的參數配置
// 查詢關鍵詞
// params.set("q", "name");
// // 返回信息
// params.set("fl","id,name,price,price_c");
// // 排序
// params.set("sort", "priceasc");
// //分頁,start=0就是從0開始,rows=5當前返回5條記錄,第二頁就是變化start這個值爲5就可以了
// params.set("start", 2);
// params.set("rows", 2);
// // 返回格式
// params.set("wt","javabin");
// QueryResponse response = server.query(params);
//2、使用SolrQuery傳遞參數,SolrQuery的封裝性更好
server.setRequestWriter(newBinaryRequestWriter());
SolrQuery query = new SolrQuery();
query.setQuery("name");
query.setFields("id","name","price","price_c");
query.setSort("price",ORDER.asc);
query.setStart(0);
query.setRows(2);
query.setRequestHandler("/select");
QueryResponse response = server.query(query);
//搜索得到的結果數
System.out.println("Find:" +response.getResults().getNumFound());
// 輸出結果
int iRow = 1;
for (SolrDocument doc :response.getResults()) {
System.out.println("----------" +iRow + "------------");
System.out.println("id: " +doc.getFieldValue("id").toString());
System.out.println("name: " +doc.getFieldValue("name").toString());
System.out.println("price: "
+doc.getFieldValue("price").toString());
System.out.println("price_c: "+ doc.getFieldValue("price_c"));
iRow++;
}
}
}
順便提一下,看見標有1、2兩種方法的查詢方式都是可以用的,但是方法2是最佳方案;
熟悉完代碼之後,大家在看看solr軟件,是不是這裏的好多設置和軟件是一樣的,只不過是代碼而已。
以上代碼只供瞭解,用代碼查詢,大多數用的是POJO的處理查詢結果,下面就來介紹一下用POJO怎樣來處理查詢結果?
二、solr用POJO處理查詢結果
代碼展示:
packagesolrPOJODealWithQueryResult;
importjava.io.IOException;
importjava.util.List;
importorg.apache.solr.client.solrj.SolrQuery;
importorg.apache.solr.client.solrj.SolrServerException;
importorg.apache.solr.client.solrj.beans.DocumentObjectBinder;
importorg.apache.solr.client.solrj.impl.HttpSolrServer;
importorg.apache.solr.client.solrj.response.FacetField;
importorg.apache.solr.client.solrj.response.QueryResponse;
importorg.apache.solr.common.SolrDocument;
importorg.apache.solr.common.SolrDocumentList;
importsolrPOJOPackage.NewsBean;
//採用POJOs方式處理查詢結果
publicclass solrPOJODealWithResult {
publicstatic final String SOLR_URL = "http://localhost:8080/solr";
publicstatic void main(String[] args) throws SolrServerException, IOException {
//http://172.168.63.233:8983/solr/collection1/select?q=description%3A%E6%80%BB%E7%9B%AE%E6%A0%87&facet=true&facet.field=author_s
HttpSolrServerserver = new HttpSolrServer(SOLR_URL);
server.setMaxRetries(1);
server.setMaxRetries(1);// defaults to 0. > 1 not recommended.[,rekə'mendɪd]
server.setConnectionTimeout(5000);// 5 seconds to establish [ɪ'stæblɪʃ; e-] (創立)TCP
//server.setRequestWriter(new BinaryRequestWriter());
SolrQueryquery = new SolrQuery();
query.setQuery("description:改革");
query.setStart(0);
query.setRows(2);
query.setFacet(true);
query.addFacetField("author_s");
QueryResponseresponse = server.query(query);
//搜索得到的結果數
System.out.println("Find:"+ response.getResults().getNumFound()+"毫秒");
//輸出結果
intiRow = 1;
//response.getBeans存在BUG,將DocumentObjectBinder引用的Field應該爲org.apache.solr.client.solrj.beans.Field
SolrDocumentListlist = response.getResults();
DocumentObjectBinder binder = newDocumentObjectBinder();
List<NewsBean>beanList=binder.getBeans(NewsBean.class, list);
for(NewsBeannews:beanList){
System.out.println("news的ID爲:"+news.getId());
}
for(SolrDocument doc : response.getResults()) {
System.out.println("----------" +iRow + "------------");
System.out.println("id:" + doc.getFieldValue("id").toString());
System.out.println("name: " +doc.getFieldValue("name").toString());
iRow++;
}
for(FacetField ff : response.getFacetFields()) {
System.out.println(ff.getName()+ "," + ff.getValueCount() + ","
+ff.getValues());
}
}
}
效果展示:
在打印臺的效果演示:
在solr服務器上查詢,順便驗證一下:
結果證明了:
我的查找是正確,所以,在大多數常態下,會用到的就是solr,相比較Lucene來說,
solr是不是更加的強大呢?
以上就是solr指南的全部內容,希望可以幫到大家,有什麼不足的地方,可以自己改
正或是私聊我,希望大家能夠共同進步!