spring 操作elasticsearch

[html]  view plain  copy
  1. package com.gooddeep.dev.elasticsearch.commons.dao;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import org.elasticsearch.action.ActionFuture;  
  8. import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;  
  9. import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;  
  10. import org.elasticsearch.action.search.SearchResponse;  
  11. import org.elasticsearch.client.Client;  
  12. import org.elasticsearch.cluster.health.ClusterHealthStatus;  
  13. import org.elasticsearch.common.text.Text;  
  14. import org.elasticsearch.index.query.BoolQueryBuilder;  
  15. import org.elasticsearch.index.query.QueryBuilders;  
  16. import org.elasticsearch.search.SearchHit;  
  17. import org.elasticsearch.search.highlight.HighlightBuilder;  
  18. import org.elasticsearch.search.highlight.HighlightBuilder.Field;  
  19. import org.elasticsearch.search.sort.FieldSortBuilder;  
  20. import org.elasticsearch.search.sort.SortOrder;  
  21. import org.slf4j.Logger;  
  22. import org.slf4j.LoggerFactory;  
  23. import org.springframework.beans.factory.annotation.Autowired;  
  24. import org.springframework.data.domain.Page;  
  25. import org.springframework.data.domain.PageImpl;  
  26. import org.springframework.data.domain.PageRequest;  
  27. import org.springframework.data.domain.Pageable;  
  28. import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;  
  29. import org.springframework.data.elasticsearch.core.SearchResultMapper;  
  30. import org.springframework.data.elasticsearch.core.query.Criteria;  
  31. import org.springframework.data.elasticsearch.core.query.CriteriaQuery;  
  32. import org.springframework.data.elasticsearch.core.query.DeleteQuery;  
  33. import org.springframework.data.elasticsearch.core.query.IndexQuery;  
  34. import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;  
  35. import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;  
  36. import org.springframework.data.elasticsearch.core.query.SearchQuery;  
  37. import org.springframework.data.elasticsearch.core.query.StringQuery;  
  38. import org.springframework.stereotype.Component;  
  39.   
  40. import com.gooddeep.dev.core.helper.PropertyHelper;  
  41. import com.gooddeep.dev.core.helper.UuidHelper;  
  42. import com.gooddeep.dev.core.model.BasePage;  
  43. import com.gooddeep.dev.elasticsearch.commons.model.EsBaseBean;  
  44. import com.gooddeep.dev.elasticsearch.commons.service.EsBaseService;  
  45.   
  46. @Component("esBaseDao")  
  47. public abstract class EsBaseDaoImpl<T> implements EsBaseDao<T> {  
  48.   
  49.     private Logger logger = LoggerFactory.getLogger(EsBaseService.class);  
  50.   
  51.     @Autowired  
  52.     private ElasticsearchTemplate elasticsearchTemplate;  
  53.   
  54.     @Autowired  
  55.     private Client esClient;  
  56.   
  57.       
  58.     /**  
  59.      * 插入或等新,需要有id,id需要自己生成  
  60.      *   
  61.      * @param tList  
  62.      * @return  
  63.      */  
  64.     public boolean insertOrUpdate(List<T> tList) {  
  65.         List<IndexQuery> queries = new ArrayList<IndexQuery>();  
  66.         for (T t : tList) {  
  67.             String id = ((EsBaseBean) t).getId();  
  68.             if (id == null) {  
  69.                 id = UuidHelper.getRandomUUID();  
  70.                 ((EsBaseBean) t).setId(id);  
  71.             }  
  72.             IndexQuery indexQuery = new IndexQueryBuilder().withId(id).withObject(t).build();  
  73.             queries.add(indexQuery);  
  74.         }  
  75.         elasticsearchTemplate.bulkIndex(queries);  
  76.         return true;  
  77.     }  
  78.   
  79.     /**  
  80.      * 插入或更新  
  81.      *   
  82.      * @param t  
  83.      * @return  
  84.      */  
  85.     public boolean insertOrUpdate(T t) {  
  86.   
  87.         String id = ((EsBaseBean) t).getId();  
  88.         if (id == null) {  
  89.             id = UuidHelper.getRandomUUID();  
  90.             ((EsBaseBean) t).setId(id);  
  91.         }  
  92.         try {  
  93.             IndexQuery indexQuery = new IndexQueryBuilder().withId(id).withObject(t).build();  
  94.             elasticsearchTemplate.index(indexQuery);  
  95.             return true;  
  96.         } catch (Exception e) {  
  97.             logger.error("insert or update user info error.", e);  
  98.             return false;  
  99.         }  
  100.     }  
  101.   
  102.     /**  
  103.      * 删除  
  104.      *   
  105.      * @param id  
  106.      * @return  
  107.      */  
  108.     public boolean deleteById(String id) {  
  109.         try {  
  110.             elasticsearchTemplate.delete(getEntityClass(), id);  
  111.             return true;  
  112.         } catch (Exception e) {  
  113.             logger.error("delete " + getEntityClass() + " by id " + id  
  114.                     + " error.", e);  
  115.             return false;  
  116.         }  
  117.     }  
  118.       
  119.     /**  
  120.      * 删除ids  
  121.      * @param idList  
  122.      * @return  
  123.      */  
  124.     @Override  
  125.     public boolean deleteByIds(List<String> idList) {  
  126.         try {  
  127.              CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria());  
  128.              criteriaQuery.setIds(idList);  
  129.              elasticsearchTemplate.delete(criteriaQuery, getEntityClass());  
  130.             return true;  
  131.         } catch (Exception e) {  
  132.             e.printStackTrace();  
  133.             return false;  
  134.         }  
  135.     }  
  136.   
  137.   
  138.     /**  
  139.      * 根据条件查询  
  140.      * @param filedContentMap 不能为null  
  141.      * @return  
  142.      */  
  143.     public boolean deleteByQuery(Map<String,Object> filedContentMap) {  
  144.         try {  
  145.             DeleteQuery dq = new DeleteQuery();  
  146.               
  147.             BoolQueryBuilder qb=QueryBuilders. boolQuery();  
  148.             if(filedContentMap!=null)  
  149.                 for (String key : filedContentMap.keySet()) {//字段查询  
  150.                     qb.must(QueryBuilders.matchQuery(key,filedContentMap.get(key)));  
  151.                 }  
  152.             dq.setQuery(qb);;  
  153.             elasticsearchTemplate.delete(dq, getEntityClass());;  
  154.             return true;  
  155.         } catch (Exception e) {  
  156.             e.printStackTrace();  
  157.             return false;  
  158.         }  
  159.     }  
  160.     /**  
  161.      * 检查健康状态  
  162.      *   
  163.      * @return  
  164.      */  
  165.     public boolean ping() {  
  166.         try {  
  167.             ActionFuture<ClusterHealthResponse> health = esClient.admin()  
  168.                     .cluster().health(new ClusterHealthRequest());  
  169.             ClusterHealthStatus status = health.actionGet().getStatus();  
  170.             if (status.value() == ClusterHealthStatus.RED.value()) {  
  171.                 throw new RuntimeException(  
  172.                         "elasticsearch cluster health status is red.");  
  173.             }  
  174.             return true;  
  175.         } catch (Exception e) {  
  176.             logger.error("ping elasticsearch error.", e);  
  177.             return false;  
  178.         }  
  179.     }  
  180.   
  181.     /**  
  182.      * 条件查询  
  183.      *   
  184.      * @param searchfields  
  185.      *            查询字段  
  186.      * @param filedContentMap  
  187.      *            字段和查询内容  
  188.      * @param sortField  
  189.      *            排序 字段  
  190.      * @param order  
  191.      *            排序  
  192.      * @param from  
  193.      * @param size  
  194.      * @return  
  195.      */  
  196.     @Override  
  197.     public BasePage<T> queryPage(Map<String,Object> filedContentMap, final List<String> heightFields, String sortField, SortOrder order, BasePage<T>basePage) {  
  198.           
  199.         Field[] hfields=new Field[0];  
  200.         if(heightFields!=null)  
  201.         {  
  202.             hfields = new Field[heightFields.size()];  
  203.             for (int i = 0; i < heightFields.size(); i++) {  
  204.                 hfields[i] = new HighlightBuilder.Field(heightFields.get(i)).preTags("<em style='color:red'>").postTags("</em>").fragmentSize(250);  
  205.             }  
  206.         }  
  207.         NativeSearchQueryBuilder nsb = new NativeSearchQueryBuilder().withHighlightFields(hfields);//高亮字段  
  208.         if (sortField != null && order != null)//排序  
  209.             nsb.withSort(new FieldSortBuilder(sortField).ignoreUnmapped(true).order(order));  
  210.         if (basePage != null)//分页  
  211.             nsb.withPageable(new PageRequest(basePage.getPageNo(), basePage.getPageSize()));  
  212.         BoolQueryBuilder qb=QueryBuilders. boolQuery();  
  213.         for (String key : filedContentMap.keySet()) {//字段查询  
  214.             qb.must(QueryBuilders.matchQuery(key,filedContentMap.get(key)));  
  215.               
  216.         }  
  217.         //userKey=78e48b85e94911e0d285f4eec990d556  
  218.         //fa6e9c5bb24a21807c59e5fd3b609e12  
  219.         nsb.withQuery(qb);  
  220.         SearchQuery searchQuery = nsb.build();//查询建立  
  221.   
  222.         Page<T> page = null;  
  223.         if (heightFields!=null&&heightFields.size() > 0) {//如果设置高亮  
  224.             page = elasticsearchTemplate.queryForPage(searchQuery,  
  225.                     getEntityClass(), new SearchResultMapper() {  
  226.                         @SuppressWarnings("unchecked")  
  227.                         @Override  
  228.                         public <T> Page<T> mapResults(SearchResponse response,Class<T> clazz, Pageable pageable) {  
  229.                             List<T> chunk = new ArrayList<T>();  
  230.                             for (SearchHit searchHit : response.getHits()) {  
  231.                                 if (response.getHits().getHits().length <= 0) {  
  232.                                     return null;  
  233.                                 }  
  234.   
  235.                                 Map<String, Object> entityMap = searchHit.getSource();  
  236.                                 for (String highName : heightFields) {  
  237.                                     Text text[]=searchHit.getHighlightFields().get(highName).fragments();  
  238.                                     if(text.length>0)  
  239.                                     {  
  240.                                         String highValue = searchHit.getHighlightFields().get(highName).fragments()[0].toString();  
  241.                                         entityMap.put(highName, highValue);  
  242.                                     }  
  243.                                 }  
  244.                                 chunk.add((T) PropertyHelper.getFansheObj(  
  245.                                         getEntityClass(), entityMap));  
  246.                             }  
  247.                             if (chunk.size() > 0) {  
  248.                                 return new PageImpl<T>((List<T>) chunk);  
  249.                             }  
  250.                             return new PageImpl<T>(new ArrayList<T>());  
  251.                         }  
  252.   
  253.                     });  
  254.         } else//如果不设置高亮  
  255.         {  
  256.             logger.info("#################"+qb.toString());  
  257.             page = elasticsearchTemplate.queryForPage(searchQuery,getEntityClass());  
  258.         }  
  259.           
  260.   
  261.     //  List<T> ts = page.getContent();  
  262.   
  263.         basePage.setTotalRecord(page.getTotalElements());  
  264.         basePage.setResults(page.getContent());  
  265.         return basePage;  
  266.     }  
  267.   
  268.       
  269.     @Override  
  270.     public List<T> queryList(Map<String, Object> filedContentMap,final List<String> heightFields, String sortField, SortOrder order) {  
  271.         Field[] hfields=new Field[0];  
  272.         if(heightFields!=null)  
  273.         {  
  274.             hfields = new Field[heightFields.size()];  
  275.             for (int i = 0; i < heightFields.size(); i++) {  
  276.                 //String o="{\"abc\" : \"[abc]\"}";  
  277.                 hfields[i] = new HighlightBuilder.Field(heightFields.get(i)).preTags("<em>").postTags("</em>").fragmentSize(250);  
  278.             }  
  279.         }  
  280.         NativeSearchQueryBuilder nsb = new NativeSearchQueryBuilder().withHighlightFields(hfields);//高亮字段  
  281.         if (sortField != null && order != null)//排序  
  282.             nsb.withSort(new FieldSortBuilder(sortField).ignoreUnmapped(true).order(order));  
  283.         BoolQueryBuilder qb=QueryBuilders. boolQuery();  
  284.         for (String key : filedContentMap.keySet()) {//字段查询  
  285.             qb.must(QueryBuilders.matchQuery(key,filedContentMap.get(key)));  
  286.               
  287.         }  
  288.         nsb.withQuery(qb);  
  289.         SearchQuery searchQuery = nsb.build();//查询建立  
  290.         Page<T> page = null;  
  291.         if (heightFields!=null&&heightFields.size() > 0) {//如果设置高亮  
  292.             page = elasticsearchTemplate.queryForPage(searchQuery,  
  293.                     getEntityClass(), new SearchResultMapper() {  
  294.                         @SuppressWarnings("unchecked")  
  295.                         @Override  
  296.                         public <T> Page<T> mapResults(SearchResponse response,Class<T> clazz, Pageable pageable) {  
  297.                             List<T> chunk = new ArrayList<T>();  
  298.                             for (SearchHit searchHit : response.getHits()) {  
  299.                                 if (response.getHits().getHits().length <= 0) {  
  300.                                     return null;  
  301.                                 }  
  302.   
  303.                                 Map<String, Object> entityMap = searchHit.getSource();  
  304.                                 for (String highName : heightFields) {  
  305.                                     String highValue = searchHit.getHighlightFields().get(highName).fragments()[0].toString();  
  306.                                     entityMap.put(highName, highValue);  
  307.                                 }  
  308.                                 chunk.add((T) PropertyHelper.getFansheObj(getEntityClass(), entityMap));  
  309.                             }  
  310.                             if (chunk.size() > 0) {  
  311.                                 return new PageImpl<T>((List<T>) chunk);  
  312.                             }  
  313.                             return null;  
  314.                         }  
  315.   
  316.                     });  
  317.         } else//如果不设置高亮  
  318.             page = elasticsearchTemplate.queryForPage(searchQuery,getEntityClass());  
  319.           
  320.         return page.getContent();  
  321.     }  
  322.     /**  
  323.      * 本类查询  
  324.      *   
  325.      * @param id  
  326.      * @return  
  327.      */  
  328.     public T queryById(String id) {  
  329.         StringQuery stringQuery = new StringQuery("id=" + id);  
  330.         T t = elasticsearchTemplate.queryForObject(stringQuery,  
  331.                 getEntityClass());  
  332.         return t;  
  333.   
  334.     }  
  335.   
  336.       
  337.       
  338.     public ElasticsearchTemplate getElasticsearchTemplate() {  
  339.         return elasticsearchTemplate;  
  340.     }  
  341.   
  342.   
  343.     public Client getEsClient() {  
  344.         return esClient;  
  345.     }  
  346.   
  347.   
  348.   
  349.     /**  
  350.      * 得到类型  
  351.      *   
  352.      * @return  
  353.      */  
  354.     public abstract Class<T> getEntityClass();  
  355.     /**  
  356.      * 添加各自类的影射  
  357.      */  
  358.     public abstract void putClassMapping();  
  359.       
  360.   
  361.   
  362.       
  363.   
  364. }  
原文 http://blog.csdn.net/u013378306/article/details/52185063

猜你喜欢

转载自blog.csdn.net/haiyang4988/article/details/77318794