• solr1.3新特性,solrj的使用


    转载:http://mxsfengg.iteye.com/blog/315330

    CommonsHttpSolrServer

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

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

     

       CommonsHttpSolrServer 是线程安全的,建议重复使用CommonsHttpSolrServer 实例。

      Setting XMLResponseParser

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

       

    Java代码  收藏代码
    1. 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.  

     

    EmbeddedSolrServer

          EmbeddedSorrServer提供和CommonsHttpSorlrServer相同的接口,它不需要http连接。

         

    Java代码  收藏代码
    1. //注意,下面的属性也是可以在jvm参数里面设置的  
    2.   System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr");  
    3.   CoreContainer.Initializer initializer = new CoreContainer.Initializer();  
    4.   CoreContainer coreContainer = initializer.initialize();  
    5.   EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");    

      

       如果你想要使用 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" );  

     

        如果你在你的项目中内嵌solr服务,这将是一个不错的选择。无论你能否使用http,它都提供相同的接口。

      用法

        solrj 被设计成一个可扩展的框架,用以向solr服务器提交请求,并接收回应。

        我们已经将最通用的一些命令封装在了solrServer类中了。

     

       Adding Data to Solr

    •     首先需要获得一个server的实例, 
    Java代码  收藏代码
    1. SolrServer server = getSolrServer();  
    • 如果,你使用的是一个远程的solrServer的话呢,你或许会这样来实现getSolrServer()这个方法:      
    Java代码  收藏代码
    1. public SolrServer getSolrServer(){  
    2.     //the instance can be reused  
    3.     return new CommonsHttpSolrServer();  
    4. }  

     

    • 如果,你使用的是一个本地的solrServer的话,你或许会这样来实现getSolrServer()方法:      
    Java代码  收藏代码
    1. public SolrServer getSolrServer(){  
    2.     //the instance can be reused  
    3.     return new EmbeddedSolrServer();  
    4. }  

     

    • 如果,你在添加数据之前,想清空现有的索引,那么你可以这么做:

            

    Java代码  收藏代码
    1. 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 );  

     

    • 构造另外一个文档,每个文档都能够被独自地提交给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 );  

     

    • 构造一个文档的集合

            

    Java代码  收藏代码
    1. Collection<SolrInputDocument> docs = new  ArrayList<SolrInputDocument>();  
    2.  docs.add( doc1 );  
    3.  docs.add( doc2 );  

     

    • 将documents提交给solr
    Java代码  收藏代码
    1. server.add( docs );  

     

    • 提交一个commit
    Java代码  收藏代码
    1. 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 );    

     

     

    Streaming documents for an update

     

    在很多的情况下,StreamingUpdateSolrServer也挺有用的。如果你使用的是solr1.4以上的版本的话,下面的代码,或许会用得着。下面的这种方法挺好用的,尤其是当你向服务器提交数据的时候。

    .

     

    CommonsHttpSolrServer server = new CommonsHttpSolrServer(); Iterator<SolrInputDocument> iter = new Iterator<SolrInputDocument>(){ public boolean hasNext() { boolean result ; // set the result to true false to say if you have more documensts return result; } public SolrInputDocument next() { SolrInputDocument result = null; // construct a new document here and set it to result return result; } }; server.add(iter);

     

    you may also use the addBeans(Iterator<?> beansIter) method to write pojos 

    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.   }  

     

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

            

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

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

    • Get an instance of server
    Java代码  收藏代码
    1. SolrServer server = getSolrServer();  

     

    • 创建bean实例

            

    Java代码  收藏代码
    1. Item item = new Item();  
    2.  item.id = "one";  
    3.  item.categories =  new String[] { "aaa", "bbb", "ccc" };  

     

    • 添加给solr          
    Java代码  收藏代码
    1. server.addBean(item);  

     

    • 将多个bean提交给solr

         

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

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

      Reading Data from Solr

    •    获取solrserver的实例

                

    Java代码  收藏代码
    1. SolrServer server = getSolrServer();  

     

    •    构造 SolrQuery

         

    Java代码  收藏代码
    1. SolrQuery query = new SolrQuery();  
    2. query.setQuery( "*:*" );  
    3. query.addSortField( "price", SolrQuery.ORDER.asc );  

     

    •    向服务器发出查询请求

        

    Java代码  收藏代码
    1. QueryResponse rsp = server.query( query );     

     

    •    获取结果。

        

    Java代码  收藏代码
    1. SolrDocumentList docs = rsp.getResults();  

     

    •    想要以javabean的方式获取结果,那么这个javabean必须像之前的例子一样有java注释。
      Java代码  收藏代码
      1. 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 方法都是返回它自己本身的实例,所以就像你所看到的一样,上面的用法是链式的。

  • 相关阅读:
    WEB上传大文件解决方案
    上传大文件的解决方案
    网页文件断点上传
    超大文件上传方案(B/S)
    asp.net选择文件夹上传
    java文件断点上传
    超大文件上传方案(网页)
    web选择文件夹上传
    jsp选择文件夹上传
    jsp文件断点上传
  • 原文地址:https://www.cnblogs.com/chenying99/p/2676180.html
Copyright © 2020-2023  润新知