zoukankan      html  css  js  c++  java
  • solrj的使用 转

    CommonsHttpSolrServer

        CommonsHttpSolrServer 使用HTTPClient 和solr服务器进行通信。

    Java代码 复制代码
    1. String url = "http://localhost:8983/solr";   
    2.   SolrServer server = new CommonsHttpSolrServer( url );  
      
       

       Setting XMLResponseParser

         sorlr J 目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。

       

    Java代码 复制代码
    1. server.setParser(new XMLResponseParser());  
    server.setParser(new XMLResponseParser());
    

       Changing other Connection Settings

          CommonsHttpSorlrServer 允许设置链接属性。

         

    Java代码 复制代码
    1. String url = "http://localhost:8983/solr"  
    2.   CommonsHttpSolrServer server = new CommonsHttpSolrServer( url );   
    3.   server.setSoTimeout(1000);  // socket read timeout   
    4.   server.setConnectionTimeout(100);   
    5.   server.setDefaultMaxConnectionsPerHost(100);   
    6.   server.setMaxTotalConnections(100);   
    7.   server.setFollowRedirects(false);  // defaults to false   
    8.   // allowCompression defaults to false.   
    9.   // Server side must support gzip or deflate for this to have any effect.   
    10.   server.setAllowCompression(true);   
    11.   server.setMaxRetries(1); // defaults to 0.  > 1 not recommended.  
    String url = "http://localhost:8983/solr"
      CommonsHttpSolrServer server = new CommonsHttpSolrServer( 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提供和CommonsHttpSorlrServer相同的接口,它不需要http连接。

         

    Java代码 复制代码
    1. SolrCore core = SolrCore.getSolrCore();   
    2.   SolrServer server = new EmbeddedSolrServer( core );   
    3.   ...  
    SolrCore core = SolrCore.getSolrCore();
      SolrServer server = new EmbeddedSolrServer( core );
      ...
    

      

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

      

    Java代码 复制代码
    1. File home = new File( getSolrHome() );   
    2.    File f = new File( home, "solr.xml" );   
    3.    multicore.load( getSolrHome(), f );   
    4.   
    5.    EmbeddedSolrServer server = new EmbeddedSolrServer( multicore, "core name as defined in solr.xml" );  
     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

    •     首先需要获得一个server的实例, 
    Java代码 复制代码
    1. SolrServer server = getSolrServer();  
     SolrServer server = getSolrServer();
    
    • 如果,你使用的是一个远程的solrServer的话呢,你或许会这样来实现getSolrServer()这个方法:      
    Java代码 复制代码
    1. public SolrServer getSolrServer(){   
    2.     //the instance can be reused   
    3.     return new CommonsHttpSolrServer();   
    4. }  
    public SolrServer getSolrServer(){
        //the instance can be reused
        return new CommonsHttpSolrServer();
    }
    
    • 如果,你使用的是一个本地的solrServer的话,你或许会这样来实现getSolrServer()方法:      
    Java代码 复制代码
    1. public SolrServer getSolrServer(){   
    2.     //the instance can be reused   
    3.     return new EmbeddedSolrServer();   
    4. }  
    public SolrServer getSolrServer(){
        //the instance can be reused
        return new EmbeddedSolrServer();
    }
    
    • 如果,你在添加数据之前,想清空现有的索引,那么你可以这么做:

            

    Java代码 复制代码
    1. server.deleteByQuery( "*:*" );// delete everything!  
    server.deleteByQuery( "*:*" );// delete everything!
    
    • 构造一个document

             

    Java代码 复制代码
    1. SolrInputDocument doc1 = new SolrInputDocument();   
    2.  doc1.addField( "id""id1"1.0f );   
    3.  doc1.addField( "name""doc1"1.0f );   
    4.  doc1.addField( "price"10 );  
       SolrInputDocument doc1 = new SolrInputDocument();
        doc1.addField( "id", "id1", 1.0f );
        doc1.addField( "name", "doc1", 1.0f );
        doc1.addField( "price", 10 );
    
    • 构造另外一个文档,每个文档都能够被独自地提交给solr,但是,批量提交是更高效的。每一个对SolrServer的请求都是http请求,当然对于EmbeddedSolrServer来说,是不一样的。     
    Java代码 复制代码
    1. SolrInputDocument doc2 = new SolrInputDocument();   
    2. doc2.addField( "id""id2"1.0f );   
    3. doc2.addField( "name""doc2"1.0f );   
    4. doc2.addField( "price"20 );  
        SolrInputDocument doc2 = new SolrInputDocument();
        doc2.addField( "id", "id2", 1.0f );
        doc2.addField( "name", "doc2", 1.0f );
        doc2.addField( "price", 20 );
    
    • 构造一个文档的集合

            

    Java代码 复制代码
    1. Collection<SolrInputDocument> docs = new  ArrayList<SolrInputDocument>();   
    2.  docs.add( doc1 );   
    3.  docs.add( doc2 );  
       Collection<SolrInputDocument> docs = new  ArrayList<SolrInputDocument>();
        docs.add( doc1 );
        docs.add( doc2 );
    
    • 将documents提交给solr
    Java代码 复制代码
    1. server.add( docs );  
    server.add( docs );
    
    • 提交一个commit
    Java代码 复制代码
    1. server.commit();  
     server.commit();
    • 在添加完documents后,立即做一个commit,你可以这样来写你的程序:
    Java代码 复制代码
    1. UpdateRequest req = new UpdateRequest();    
    2.   req.setAction( UpdateRequest.ACTION.COMMIT, falsefalse );   
    3.   req.add( docs );   
    4.   UpdateResponse rsp = req.process( server );    
    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          
    Java代码 复制代码
    1. import org.apache.solr.client.solrj.beans.Field;   
    2.   
    3.  public class Item {   
    4.     @Field  
    5.     String id;   
    6.   
    7.     @Field("cat")   
    8.     String[] categories;   
    9.   
    10.     @Field  
    11.     List<String> features;   
    12.   
    13.   }  
    import org.apache.solr.client.solrj.beans.Field;
    
     public class Item {
        @Field
        String id;
    
        @Field("cat")
        String[] categories;
    
        @Field
        List<String> features;
    
      }
    
    • java注释也可以使用在setter方法上,如下面的例子:

            

    Java代码 复制代码
    1. @Field("cat")   
    2.  public void setCategory(String[] c){   
    3.      this.categories = c;   
    4.  }  
      @Field("cat")
       public void setCategory(String[] c){
           this.categories = c;
       }
    

              这里应该要有一个相对的,get方法(没有加java注释的)来读取属性

    • Get an instance of server
    Java代码 复制代码
    1. SolrServer server = getSolrServer();  
     SolrServer server = getSolrServer();
    
    • 创建bean实例

            

    Java代码 复制代码
    1. Item item = new Item();   
    2.  item.id = "one";   
    3.  item.categories =  new String[] { "aaa""bbb""ccc" };  
       Item item = new Item();
        item.id = "one";
        item.categories =  new String[] { "aaa", "bbb", "ccc" };
    
    • 添加给solr          
    Java代码 复制代码
    1. server.addBean(item);  
    server.addBean(item);
    
    • 将多个bean提交给solr

         

    Java代码 复制代码
    1. List<Item> beans ;   
    2.  //add Item objects to the list   
    3.  server.addBeans(beans);     
     List<Item> beans ;
      //add Item objects to the list
      server.addBeans(beans);   
    

        注意: 你可以重复使用SolrServer,这样可以提高性能。

      Reading Data from Solr

    •    获取solrserver的实例

                

    Java代码 复制代码
    1. SolrServer server = getSolrServer();  
    SolrServer server = getSolrServer();
    •    构造 SolrQuery

         

    Java代码 复制代码
    1. SolrQuery query = new SolrQuery();   
    2. query.setQuery( "*:*" );   
    3. query.addSortField( "price", SolrQuery.ORDER.asc );  
        SolrQuery query = new SolrQuery();
        query.setQuery( "*:*" );
        query.addSortField( "price", SolrQuery.ORDER.asc );
    
    •    向服务器发出查询请求

        

    Java代码 复制代码
    1. QueryResponse rsp = server.query( query );     
    QueryResponse rsp = server.query( query );   
    •    获取结果。

        

    Java代码 复制代码
    1. SolrDocumentList docs = rsp.getResults();  
    SolrDocumentList docs = rsp.getResults();
    
    •    想要以javabean的方式获取结果,那么这个javabean必须像之前的例子一样有java注释。
      Java代码 复制代码
      1. List<Item> beans = rsp.getBeans(Item.class);  
       List<Item> beans = rsp.getBeans(Item.class);
      
       

        高级用法

           solrJ 提供了一组API,来帮助我们创建查询,下面是一个faceted query的例子。

    Java代码 复制代码
    1. SolrServer server = getSolrServer();   
    2.  SolrQuery solrQuery = new  SolrQuery().   
    3.                setQuery("ipod").   
    4.                setFacet(true).   
    5.                setFacetMinCount(1).   
    6.                setFacetLimit(8).   
    7.                addFacetField("category").   
    8.                addFacetField("inStock");     
    9.  QueryResponse rsp = server.query(solrQuery);  
     

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

  • 相关阅读:
    Android SDK Manager和AVD Manager使用
    Android Studio 学习之 Android SDK快速更新
    Windows10远程报错:由于CredSSP加密Oracle修正
    电商促销优惠规则业务分析建模
    关于分库分表最全的一篇文章
    根据自增ID生成不重复序列号
    【转】 Pro Android学习笔记(五八):Preferences(2):CheckBoxPreference
    【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference
    【转】 Pro Android学习笔记(五六):配置变化
    【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
  • 原文地址:https://www.cnblogs.com/cy163/p/1570049.html
Copyright © 2011-2022 走看看