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 方法都是返回它自己本身的实例,所以就像你所看到的一样,上面的用法是链式的。

  • 相关阅读:
    mysql索引
    springboot mybatis 后台框架平台 shiro 权限 集成代码生成器
    java 企业网站源码模版 有前后台 springmvc SSM 生成静态化
    java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
    activiti工作流的web流程设计器整合视频教程 SSM和独立部署
    .Net Core中的ObjectPool
    文件操作、流相关类梳理
    .Net Core中的配置文件源码解析
    .Net Core中依赖注入服务使用总结
    消息中间件RabbitMQ(一)
  • 原文地址:https://www.cnblogs.com/cy163/p/1570049.html
Copyright © 2011-2022 走看看