admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/dao/ElasticBaseDao.java
@@ -1,189 +1,188 @@
package com.yeshi.fanli.dao;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
//import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.stereotype.Repository;
import org.yeshi.utils.JsonUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.service.manger.ElasticManger;
@Repository
public abstract class ElasticBaseDao<T> {
   @Resource
   protected  ElasticManger elasticManger;
   /**
    * 获取index
    * @param bean
    * @return
    */
   public String getDocument(Class<?> entityClass) {
      if (entityClass.isAnnotationPresent(Document.class)) {
           Document doc = (Document)entityClass.getAnnotation(Document.class);
           return doc.indexName();
      }
      String name = entityClass.getName();
      return name.substring(name.lastIndexOf(".") + 1, name.length());
   }
   /**
    * 插入数据
    *
    * @param bean
    * @return
    */
   public void save(T bean) {
      String document = getDocument(bean.getClass());
      String json = JsonUtil.getSimpleGson().toJson(bean);
      IndexRequest request = new IndexRequest(document);
      request.source(json, XContentType.JSON);
      // 同步执行
      try {
         elasticManger.getClient().index(request, RequestOptions.DEFAULT);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   /**
    * 插入数据
    *
    * @param bean
    * @return
    */
   public void save(T bean, String id) {
      String document = getDocument(bean.getClass());
      String json = JsonUtil.getSimpleGson().toJson(bean);
      IndexRequest request = new IndexRequest(document).id(id);
      request.source(json, XContentType.JSON);
      // 同步执行
      try {
         elasticManger.getClient().index(request, RequestOptions.DEFAULT);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   /**
    * 更新
    * @param Document id
    * @param bean
    */
   public void update(String id, T bean) {
      String document = getDocument(bean.getClass());
      UpdateRequest request = new UpdateRequest(document, id);
      String json = new GsonBuilder().create().toJson(bean);
      request.doc(json, XContentType.JSON);
      try {
         elasticManger.getClient().update(request, RequestOptions.DEFAULT);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   /**
    *删除
    *
    * @param Document id
    */
   public void delete(String id, Class<T> entityClass) {
      String document = getDocument(entityClass);
      DeleteRequest request = new DeleteRequest(document, id);
      try {
         elasticManger.getClient().delete(request, RequestOptions.DEFAULT);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   /**
    * 查询
    *
    * @param Document id
    * @return
    */
   public T get(String id, Class<T> entityClass) {
      String document = getDocument(entityClass);
      GetRequest request = new GetRequest(document, id);
      try {
         GetResponse getResponse = elasticManger.getClient().get(request, RequestOptions.DEFAULT);
         if (getResponse.isExists()) {
             String content = getResponse.getSourceAsString();
             return new Gson().fromJson(content, entityClass);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    * 查询
    * @param document 列名
    * @param key 匹配词-将分开单个字
    * @param start
    * @param count
    * @param entityClass
    * @return
    */
   public List<T> query(String document, String key, int start, int count, Class<T> entityClass) {
      String index = getDocument(entityClass);
      List<T> list = new ArrayList<>();
      SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
      sourceBuilder.query(QueryBuilders.termQuery(document, key));
      sourceBuilder.from(start); // 索引以开始搜索的选项。预设为0。
      sourceBuilder.size(count); // 返回的搜索命中次数的选项。默认为10
      sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); // 设置一个可选的超时时间,以控制允许搜索的时间。
      SearchRequest searchRequest = new SearchRequest();
      searchRequest.indices(index);
      searchRequest.source(sourceBuilder);
      try {
         SearchResponse searchResponse = elasticManger.getClient().search(searchRequest, RequestOptions.DEFAULT);
         SearchHits hits = searchResponse.getHits();
         SearchHit[] searchHits = hits.getHits();
         Gson gson = new Gson();
         for (SearchHit hit : searchHits) {
            String content = hit.getSourceAsString();
            list.add(gson.fromJson(content, entityClass));
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
      return list;
   }
}
package com.yeshi.fanli.dao;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Resource;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Repository;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.elasticsearch.Document;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.yeshi.fanli.service.manger.ElasticManger;
@Repository
public abstract class ElasticBaseDao<T> {
   @Resource
   protected  ElasticManger elasticManger;
   /**
    * 获取index
    * @param bean
    * @return
    */
   public String getDocument(Class<?> entityClass) {
      if (entityClass.isAnnotationPresent(Document.class)) {
           Document doc = (Document)entityClass.getAnnotation(Document.class);
           return doc.indexName();
      }
      String name = entityClass.getName();
      return name.substring(name.lastIndexOf(".") + 1, name.length());
   }
   /**
    * 插入数据
    *
    * @param bean
    * @return
    */
   public void save(T bean) {
      String document = getDocument(bean.getClass());
      String json = JsonUtil.getSimpleGson().toJson(bean);
      IndexRequest request = new IndexRequest(document);
      request.source(json, XContentType.JSON);
      // 同步执行
      try {
         elasticManger.getClient().index(request, RequestOptions.DEFAULT);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   /**
    * 插入数据
    *
    * @param bean
    * @return
    */
   public void save(T bean, String id) {
      String document = getDocument(bean.getClass());
      String json = JsonUtil.getSimpleGson().toJson(bean);
      IndexRequest request = new IndexRequest(document).id(id);
      request.source(json, XContentType.JSON);
      // 同步执行
      try {
         elasticManger.getClient().index(request, RequestOptions.DEFAULT);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   /**
    * 更新
    * @param Document id
    * @param bean
    */
   public void update(String id, T bean) {
      String document = getDocument(bean.getClass());
      UpdateRequest request = new UpdateRequest(document, id);
      String json = new GsonBuilder().create().toJson(bean);
      request.doc(json, XContentType.JSON);
      try {
         elasticManger.getClient().update(request, RequestOptions.DEFAULT);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   /**
    *删除
    *
    * @param Document id
    */
   public void delete(String id, Class<T> entityClass) {
      String document = getDocument(entityClass);
      DeleteRequest request = new DeleteRequest(document, id);
      try {
         elasticManger.getClient().delete(request, RequestOptions.DEFAULT);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   /**
    * 查询
    *
    * @param Document id
    * @return
    */
   public T get(String id, Class<T> entityClass) {
      String document = getDocument(entityClass);
      GetRequest request = new GetRequest(document, id);
      try {
         GetResponse getResponse = elasticManger.getClient().get(request, RequestOptions.DEFAULT);
         if (getResponse.isExists()) {
             String content = getResponse.getSourceAsString();
             return new Gson().fromJson(content, entityClass);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
      return null;
   }
   /**
    * 查询
    * @param document 列名
    * @param key 匹配词-将分开单个字
    * @param start
    * @param count
    * @param entityClass
    * @return
    */
   public List<T> query(String document, String key, int start, int count, Class<T> entityClass) {
      String index = getDocument(entityClass);
      List<T> list = new ArrayList<>();
      SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
      sourceBuilder.query(QueryBuilders.termQuery(document, key));
      sourceBuilder.from(start); // 索引以开始搜索的选项。预设为0。
      sourceBuilder.size(count); // 返回的搜索命中次数的选项。默认为10
      sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); // 设置一个可选的超时时间,以控制允许搜索的时间。
      SearchRequest searchRequest = new SearchRequest();
      searchRequest.indices(index);
      searchRequest.source(sourceBuilder);
      try {
         SearchResponse searchResponse = elasticManger.getClient().search(searchRequest, RequestOptions.DEFAULT);
         SearchHits hits = searchResponse.getHits();
         SearchHit[] searchHits = hits.getHits();
         Gson gson = new Gson();
         for (SearchHit hit : searchHits) {
            String content = hit.getSourceAsString();
            list.add(gson.fromJson(content, entityClass));
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
      return list;
   }
}