Solr使用入门指南 (六)

solr处理查询结果
solr处理查询结果的方法有两种:一种是普通方法处理查询结果,另一种是用POJO处理查询结果,下面就来讲解一下具体的应用。

一、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++;

              }

    }

}

顺便提一下,看见标有12两种方法的查询方式都是可以用的,但是方法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指南的全部内容,希望可以帮到大家,有什么不足的地方,可以自己改

正或是私聊我,希望大家能够共同进步!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章