利用SolrJ操作solr API

来源:互联网 发布:杭州博远软件 编辑:程序博客网 时间:2024/06/07 15:07

使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ通过封装httpClient方法,来操作solr的API的。即SolrJ底层还是通过使用httpClient中的方法来完成Solr的操作

添加jar包:首先,你需要在你的web项目中添加SolrJ需要的jar包,这些jar包在你所下载的Solr包中都可以找到(我下载的是solr-4.10.0.zip),包括:

  • apache-solr-solrj-4.10.0.jar   : solr-4.10.0\dist文件夹下
  • apache-solr-solrj-4.10.0.jar所依赖的其他jar包    : solr-4.10.0\dist\solrj-lib文件夹下
  • solr-core-4.10.0.jar
  • commons-logging-1.0.4.jar 日志相关jar

Junit测试

[java] view plain copy
  1. package com.april.lucene.solr;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.MalformedURLException;  
  5. import java.util.List;  
  6. import org.apache.solr.client.solrj.SolrQuery;  
  7. import org.apache.solr.client.solrj.SolrQuery.ORDER;  
  8. import org.apache.solr.client.solrj.SolrServerException;  
  9. import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  10. import org.apache.solr.client.solrj.response.QueryResponse;  
  11. import org.apache.solr.client.solrj.response.UpdateResponse;  
  12. import org.apache.solr.common.SolrDocument;  
  13. import org.apache.solr.common.SolrDocumentList;  
  14. import org.apache.solr.common.SolrInputDocument;  
  15. import org.junit.After;  
  16. import org.junit.Before;  
  17. import org.junit.Test;  
  18. import com.april.lucene.model.JavaBean;  
  19. /** 
  20.  * @Author: April 
  21.  * @version Solr 4.10.0 
  22.  * @Date: 2014年10月14日 
  23.  * @参考:http://blog.csdn.net/liuweitoo/article/details/8137023 
  24.  */  
  25. public class ServerTest {  
  26.     private HttpSolrServer server = null;  
  27.     /** 
  28.     * 注:URL这里 ! 
  29.     * 这是错误的:URL = "http://localhost:8080/solr/home/april"; 
  30.     * 在安装solr配置solr.home环境变量整合tomcat时,已经配置了solr/home 
  31.     * 所以URL直接到/solr/code~ 就可以了,当时被个问题纠结了半天 
  32.     */  
  33.    private static final String URL = "http://localhost:8080/solr/april"; //april索引库URL  
  34.     @Before  
  35.     public void init() {  
  36.         server = new HttpSolrServer(URL);  
  37.     }  
  38.     /** 
  39.      *@Function: 添加索引 Document文档 
  40.      */  
  41.     @Test  
  42.     public void addDoc() {  
  43.         //创建doc文档  
  44.         SolrInputDocument doc = new SolrInputDocument();  
  45.         doc.addField("id"1);  
  46.         doc.addField("name""Add Solr Index");//schema.xml中首先应该配置了名称为name的field  
  47.         doc.addField("manu""Solr test file");  
  48.         try {  
  49.             UpdateResponse response = server.add(doc);//可以添加一个doc文档  
  50.             //server.add(Collection<SolrInputDocument> docs);//也可以直接添加一个文档集合  
  51.             server.commit();//commit后才保存到索引库  
  52.             System.out.println(response);  
  53.             System.out.println("query time:" + response.getQTime());  
  54.             System.out.println("Elapsed Time:" + response.getElapsedTime());  
  55.             System.out.println("status:" + response.getStatus());  
  56.         } catch (SolrServerException e) {  
  57.             e.printStackTrace();  
  58.         } catch (IOException e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.     }  
  62.     /** 
  63.      *@Function: 直接添加JavaBean 
  64.      */  
  65.     @Test  
  66.     public void addBean() throws IOException, SolrServerException {  
  67.         //Bean需要添加Annotation注解,以便告诉solr哪些属性参与到index中  
  68.         JavaBean bean = new JavaBean();  
  69.         bean.setId("2");  
  70.         bean.setName("Add bean index");  
  71.         bean.setMenu("index bean menu");  
  72.         server.addBean(bean);//添加Bean到索引库  
  73.         //server.addBeans(Collection<?> beans);//同样有addBeans方法  
  74.         server.commit();  
  75.     }  
  76.     /** 
  77.      * @Function: 删除索引 
  78.      */  
  79.     @Test  
  80.     public void remove() throws SolrServerException, IOException {  
  81.         server.deleteById("1");//删除id为1的索引  
  82.         server.commit();  
  83.         //server.deleteById(List<String> ids);//删除id集合  
  84.         server.commit(truetrue);  
  85.         //删除查询到的索引信息  
  86.         server.deleteByQuery("id:4 id:6");  
  87.         server.commit(truetrue);  
  88.     }  
  89.     /** 
  90.      *@Function: 查询索引 
  91.      *@Date: 2014年10月28日 
  92.      */  
  93.     @Test  
  94.     public void search() throws SolrServerException {  
  95.         SolrQuery query = new SolrQuery();  
  96.         query.set("name""Solr");  //  
  97.         query.setStart(0);          //分页: 从零开始    
  98.         query.setRows(10);          //分页:返回10条记录,第二页start:10开始  
  99.         query.setSort("name", ORDER.desc);//排序:名称倒序  
  100.         //查询  
  101.         QueryResponse resp = server.query(query);  
  102.         SolrDocumentList sdl = resp.getResults();   //查询结果  
  103.         System.out.println("总数:"+sdl.getNumFound());        //查询总数  
  104.         for(SolrDocument sd:sdl) {  
  105.             System.out.println(sd.getFieldValue("id"));               
  106.             System.out.println(sd.getFieldValue("name"));  
  107.             System.out.println(sd.getFieldValue("manu"));  
  108.         }  
  109.     }  
  110.     /** 
  111.      * @Function: 直接使用bean查询 
  112.      */  
  113.     @Test    
  114.     public void search2() throws MalformedURLException, SolrServerException{    
  115.         SolrQuery query = new SolrQuery();    
  116.         query.set("name""Solr");  
  117.         query.setStart(0).setRows(10).setSort("name", ORDER.desc);  
  118.         QueryResponse res = server.query(query);    
  119.         //可以直接查询相应的bean对象,但是不是很常用 .且这种方式无法获取总数量    
  120.         List<JavaBean> list = res.getBeans(JavaBean.class);    
  121.         System.out.println("当前总数:"+list.size());    
  122.         for(JavaBean bean : list){    
  123.             System.out.println(bean.toString());  
  124.         }    
  125.     }  
  126.     /** 
  127.      * @Function: 高亮  
  128.      */  
  129.     @Test    
  130.     public void test6() throws SolrServerException, MalformedURLException{    
  131.         SolrQuery query = new SolrQuery("*");  //*:*代表所有属性、所有值  
  132.         query.setHighlight(true).setHighlightSimplePre("<span class='red'>").setHighlightSimplePost("</span>").setStart(0).setRows(10);    
  133.         //hl.fl表示高亮的field,也就是高亮的区域    
  134.         query.setParam("hl.fl""name,menu");    
  135.         QueryResponse res = server.query(query);    
  136.   
  137.         SolrDocumentList sdl = res.getResults();    
  138.         for(SolrDocument sd : sdl){    
  139.             System.out.println(sd.get("id")+"#"+sd.get("quesRemark")+"#"+sd.get("createEmpName"));    
  140.             String id = (String) sd.get("id");    
  141.             //在solr这里对需要加高亮的字段必须要在索引中store=true  
  142.             System.out.println(id+"#"+res.getHighlighting().get(id).get("quesRemark"));;    
  143.   
  144.         }    
  145.     }    
  146.     /**  
  147.      * gc在大部分状况下会将没有任何指向的引用的内存释放掉,除非在特殊情况下,最好不要干涉gc!  
  148.      * runFinalization()方法在调用时它会尽量去调用这个对象的finalize方法!  
  149.      * 都是强制gc去回收内存,其它大部分相似  
  150.      */  
  151.     @After  
  152.     public void destory() {  
  153.         server = null;  
  154.         System.runFinalization();  
  155.         System.gc();  
  156.     }  
  157. }  

Solr 索引分片(Sharding Index)

[javascript] view plain copy
  1. /** 
  2.  * @Author: April 
  3.  * @version Solr 4.10.0 
  4.  * @Date: 2014年11月7日 
  5.  */  
  6. public class ServerTest2 {  
  7.     private HttpSolrServer server = new HttpSolrServer(URL);  
  8.     private static final String URL = "http://localhost:8080/solr/core0";  
  9.     @Before  
  10.     public void init() {  
  11.         server = new HttpSolrServer(URL);  
  12.     }  
  13.     /** 
  14.      * @Function: Solr多核索引分片(Sharding index)查询(代码基于实际项目,这里未做测试) 
  15.      *  参数“shards”能够使请求被分发到shards所指定的小索引上。  
  16.      *  shards 的格式  :host:port/base_url[,host:port/base_url]*  
  17.      *  @description:   多核(例如core1、core2..)中添加索引field :coreFlag 
  18.      *                  用于标识shards指定的小索引 
  19.      */  
  20.     @Test  
  21.     public void search3 () throws SolrServerException{  
  22.         String SHARDS_URL = "http://localhost:8080/solr/core0,http://localhost:8080/solr/core2";  
  23.         String queryValue = "((coreFlag:0 AND ..core1上的其他条件) OR (coreFlag:1 AND  ..core2 上的条件)) AND 其他条件 ";  
  24.         SolrQuery query = new SolrQuery(queryValue);  
  25.         query.setStart(0).setRows(10).setSort("name", ORDER.desc);  
  26.         if(StringUtils.isNotBlank(SHARDS_URL)){  
  27.             query.set("shards",SHARDS_URL);  
  28.         }  
  29.         QueryResponse resp = server.query(query);  
  30.         SolrDocumentList sdList = resp.getResults();  
  31.         List<JavaBean> searchList = server.getBinder().getBeans(JavaBean.class,sdList);   
  32.         Long totalRecord = new Long(sdList.getNumFound());  
  33.     }  
  34. }