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指南的全部內容,希望可以幫到大家,有什麼不足的地方,可以自己改

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


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