一、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指南的全部内容,希望可以帮到大家,有什么不足的地方,可以自己改
正或是私聊我,希望大家能够共同进步!