zoukankan      html  css  js  c++  java
  • 利用SOLR搭建企业搜索平台 之五(solrj)

    相信很多人,在准备提交数据让solr建立索引的那刻,很纳闷,尽管看了不少网上的一些文章,但是我想依然还是有不少不理解的地方。
    比如提交一个xml,采用post方式,尽管有些文章说了可以采用httpclient。但是我那个时候,还不是很理解,当然现在看来其实也没有 什么了。但是对于一个刚入门solr的初学者,我想讲讲关于solr1.3的 solrj( sorlr J 目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。)!
    先上一个例子:
    Java代码
    1. public static final String SOLR_URL = "http://localhost/solr/core0";  
    2. public static void commit() {  
    3.     Date date = new Date();  
    4.     SolrServer solr = null;  
    5.     try {  
    6.         solr = new CommonsHttpSolrServer(SOLR_URL);  
    7.     } catch (MalformedURLException e1) {  
    8.         e1.printStackTrace();  
    9.     }  
    10. for (int i = 0; i < 10000; i++) {  
    11.             SolrInputDocument sid = new SolrInputDocument();  
    12.             sid.addField("id", i);  
    13.             sid.addField("name""struts+hibernate+spring 开发大全" + i);  
    14.             sid.addField("summary""三种框架的综合应用" + i);  
    15.             sid.addField("author""李良杰" + i);  
    16.             sid.addField("date"new Date());  
    17.             sid.addField("content""高级应用类书籍" + i);  
    18.             sid.addField("keywords""SSH" + i);  
    19.             try {  
    20.                 solr.add(sid);  
    21.             } catch (MalformedURLException e) {  
    22.                 e.printStackTrace();  
    23.             } catch (SolrServerException e) {  
    24.                 e.printStackTrace();  
    25.             } catch (IOException e) {  
    26.                 e.printStackTrace();  
    27.             }  
    28.             System.out.println(i);  
    29.             if (i == 999)   
    30.                 System.out.println((new Date().getTime() - date.getTime()) / 60000 + "分钟");  
    31.         }  
    32.         try {  
    33.             solr.commit();  
    34.         } catch (SolrServerException e) {  
    35.             e.printStackTrace();  
    36.         } catch (IOException e) {  
    37.             e.printStackTrace();  
    38.         }  

    上面这段代码的意思是:利用for提交10000个document,并打印提交10000所需的时间。
    1》CommonsHttpSolrServer 使用HTTPClient 和solr服务器进行通信。

    2》CommonsHttpSorlrServer 允许设置链接属性。
    Java代码
    1. server.setSoTimeout(1000);  // socket read timeout    
    2.   server.setConnectionTimeout(100);    
    3.   server.setDefaultMaxConnectionsPerHost(100);    
    4.   server.setMaxTotalConnections(100);    
    5.   server.setFollowRedirects(false);  // defaults to false    
    6.   // allowCompression defaults to false.    
    7.   // Server side must support gzip or deflate for this to have any effect.    
    8.   server.setAllowCompression(true);    
    9.   server.setMaxRetries(1); // defaults to 0.  > 1 not recommended. 

    3》实现SolrServer接口的另一个类:EmbeddedSorrServer,它不需要http连接。

    4》在构造document的时候,可以一个一个添加到solrServer,也可以构建一个包含document的Collection,将Collection添加到solrServer,然后commit。

    5》也可以构造一个跟document匹配的JavaBean进行提交
          使用 java 注释创建java bean。@Field ,可以被用在域上,或者是setter方法上。如果一个域的名称跟bean的名称是不一样的,那么在java注释中填写别名,具体的,可以参照下面的域categories      
    Java代码
    1. import org.apache.solr.client.solrj.beans.Field;    
    2.  public class Item {    
    3.     @Field    
    4.     String id;    
    5.     @Field("cat")    
    6.     String[] categories;     
    7.     @Field    
    8.     List<String> features;     
    9.   }    

    java注释也可以使用在setter方法上,如下面的例子:
    Java代码
    1. @Field("cat")    
    2.  public void setCategory(String[] c){    
    3.      this.categories = c;    
    4.  }  
     
    这里应该要有一个相对的,get方法(没有加java注释的)来读取属性
    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,这样可以提高性能。

    6》
    Java代码
    1. public static void update() {  
    2.     SolrServer solrServer = null;  
    3.     try {  
    4.         solrServer = new CommonsHttpSolrServer(SOLR_URL);  
    5.     } catch (MalformedURLException e) {  
    6.         e.printStackTrace();  
    7.     }  
    8.     UpdateRequest updateRequest = new UpdateRequest();  
    9.     SolrInputDocument sid = new SolrInputDocument();  
    10.     sid.addField("id"100000);  
    11.     sid.addField("name""struts+hibernate+spring 开发大全");  
    12.     sid.addField("summary""三种框架的综合应用");  
    13.     sid.addField("author""李良杰");  
    14.     sid.addField("date"new Date());  
    15.     sid.addField("content""高级应用类书籍");  
    16.     sid.addField("keywords""SSH");  
    17.     updateRequest.setAction(UpdateRequest.ACTION.COMMIT, falsefalse);    
    18.     updateRequest.add(sid);    
    19.     try {  
    20.         UpdateResponse updateResponse = updateRequest.process(solrServer);  
    21.         System.out.println(updateResponse.getStatus());  
    22.     } catch (SolrServerException e) {  
    23.         e.printStackTrace();  
    24.     } catch (IOException e) {  
    25.         e.printStackTrace();  
    26.     }  
    27. }  

    提交一个document,采用更新方式,注意:
    Java代码
    1. updateRequest.setAction(UpdateRequest.ACTION.COMMIT, falsefalse); 
    7》
    Java代码
    1. public static void query() {  
    2.     SolrServer solr = null;  
    3.     try {  
    4.         solr = new CommonsHttpSolrServer(SOLR_URL);  
    5.     } catch (MalformedURLException e) {  
    6.         e.printStackTrace();  
    7.         return;  
    8.     }  
    9.     // http://localhost:8983/solr/spellCheckCompRH?q=epod&spellcheck=on&spellcheck.build=true  
    10.     ModifiableSolrParams params = new ModifiableSolrParams();  
    11.     params.set("qt""/spellCheckCompRH");  
    12.     params.set("q""编程");  
    13.     params.set("spellcheck""on");  
    14.     params.set("spellcheck.build""true");  
    15.     QueryResponse response = null;  
    16.     try {  
    17.         response = solr.query(params);  
    18.     } catch (SolrServerException e) {  
    19.         e.printStackTrace();  
    20.         return;  
    21.     }  
    22.     System.out.println("response = " + response);  
    23. }  

    这是一个查询方法。关键字:“编程”。关于查询的关键字,请参见slor wiki http://wiki.apache.org/solr/QueryParametersIndex或等待我的博客更新,在后面会有篇文章详细讲这个问题!
    8》给solr的索引文件手动进行优化,
    Java代码
    1. solr.optimize();  


    9》solrJ 提供了一组API,来帮助我们创建查询,下面是一个faceted query的例子。
    Java代码
    Java代码
    1. SolrServer server = getSolrServer();    
    2. SolrQuery solrQuery = new  SolrQuery().setQuery("ipod").setFacet(true).setFacetMinCount(1).setFacetLimit(8).      addFacetField("category").addFacetField("inStock");      
    3. QueryResponse rsp = server.query(solrQuery);  
     
    所有的 setter/add 方法都是返回它自己本身的实例,所以就像你所看到的一样,上面的用法是链式的。
  • 相关阅读:
    获取class
    domReady
    JS原型
    JavaScript继承
    LeetCode 46. Permutations
    LinkCode 第k个排列
    接口测试基础——第5篇xlrd模块
    接口测试基础——第4篇logging模块
    接口测试基础——第3篇smtplib发送带图片的邮件
    接口测试基础——第2篇smtplib发送带附件的邮件
  • 原文地址:https://www.cnblogs.com/wycg1984/p/1567599.html
Copyright © 2011-2022 走看看