Solr客户端自定义开发

Java代码 复制代码  收藏代码
  1. @Service  
  2. @Qualifier("searchService")  
  3. public class SearchService {  
  4.     @Value("${solr.url}")  
  5.     private String searchurl;  
  6.     @Value("${solr.q.fields}")  
  7.     private String qfields;  
  8.     @Value("${solr.s.fields}")  
  9.     private String sfields;  
  10.     @Value("${solr.h.fields}")  
  11.     private String hfields;  
  12.     /** 
  13.      * 分页查询Position 
  14.      * @param key 关键字 
  15.      * @param page 分页 
  16.      * @param pagesize 分页大小 
  17.      * @return 分页信息 
  18.      */  
  19.     public PageInfo<Position> query(String key, int page, int pagesize) {  
  20.         PageInfo<Position> ps = new PageInfo<Position>(page, pagesize);  
  21.         SolrServer server = new HttpSolrServer(searchurl);  
  22.         SolrQuery params = new SolrQuery();  
  23.         params.setQuery(setQueryFields(key, qfields));  
  24.         params.setStart(ps.getStart());  
  25.         params.setRows(ps.getPagesize());  
  26.         boolean ish = setHighlight(params,hfields);  
  27.         setSortFields(params, sfields);  
  28.         SolrDocumentList list = null;  
  29.         //第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名  
  30.         Map<String,Map<String,List<String>>> high= null;  
  31.         try {  
  32.             QueryResponse response = server.query(params);  
  33.             list = response.getResults();  
  34.             if(ish){  
  35.                 high = response.getHighlighting();  
  36.             }  
  37.         } catch (Exception e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.         if(ish){  
  41.               
  42.         }  
  43.         ps.setItems(mappingVo(list,high,ish));  
  44.         ps.setTotal((int) list.getNumFound());  
  45.         return ps;  
  46.     }  
  47.     /** 
  48.      * 设置高亮字段 
  49.      * @param params SolrQuery对象 
  50.      * @param hfields2 高亮字段,以逗号分隔 
  51.      * @return 是否需要高亮 
  52.      */  
  53.     private boolean setHighlight(SolrQuery params, String hfields2) {         
  54.         if(StringUtils.hasText(hfields2)){  
  55.             String[] arr = hfields2.split(",");  
  56.             for (String s : arr) {  
  57.                 params.addHighlightField(s);  
  58.             }  
  59.             params.setHighlight(true);  
  60.             params.setHighlightSimplePre("<font color='red'><em>");  
  61.             params.setHighlightSimplePost("</em></font>");  
  62.             return true;  
  63.         }  
  64.         return false;  
  65.     }  
  66.     /** 
  67.      * 将查询结果返回映射为Position对象列表 
  68.      * @param list 返回的document列表 
  69.      * @param high 高亮信息 
  70.      * @param ish 是否需要高亮 
  71.      * @return Position对象列表 
  72.      */  
  73.     private List<Position> mappingVo(SolrDocumentList list,Map<String,Map<String,List<String>>> high,boolean ish) {  
  74.         List<Position> poses = new ArrayList<Position>();  
  75.         for (SolrDocument doc : list) {  
  76.             Position p = new Position();  
  77.             p.setPid(doc.getFieldValue("CP_ID").toString());  
  78.             if(ish && high.get(p.getPid()).containsKey("COMPANY_NAME")){  
  79.                 p.setCompany(high.get(p.getPid()).get(("COMPANY_NAME")).toString());  
  80.             }else{  
  81.                 p.setCompany(doc.getFieldValue("COMPANY_NAME").toString());  
  82.             }     
  83.             p.setStamp((Date)doc.getFieldValue("ADD_AT"));  
  84.             poses.add(p);  
  85.         }  
  86.         return poses;  
  87.     }  
  88.     /** 
  89.      * 设置排序字段 
  90.      * @param params SolrQuery对象 
  91.      * @param sfields2 排序字段,都是按降序排 
  92.      */  
  93.     private void setSortFields(SolrQuery params, String sfields2) {  
  94.         String[] arr = sfields2.split(",");  
  95.         for (String s : arr) {  
  96.             params.addSortField(s, ORDER.desc);  
  97.         }  
  98.   
  99.     }  
  100.     /** 
  101.      * 定义查询字段 
  102.      * @param key 关键字 
  103.      * @param qfields2 以,分隔的字段列表,以或条件 
  104.      * @return 
  105.      */  
  106.     private String setQueryFields(String key, String qfields2) {  
  107.         StringBuilder sb = new StringBuilder();  
  108.         String[] arr = qfields2.split(",");  
  109.         for (String s : arr) {  
  110.             sb.append(s).append(":").append(key).append(" OR ");  
  111.         }  
  112.         String q = sb.toString();  
  113.         return q.substring(0, q.length() - 4);  
  114.     }  
  115. }  

猜你喜欢

转载自xiaowei2002.iteye.com/blog/2173969
今日推荐