【Lucene3.6.2入门系列】第15节_SolrJ高亮

来源:互联网 发布:西部数码域名转移管理 编辑:程序博客网 时间:2024/05/01 23:09
[java] view plaincopyprint?
  1. package com.jadyer.solrj;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import org.apache.solr.client.solrj.SolrQuery;  
  8. import org.apache.solr.client.solrj.SolrServer;  
  9. import org.apache.solr.client.solrj.SolrServerException;  
  10. import org.apache.solr.client.solrj.impl.HttpSolrServer;  
  11. import org.apache.solr.client.solrj.response.QueryResponse;  
  12. import org.apache.solr.common.SolrDocument;  
  13. import org.apache.solr.common.SolrInputDocument;  
  14.   
  15. /** 
  16.  * 【Lucene3.6.2入门系列】第15节_SolrJ高亮 
  17.  * @create Aug 20, 2013 1:50:38 PM 
  18.  * @author 玄玉<http://blog.csdn.net/jadyer> 
  19.  */  
  20. public enum HelloSolrJHighLighter {  
  21.     INSTANCE;  
  22.       
  23.     private SolrServer server;  
  24.       
  25.     private HelloSolrJHighLighter(){  
  26.         //创建SolrServer对象,它有两个线程安全的子类EmbeddedSolrServer和CommonsHttpSolrServer  
  27.         //EmbeddedSolrServer-----内嵌式的,不需要启动Web服务器  
  28.         //CommonsHttpSolrServer--需要启动Web服务器,它是通过HTTP请求来获取数据的  
  29.         //CommonsHttpSolrServer已不推荐直接使用了,而是推荐使用HttpSolrServer类  
  30.         //同样的StreamingUpdateSolrServer也不推荐使用了,推荐使用ConcurrentUpdateSolrServer  
  31.         server = new HttpSolrServer("http://127.0.0.1:8088/solr");  
  32.         //添加索引  
  33.         this.addIndex();  
  34.     }  
  35.       
  36.   
  37.     /** 
  38.      * 添加索引 
  39.      * @see 这里之所以没有硬编码指定my_title和my_content的中文分词器 
  40.      * @see 是由于schema.xml中在定义这俩<field>时已通过type属性指定了中文分词器 
  41.      * @see 关于指定中文分词器的具体方法,详见http://blog.csdn.net/jadyer/article/details/10106011 
  42.      */  
  43.     private void addIndex(){  
  44.         try {  
  45.             //添加之前先删除全部索引,删除完记得commit才能生效  
  46.             server.deleteByQuery("*:*");  
  47.             server.commit();  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.         List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();  
  52.         for(int i=1; i<4; i++){  
  53.             SolrInputDocument doc = new SolrInputDocument();  
  54.             //对于Solr而言,默认的id是唯一的主键(如果我们没有自定义主键的话),当多次添加的时候,最后添加的相同id的域会覆盖已有的  
  55.             doc.addField("id", Integer.toString(i));  
  56.             //这里使用的是自定义的Field,所以就需要在schema.xml中为其添加<field>描述,并通过type属性指定其使用的分词器  
  57.             doc.addField("my_title""这是我的第" + i + "个SolrJ程序");  
  58.             doc.addField("my_content""my第" + i + "个SolrJ程序的运行情况");  
  59.             docs.add(doc);  
  60.         }  
  61.         try {  
  62.             //可以只添加一个Document,也可以一次添加多个Document,这里添加多个  
  63.             server.add(docs);  
  64.             //commit后方能生效,否则搜索到的还是add前的索引信息  
  65.             server.commit();  
  66.         } catch (Exception e) {  
  67.             e.printStackTrace();  
  68.         }  
  69.     }  
  70.       
  71.       
  72.     /** 
  73.      * 搜索高亮 
  74.      */  
  75.     public void testHighLighter(){  
  76.         SolrQuery query = new SolrQuery("my_title:SolrJ");  
  77.         query.setHighlight(true).setHighlightSimplePre("<span style='color:red'>").setHighlightSimplePost("</span>");  
  78.         //设置高亮的区域,可设置多个区域(但有个前提-->待高亮的信息必须是被存储的,即schema.xml中配置<field store="true">)  
  79.         query.setParam("hl.fl""my_title, my_content");  
  80.         QueryResponse resp = null;  
  81.         try {  
  82.             resp = server.query(query);  
  83.         } catch (SolrServerException e) {  
  84.             e.printStackTrace();  
  85.         }  
  86.         for(SolrDocument sd : resp.getResults()){  
  87.             Map<String, List<String>> snippetMap = resp.getHighlighting().get(sd.getFieldValue("id"));  
  88.             if(snippetMap!=null && !snippetMap.isEmpty()){  
  89.                 List<String> snippetList = snippetMap.get("my_title");  
  90.                 for(String snippet : snippetList){  
  91.                     System.out.print(snippet);  
  92.                 }  
  93.                 System.out.print("        ");  
  94.                 //注意,如果在配置<field my_content multiValued="true"/>时指定其支持多值域  
  95.                 //那么,此处获取到的就会是第一个值域的值  
  96.                 snippetList = snippetMap.get("my_content");  
  97.                 for(String snippet : snippetList){  
  98.                     System.out.println(snippet);  
  99.                 }  
  100.             }  
  101.         }  
  102.     }  
  103.       
  104.       
  105.     /** 
  106.      * 测试一下SolrJ的高亮效果 
  107.      * @see 测试前记得启动Web服务器 
  108.      * @see 关于Solr与Tomcat的整合,详见http://blog.csdn.net/jadyer/article/details/10104077 
  109.      */  
  110.     public static void main(String[] args) {  
  111.         HelloSolrJHighLighter.INSTANCE.testHighLighter();  
  112.     }  
  113. }  
0 0
原创粉丝点击