2014年10月27日 星期一

Solr_07_Client API SolrJ


SolrJ API 隱藏了許多連接到Solr的細節,提供了一個讓Java應用程式能夠跟Solr簡單互動的高層次方法,
如果要使用SolrJ所提供的API
可以先在專案pom.xml檔中加入dependency
        <dependency>
            <groupId>org.apache.solr</groupId>
            <artifactId>solr-solrj</artifactId>
            <version>4.10.0</version>
        </dependency>  
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.directory.studio</groupId>
            <artifactId>org.apache.commons.codec</artifactId>
            <version>1.8</version>
        </dependency>  
加入後就可以使用solrj提供的API
在SolrJ的主要package是 org.apache.solr.client.solrj ,其中僅包含了五個大類,我們可以通過創建一個SolrServer實例,發送SolrRequests 或SolrQuerys 並取回SolrResponses。
SolrServer本身是抽象的,所以為了要連接到遠端的Solr伺服器,我們需要使用實際實作的HttpSolrServer或CloudSolrServer中的其中一個,並且通過HTTP與Solr雙向溝通。
在HttpSolrServer是使用顯式的solr URL配置,而CloudSolrServer使用zkHost字符串的SolrCloud集群配置。
String urlString = "http://localhost:8983/solr";
HttpSolrServer solr = new HttpSolrServer(urlString);
//如果有加驗證系統的話,需要加入填入帳號密碼才得以查詢或進行其它功能
//HttpClientUtil.setBasicAuth((DefaultHttpClient) solr.getHttpClient(), "admin", "admin");

String zkHostString = "zkServerA:2181,zkServerB:2181/solr";
CloudSolrServer solr = new CloudSolrServer(zkHostString);
//如果有加驗證系統的話,需要加入填入帳號密碼才得以查詢或進行其它功能
//HttpClientUtil.setBasicAuth(solr.getLbServer().getHttpClient(), <username>, <password>);
當有一個SolrServer,我們就可以透過調用方法,執行查詢、加入和提交

以下提供兩個範例,做為參考
新增索引
  public void add() throws SolrServerException, IOException {
 SolrServer solr = new HttpSolrServer("http://localhost:8983/solr/db");
    SolrInputDocument document = new SolrInputDocument();
    document.addField("menu_id", 552199);
    document.addField("menu_name", "這是測試");
    document.addField("menu_url", "http://test.com");
    UpdateResponse response = solr.add(document);
    System.out.println(response.getStatus());
    solr.commit();
    solr.shutdown();
  }

查詢
  public void query() throws SolrServerException {
    SolrServer solr = new HttpSolrServer("http://localhost:8983/solr/db");
    SolrQuery parameters = new SolrQuery();
    parameters.set("q", "管理");
    //parameters.set("q", "menu_name:測試");
    parameters.set("fl", "*,score");
    parameters.set("row", 100);
    QueryResponse response = solr.query(parameters);
    SolrDocumentList list = response.getResults();
    for (SolrDocument doc : list) {
      for (String key : doc.keySet()) {
        System.out.println(key + ":" + doc.get(key));
      }
    }
    solr.shutdown();
  }

另外可以用JavaBean的方式加入索引,因為SolrJ不支持巢狀建立索引(一對多),所以無法直接使用配合ORM所建立好的entity來進行處理,折終解決方案還是得要另外建立JavaBean進行轉換。

沒有留言:

張貼留言