這裏介紹兩種方法:1.Solrj,2.httpClient httpGet
1.Solrj
首先需要下載Solrj相關的jar包,其實在Solr的下載包中就已經包含了Solrj jar包和依賴的jar包,具體位置:
依賴:Solr解壓文件\dist\solrj-lib
Solrj:Solr解壓文件\dist solr-solrj-5.5.5.jar
將相關jar包放入項目中
連接Solr服務器的方式(這裏使用在本地搭建的Solr服務器來做示例,本地Solr服務器搭建方法http://blog.csdn.net/yeyinglingfeng/article/details/79126161)
HttpSolrClient server = new HttpSolrClient("http://10.12.30.85:8080/solr/core1");
server.setConnectionTimeout(300000);//連接超時時間5分鐘
server.setParser(new XMLResponseParser()); // binary parser is used by default
server.setSoTimeout(1000); // socket read timeout
server.setDefaultMaxConnectionsPerHost(100);
server.setMaxTotalConnections(100);
server.setFollowRedirects(false); // defaults to false
server.setAllowCompression(true);
SolrQuery query=new SolrQuery();
query.setQuery("id:151");
query.addFilterQuery("itemName:yby");
query.addField("itemName,ownerNo");
QueryResponse responseInfo = server.query(query);
List<trainingItem> trainingItem=responseInfo.getBeans(trainingItem.class);
for(trainingItem item:trainingItem){
System.out.println(item.getId()+":"+item.getItemNo()+":"+item.getItemName()+":"+item.getOwnerNo());
}
query.setQuery("id:151");
代表Solr控制界面Query中的p字段
query.addFilterQuery("itemName:yby");
代表fq字段
query.addField("itemName,ownerNo");
代表fl字段
QueryResponse responseInfo = server.query(query);
拼接/發送信息,並獲取Solr服務器返回的數據。
trainingItem
是一個javaBean,用來存儲拿出的數據信息,參數對應查詢出的信息的對應列。
2.httpClient
從第1種獲取數據的方式中我們可以看到是通過HttpSolrClient這個類來實現的,是不是有種熟悉的感覺,httpClient,想不到你個濃眉大眼的也混了進來,由此推測是否也可以通過httpClient的httpGet,httpPost方式獲取數據呢?
再來回顧下Solr簡介:用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。這是上一篇文章中提到過的,所以,我們應該可以通過httpGet的方式來獲取數據(說白了就是網頁爬取方式了)。
再來看下Solr服務器 Query界面,當輸入完產尋條件後點擊查詢,我們可以看到右邊界面的最上方有一個網址:
把網址輸入瀏覽器,可以看到瀏覽器返回了json格式的查詢結果:
所以,在簡單的查詢條件下,是可以直接用上面這種方式訪問數據的,只是需要我們自己來拼接下網址罷了。
httpClient,httpGet方式爬取頁面:
這裏需要fastjson-1.1.24.jar來轉換json數據。
因爲從上圖中可知,我們所需的數據都存放在response,docs中,所以,使用httpGet獲取到json數據後,可以一步步的去拿取到所需信息。
CloseableHttpClient httpClient = HttpClients.createDefault();
//查詢網址,實際使用時需要拼接入查詢條件
HttpGet httpGet = new HttpGet("http://10.12.30.85:8080/solr/core1/select?indent=on&q=*:*&wt=json");
HttpResponse response;
String line;
response = httpClient.execute(httpGet);
HttpEntity httpEntity = response.getEntity();
BufferedReader bufferedReader = null;
bufferedReader = new BufferedReader(new InputStreamReader(
httpEntity.getContent(), "utf-8"), 8 * 1024);
String entityStringBuilder = "";
while ((line = bufferedReader.readLine()) != null) {
entityStringBuilder+=line + "\n";
}
JSONObject obj = JSONObject.parseObject(entityStringBuilder);
obj=obj.getJSONObject("response");
JSONArray param = obj.getJSONArray("docs");
List<trainingItem> list = new ArrayList<trainingItem>();
list=JSONObject.parseArray(param.toString(),trainingItem.class);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).getId()+":"+list.get(i).getItemName());
}
其實對比下2種方式,Solrj中的HttpSolrClient,QueryResponse,可以看出Solrj的實現原理應該也是httpClient,推薦使用第一種方式,畢竟連接更加穩定。
這時順便看下Solrj依賴的jar包:
emmmm…