zoukankan      html  css  js  c++  java
  • SpringBoot Elasticsearch工具类封装

    最近项目需要封装Elasticsearch工具类,特此记录便于日后查阅。

    1、maven依赖

    <dependency>
    <groupId>org.elasticsearch.plugin</groupId>
    <artifactId>transport-netty4-client</artifactId>
    <version>6.7.2</version>
    </dependency>

    2、application.yml

    elasticsearch:
    ip: 192.168.217.130
    port: 9300
    pool: 5
    cluster-name: my-es

    3、配置类

    /**
    * @Configuration用于定义配置类,可替换xml配置文件/yml文件.
    */
    @Configuration
    public class ElasticsearchConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchConfig.class);

    @Value("${elasticsearch.ip}")
    private String hostName;

    /**
    * 端口
    */
    @Value("${elasticsearch.port}")
    private String port;

    /**
    * 集群名称
    */
    @Value("${elasticsearch.cluster-name}")
    private String clusterName;

    /**
    * 连接池
    */
    @Value("${elasticsearch.pool}")
    private String poolSize;

    /**
    * Bean name default 函数名字
    * @return
    */
    @Bean(name = "transportClient")
    public TransportClient transportClient() {
    LOGGER.info("Elasticsearch初始化开始。。。。。");
    TransportClient transportClient = null;
    try {
    // 配置信息
    Settings esSetting = Settings.builder()
    .put("cluster.name", clusterName) //集群名字
    .put("client.transport.sniff", true)//增加嗅探机制,找到ES集群
    .put("thread_pool.search.size", Integer.parseInt(poolSize))//增加线程池个数,暂时设为5
    .build();
    //配置信息Settings自定义
    transportClient = new PreBuiltTransportClient(esSetting);
    TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), Integer.valueOf(port));
    transportClient.addTransportAddresses(transportAddress);
    } catch (Exception e) {
    LOGGER.error("elasticsearch TransportClient create error!!", e);
    }
    return transportClient;
    }
    }

    4、elasticsearch工具类

    @Component
    public class ElasticsearchUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchUtil.class);

    @Autowired
    private TransportClient transportClient;

    private static TransportClient client;

    /**
    * @PostContruct是spring框架的注解
    * spring容器初始化的时候执行该方法
    */
    @PostConstruct
    public void init() {
    client = this.transportClient;
    }

    /**
    * 创建索引
    *
    * @param index
    * @return
    */
    public static boolean createIndex(String index) {
    if(!isIndexExist(index)){
    LOGGER.info("Index is not exits!");
    }
    CreateIndexResponse indexResponse = client.admin().indices().prepareCreate(index).execute().actionGet();
    LOGGER.info("执行建立成功?" + indexResponse.isAcknowledged());
    return indexResponse.isAcknowledged();
    }

    /**
    * 删除索引
    *
    * @param index
    * @return
    */
    public static boolean deleteIndex(String index) {
    if(!isIndexExist(index)) {
    LOGGER.info("Index is not exits!");
    }
    DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(index).execute().actionGet();
    if (dResponse.isAcknowledged()) {
    LOGGER.info("delete index " + index + " successfully!");
    } else {
    LOGGER.info("Fail to delete index " + index);
    }
    return dResponse.isAcknowledged();
    }

    /**
    * 判断索引是否存在
    *
    * @param index
    * @return
    */
    public static boolean isIndexExist(String index) {
    IndicesExistsResponse inExistsResponse = client.admin().indices().exists(new IndicesExistsRequest(index)).actionGet();
    if (inExistsResponse.isExists()) {
    LOGGER.info("Index [" + index + "] is exist!");
    } else {
    LOGGER.info("Index [" + index + "] is not exist!");
    }
    return inExistsResponse.isExists();
    }

    /**
    * 数据添加,正定ID
    *
    * @param jsonObject 要增加的数据
    * @param index 索引,类似数据库
    * @param type 类型,类似表
    * @param id 数据ID
    * @return
    */
    public static String addData(JSONObject jsonObject, String index, String type, String id) {
    IndexResponse response = client.prepareIndex(index, type, id).setSource(jsonObject).get();
    LOGGER.info("addData response status:{},id:{}", response.status().getStatus(), response.getId());
    return response.getId();
    }
    /**
    * 数据添加
    *
    * @param jsonObject 要增加的数据
    * @param index 索引,类似数据库
    * @param type 类型,类似表
    * @return
    */
    public static String addData(JSONObject jsonObject, String index, String type) {
    return addData(jsonObject, index, type, UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
    }

    /**
    * 通过ID删除数据
    *
    * @param index 索引,类似数据库
    * @param type 类型,类似表
    * @param id 数据ID
    */
    public static void deleteDataById(String index, String type, String id) {
    DeleteResponse response = client.prepareDelete(index, type, id).execute().actionGet();
    LOGGER.info("deleteDataById response status:{},id:{}", response.status().getStatus(), response.getId());
    }

    /**
    * 通过ID 更新数据
    *
    * @param jsonObject 要增加的数据
    * @param index 索引,类似数据库
    * @param type 类型,类似表
    * @param id 数据ID
    * @return
    */
    public static void updateDataById(JSONObject jsonObject, String index, String type, String id) {
    UpdateRequest updateRequest = new UpdateRequest();
    updateRequest.index(index).type(type).id(id).doc(jsonObject);
    client.update(updateRequest);
    }

    /**
    * 通过ID获取数据
    *
    * @param index 索引,类似数据库
    * @param type 类型,类似表
    * @param id 数据ID
    * @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
    * @return
    */
    public static Map<String,Object> searchDataById(String index, String type, String id, String fields) {
    GetRequestBuilder getRequestBuilder = client.prepareGet(index, type, id);
    if (StringUtils.isNotEmpty(fields)) {
    getRequestBuilder.setFetchSource(fields.split(","), null);
    }
    GetResponse getResponse = getRequestBuilder.execute().actionGet();
    return getResponse.getSource();
    }

    /**
    * 使用分词查询,并分页
    *
    * @param index 索引名称
    * @param type 类型名称,可传入多个type逗号分隔
    * @param startPage 当前页
    * @param pageSize 每页显示条数
    * @param query 查询条件
    * @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
    * @param sortField 排序字段
    * @param highlightField 高亮字段
    * @return
    */
    public static EsPage searchDataPage(String index, String type, int startPage, int pageSize, QueryBuilder query, String fields, String sortField, String highlightField) {
    SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
    if (StringUtils.isNotEmpty(type)) {
    searchRequestBuilder.setTypes(type.split(","));
    }
    searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH);

    // 需要显示的字段,逗号分隔(缺省为全部字段)
    if (StringUtils.isNotEmpty(fields)) {
    searchRequestBuilder.setFetchSource(fields.split(","), null);
    }

    //排序字段
    if (StringUtils.isNotEmpty(sortField)) {
    searchRequestBuilder.addSort(sortField, SortOrder.DESC);
    }

    // 高亮(xxx=111,aaa=222)
    if (StringUtils.isNotEmpty(highlightField)) {
    HighlightBuilder highlightBuilder = new HighlightBuilder();

    //highlightBuilder.preTags("<span style='color:red' >");//设置前缀
    //highlightBuilder.postTags("</span>");//设置后缀

    // 设置高亮字段
    highlightBuilder.field(highlightField);
    searchRequestBuilder.highlighter(highlightBuilder);
    }

    //searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());
    searchRequestBuilder.setQuery(query);

    // 分页应用
    searchRequestBuilder.setFrom(startPage).setSize(pageSize);

    // 设置是否按查询匹配度排序
    searchRequestBuilder.setExplain(true);

    //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询
    LOGGER.info(" {}", searchRequestBuilder);

    // 执行搜索,返回搜索响应信息
    SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();

    long totalHits = searchResponse.getHits().totalHits;
    long length = searchResponse.getHits().getHits().length;

    LOGGER.debug("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length);

    if (searchResponse.status().getStatus() == 200) {
    // 解析对象
    List<Map<String, Object>> sourceList = setSearchResponse(searchResponse, highlightField);

    return new EsPage(startPage, pageSize, (int) totalHits, sourceList);
    }

    return null;

    }

    /**
    * 使用分词查询
    *
    * @param index 索引名称
    * @param type 类型名称,可传入多个type逗号分隔
    * @param query 查询条件
    * @param size 文档大小限制
    * @param fields 需要显示的字段,逗号分隔(缺省为全部字段)
    * @param sortField 排序字段
    * @param highlightField 高亮字段
    * @return
    */
    public static List<Map<String, Object>> searchListData(String index, String type, QueryBuilder query, Integer size, String fields, String sortField, String highlightField) {

    SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
    if (StringUtils.isNotEmpty(type)) {
    searchRequestBuilder.setTypes(type.split(","));
    }

    if (StringUtils.isNotEmpty(highlightField)) {
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    // 设置高亮字段
    highlightBuilder.field(highlightField);
    searchRequestBuilder.highlighter(highlightBuilder);
    }

    searchRequestBuilder.setQuery(query);

    if (StringUtils.isNotEmpty(fields)) {
    searchRequestBuilder.setFetchSource(fields.split(","), null);
    }
    searchRequestBuilder.setFetchSource(true);

    if (StringUtils.isNotEmpty(sortField)) {
    searchRequestBuilder.addSort(sortField, SortOrder.DESC);
    }

    if (size != null && size > 0) {
    searchRequestBuilder.setSize(size);
    }

    //打印的内容 可以在 Elasticsearch head 和 Kibana 上执行查询
    LOGGER.info(" {}", searchRequestBuilder);

    SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();

    long totalHits = searchResponse.getHits().totalHits;
    long length = searchResponse.getHits().getHits().length;

    LOGGER.info("共查询到[{}]条数据,处理数据条数[{}]", totalHits, length);

    if (searchResponse.status().getStatus() == 200) {
    // 解析对象
    return setSearchResponse(searchResponse, highlightField);
    }

    return null;

    }


    /**
    * 高亮结果集 特殊处理
    *
    * @param searchResponse
    * @param highlightField
    */
    private static List<Map<String, Object>> setSearchResponse(SearchResponse searchResponse, String highlightField) {
    List<Map<String, Object>> sourceList = new ArrayList<Map<String, Object>>();
    StringBuffer stringBuffer = new StringBuffer();

    for (SearchHit searchHit : searchResponse.getHits().getHits()) {
    searchHit.getSourceAsMap().put("id", searchHit.getId());

    if (StringUtils.isNotEmpty(highlightField)) {

    System.out.println("遍历 高亮结果集,覆盖 正常结果集" + searchHit.getSourceAsMap());
    Text[] text = searchHit.getHighlightFields().get(highlightField).getFragments();

    if (text != null) {
    for (Text str : text) {
    stringBuffer.append(str.string());
    }
    //遍历 高亮结果集,覆盖 正常结果集
    searchHit.getSourceAsMap().put(highlightField, stringBuffer.toString());
    }
    }
    sourceList.add(searchHit.getSourceAsMap());
    }

    return sourceList;
    }
    }

    Elasticsearch工具类封装完成。
    ————————————————
    版权声明:本文为CSDN博主「张志翔」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_19734597/java/article/details/92816880

  • 相关阅读:
    凸透镜和凹透镜为什么分别对光有会聚作用和发散作用
    平面镜成像
    行政 申论 大纲
    专业科 大纲
    linux command --- terminal common commands
    3D VR卡镜的使用方法
    Structure From Motion(二维运动图像中的三维重建)
    双目摄像机
    对比手机SLAM和机器人SLAM
    3D indoor map positioning with a smartphone image
  • 原文地址:https://www.cnblogs.com/niudaxianren/p/12895024.html
Copyright © 2011-2022 走看看