SolrJ使用


HttpSolrServer

HttpSolrServer使用HTTPClient 和solr服務器進行通信。
  String url = "http://localhost:8080/solr";
  SolrServer server = new HttpSolrServer(url);
HttpSolrServer 是線程安全的,建議重復使用HttpSolrServer 實例。

HttpSorlrServer 允許設置鏈接屬性

String url = "http://localhost:8080/solr"
  HttpSolrServer server = new HttpSolrServer( url );
  server.setSoTimeout(1000);  // socket read timeout
  server.setConnectionTimeout(100);
  server.setDefaultMaxConnectionsPerHost(100);
  server.setMaxTotalConnections(100);
  server.setFollowRedirects(false);  // defaults to false
  // allowCompression defaults to false.
  // Server side must support gzip or deflate for this to have any effect.
  server.setAllowCompression(true);
  server.setMaxRetries(1); // defaults to 0.  > 1 not recommended.

EmbeddedSolrServer

EmbeddedSorrServer提供和HttpSorlrServer相同的接口,它不需要http連接

//注意,下面的屬性也是可以在jvm參數里面設置的
  System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr");
  CoreContainer.Initializer initializer = new CoreContainer.Initializer();
  CoreContainer coreContainer = initializer.initialize();
  EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");  

如果你想要使用 Multicore 特性,那么你可以這樣使用:

   File home = new File( getSolrHome() );
    File f = new File( home, "solr.xml" );
    multicore.load( getSolrHome(), f );

    EmbeddedSolrServer server = new EmbeddedSolrServer( multicore, "core name as defined in solr.xml" );

如果你在你的項目中內嵌solr服務,這將是一個不錯的選擇。無論你能否使用http,它都提供相同的接口

用法

    solrj 被設計成一個可擴展的框架,用以向solr服務器提交請求,並接收回應。

    我們已經將最通用的一些命令封裝在了solrServer類中了。

Adding Data to Solr添加DOC到Solr索引

    首先需要獲得一個server的實例, 

 SolrServer server = getSolrServer();

  如果,你使用的是一個遠程的solrServer的話呢,你或許會這樣來實現getSolrServer()這個方法:

public SolrServer getSolrServer(){
  return new HttpSolrServer(url);
}

  如果,你使用的是一個本地的solrServer的話,你或許會這樣來實現getSolrServer()方法:

public SolrServer getSolrServer(){
    //the instance can be reused
    return new EmbeddedSolrServer();
}

  如果,你在添加數據之前,想清空現有的索引,那么你可以這么做:

server.deleteByQuery( "*:*" );// delete everything!

  構造一個document

    SolrInputDocument doc1 = new SolrInputDocument();
    doc1.addField( "id", "id1", 1.0f );
    doc1.addField( "name", "doc1", 1.0f );
    doc1.addField( "price", 10 );

  構造另外一個文檔,每個文檔都能夠被獨自地提交給solr,但是,批量提交是更高效的。每一個對SolrServer的請求都是http請求,當然對於EmbeddedSolrServer來說,是不一樣的。

    SolrInputDocument doc2 = new SolrInputDocument();
    doc2.addField( "id", "id2", 1.0f );
    doc2.addField( "name", "doc2", 1.0f );
    doc2.addField( "price", 20 );

  構造一個文檔的集合

    Collection<SolrInputDocument> docs = new  ArrayList<SolrInputDocument>();
    docs.add( doc1 );
    docs.add( doc2 );

  將documents提交給solr

  server.add( docs );

  提交一個commit

   server.commit();

在添加完documents后,立即做一個commit,你可以這樣來寫你的程序:

    UpdateRequest req = new UpdateRequest(); 
     req.setAction( UpdateRequest.ACTION.COMMIT, false, false );
    req.add( docs );
     UpdateResponse rsp = req.process( server );  

Directly adding POJOs to Solr

使用 java 注釋創建java bean。@Field ,可以被用在域上,或者是setter方法上。如果一個域的名稱跟bean的名稱是不一樣的,那么在java注釋中填寫別名,具體的,可以參照下面的域categories 

import org.apache.solr.client.solrj.beans.Field;

 public class Item {
    @Field
    String id;

    @Field("cat")
    String[] categories;

    @Field
    List<String> features;

  }

java注釋也可以使用在setter方法上,如下面的例子:

  @Field("cat")
   public void setCategory(String[] c){
       this.categories = c;
   }

創建bean實例

   Item item = new Item();
    item.id = "one";
    item.categories =  new String[] { "aaa", "bbb", "ccc" };

添加給Solr

server.addBean(item);

將多個bean提交給solr

 List<Item> beans ;
  //add Item objects to the list
  server.addBeans(beans);   

注意: 你可以重復使用SolrServer,這樣可以提高性能。

 

Reading Data from Solr搜索

獲取solrserver的實例

SolrServer server = getSolrServer();

構造 SolrQuery

    SolrQuery query = new SolrQuery();
    query.setQuery( "*:*" );
    query.addSortField( "price", SolrQuery.ORDER.asc );

向服務器發出查詢請求

QueryResponse rsp = server.query( query );   

獲取結果。

SolrDocumentList docs = rsp.getResults();

想要以javabean的方式獲取結果,那么這個javabean必須像之前的例子一樣有java注釋

 List<Item> beans = rsp.getBeans(Item.class);

高級用法

       solrJ 提供了一組API,來幫助我們創建查詢,下面是一個faceted query的例子。

 SolrServer server = getSolrServer();
  SolrQuery solrQuery = new  SolrQuery().
                setQuery("ipod").
                setFacet(true).
                setFacetMinCount(1).
                setFacetLimit(8).
                addFacetField("category").
                addFacetField("inStock");  
  QueryResponse rsp = server.query(solrQuery);

所有的 setter/add 方法都是返回它自己本身的實例,所以就像你所看到的一樣,上面的用法是鏈式的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM