spring 操作elasticsearch

版权声明:GOOD DEEP https://blog.csdn.net/u013378306/article/details/52185063
  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.  
    }

转载于:https://www.cnblogs.com/gscq073240/articles/9644318.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值