[ solr入門 ] - 利用solrJ進行檢索

[ solr入門 ] - 利用solrJ進行檢索html

solrJ能夠當作是solr的java版客戶端,提供基本的索引維護、檢索等功能。java

 

solrJ和solr服務端有兩種「溝通」方式:web

第一,利用http進行通訊。負載均衡

第二,直接訪問solrCore(solr配置文件、索引文件等),不須要http通訊(without http)。ui

solrJ的SolrServer類結構以下圖所示:url

EmbeddedSolrServer是第二種方式,CommonsHttpSolrServer,LBHttpSolrServer是第一種方式,spa

其中LBHttpSolrServer是在CommonsHttpSolrServer的基礎上提供了負載均衡的功能(load Balanced)。code

在不少應用場景下,咱們基本都會選擇CommonsHttpSolrServer(LBHttpSolrServer)的方式。最近筆者有這樣一個需求,在異構平臺上,有多種語言開發的系統都須要對基礎數據進行檢索,若是每一個系統都針對性的開發一個客戶端,主要缺陷是緊耦合。所以筆者考慮在solr的基礎上開發一套標準的webService接口發佈服務,若是在solrCore的基礎上進行調整,調整量太大,若是藉助solrJ的CommonsHttpSolrServer與solrServer進行溝通,那麼就會多走一次http。最後發現EmbeddedSolrServer能夠解決這個問題。server

而後目前EmbeddedSolrServer也有一些問題須要處理,例如:multiCore、load Balanced等。htm

 

下面咱們從檢索入手,初步瞭解solrJ的使用方法。

第一步:創建solrJ客戶端的「通信員」(CommonsHttpSolrServer)

SolrServer server = new CommonsHttpSolrServer( url );

 

第二步:檢索

方式一:藉助SolrRequestParsers解析「檢索字符串」進行檢索

public void query01(String queryString) {

        SolrParams solrParams = SolrRequestParsers

                .parseQueryString(queryString);

        try {

            QueryResponse rsp = solr.query(solrParams);

            List<PatentBean> results = rsp.getBeans(PatentBean.class);

            for (PatentBean bean : results)

                System.out.println(bean.toString());

        } catch (SolrServerException e) {

            e.printStackTrace();

        }

    }

queryString:String queryString = "q=ti:汽車&version=2.2&start=0&rows=10&indent=on";

這種方式簡單,可是在應用中經過拼接字符串是比較憋足的,因此這種方式應用較少。

注意:

List<PatentBean> results = rsp.getBeans(PatentBean.class);Bean這種方式,無論索引維護,仍是檢索都十分方便。

 

方式二:藉助ModifiableSolrParams對象接收查詢條件進行檢索

public void query02(String queryString) {

        ModifiableSolrParams solrParams = new ModifiableSolrParams();

        solrParams.add("q", queryString);

        solrParams.add("start", "0");

        solrParams.add("rows", "10");

        try {

            QueryResponse rsp = solr.query(solrParams);

            List<PatentBean> results = rsp.getBeans(PatentBean.class);

            for (PatentBean bean : results)

                System.out.println(bean.toString());

        } catch (SolrServerException e) {

            e.printStackTrace();

        }

    }

這種方式和第一種相似,若是第一種方式用個StringBuilt接收參數,那麼就沒什麼兩樣了! 

 

方式三:藉助solrQuery對象接收查詢條件進行檢索

public void query02(String queryString) {

        SolrQuery query = new SolrQuery();

        query.setQuery(queryString);

        query.setStart(0);

        query.setRows(10);

        QueryResponse rsp;

        try {

            rsp = solr.query(query);

            List<PatentBean> results = rsp.getBeans(PatentBean.class);

            for (PatentBean bean : results)

                System.out.println(bean.toString());

        } catch (SolrServerException e) {

            e.printStackTrace();

        }

    }

添加高亮效果:

query.setHighlight(true).setHighlightSnippets(1);

query.setParam("hl.fl", "ti");

 

使用EmbeddedSolrServer進行檢索

建立EmbeddedSolrServer對象,以下:

private static CoreContainer.Initializer initializer = null;

    private static CoreContainer coreContainer = null;

    private static EmbeddedSolrServer server = null;

    static {

        try {

            System.setProperty("solr.solr.home", "D:/solrHome/example/solr02");

            initializer = new CoreContainer.Initializer();

            coreContainer = initializer.initialize();

            server = new EmbeddedSolrServer(coreContainer, "");

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

相關文章
相關標籤/搜索