Java + SpringBoot 操作 ElasticSearch7.x.x工具类RestHighLevelClientUtils

这篇具有很好参考价值的文章主要介绍了Java + SpringBoot 操作 ElasticSearch7.x.x工具类RestHighLevelClientUtils。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ElasticSearch创建索引,删除索引,判断 index 是否存在,根据 id 删除指定索引中的文档,
根据 id 更新指定索引中的文档,根据 id 更新指定索引中的文档,根据某字段的 k-v 更新索引中的文档,
添加文档 手动指定id,简单模糊匹配 默认分页为 0,10, term 查询 精准匹配,term 查询 精准匹配,返回列表,term 查询 ,返回列表,查询列表并高亮,批量导入,获取分词结果,返回聚合结果。文章来源地址https://www.toymoban.com/news/detail-536816.html

1、在application.yml配置如下内容

#数据源配置
spring:
  data:
    elasticsearch:
      client:
        reactive:
          endpoints: 127.0.0.1:9200
          connection-timeout: 10s
          username: xxxx
          password: xxxx
      #ES 持久化存储
      repositories:
        enabled: true
  elasticsearch:
    rest:
      # 要连接的ES客户端Rest Uri 多个逗号分隔
      uris: http://127.0.0.1:9200
      connection-timeout: 10s
      read-timeout: 30s
      username: xxxx
      password: xxxx

2、RestHighLevelClientUtils工具类

package cn.itbluebox.itblueboxesjd.utils;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.index.reindex.UpdateByQueryRequest;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.xcontent.XContentType;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;

//DeleteRequest GetRequest UpdateRequest 都是根据 id 操作文档

/**
 * @author anqi
 */
@Component
public class RestHighLevelClientUtils {

    @Resource
    private RestHighLevelClient client;

    /**
     * 创建索引
     * @param indexName
     * @param settings
     * @param mapping
     * @return
     * @throws IOException
     */
    public CreateIndexResponse createIndex(String indexName, String settings, String mapping) throws IOException{
        CreateIndexRequest request = new CreateIndexRequest(indexName);
        if (null != settings && !"".equals(settings)) {
            request.settings(settings, XContentType.JSON);
        }
        if (null != mapping && !"".equals(mapping)) {
            request.mapping(mapping, XContentType.JSON);
        }
        return client.indices().create(request, RequestOptions.DEFAULT);
    }

    /**
     * 删除索引
     * @param indexNames
     * @return
     * @throws IOException
     */
    public AcknowledgedResponse deleteIndex(String ... indexNames) throws IOException{
        DeleteIndexRequest request = new DeleteIndexRequest(indexNames);
        return client.indices().delete(request, RequestOptions.DEFAULT);
    }


    /**
     * 判断 index 是否存在
     * @param indexName
     * @return
     * @throws IOException
     */
    public boolean indexExists(String indexName) throws IOException {
        GetIndexRequest request = new GetIndexRequest(indexName);
        return client.indices().exists(request, RequestOptions.DEFAULT);
    }

    /**
     * 根据 id 删除指定索引中的文档
     * @param indexName
     * @param id
     * @return
     * @throws IOException
     */
    public DeleteResponse deleteDoc(String indexName, String id) throws IOException{
        DeleteRequest request = new DeleteRequest(indexName, id);
        return client.delete(request, RequestOptions.DEFAULT);
    }

    /**
     * 根据 id 更新指定索引中的文档
     * @param indexName
     * @param id
     * @return
     * @throws IOException
     */
    public UpdateResponse updateDoc(String indexName, String id, String updateJson) throws IOException{
        UpdateRequest request = new UpdateRequest(indexName, id);
        request.doc(XContentType.JSON, updateJson);
        return client.update(request, RequestOptions.DEFAULT);
    }

    /**
     * 根据 id 更新指定索引中的文档
     * @param indexName
     * @param id
     * @return
     * @throws IOException
     */
    public UpdateResponse updateDoc(String indexName, String id, Map<String,Object> updateMap) throws IOException{
        UpdateRequest request = new UpdateRequest(indexName, id);
        request.doc(updateMap);

        return client.update(request, RequestOptions.DEFAULT);
    }

    private String generateCurrentData() {

        Long timeStamp = System.currentTimeMillis();  //获取当前时间戳
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String sd = sdf.format(new Date(Long.parseLong(String.valueOf(timeStamp))));      // 时间戳转换成时间
        return sd;
    }

    /**
     * 根据某字段的 k-v 更新索引中的文档
     * @param fieldName
     * @param value
     * @param indexName
     * @throws IOException
     */
    public void updateByQuery(String fieldName, String value, String ... indexName) throws IOException {
        UpdateByQueryRequest request = new UpdateByQueryRequest(indexName);
        //单次处理文档数量
        request.setBatchSize(100)
                .setQuery(new TermQueryBuilder(fieldName, value))
                .setTimeout(TimeValue.timeValueMinutes(2));
        client.updateByQuery(request, RequestOptions.DEFAULT);
    }

    /**
     * 添加文档 手动指定id
     * @param indexName
     * @param id
     * @param source
     * @return
     * @throws IOException
     */
    public IndexResponse addDoc(String indexName, String id, String source) throws IOException{
        IndexRequest request = new IndexRequest(indexName);
        if (null != id) {
            request.id(id);
        }
        request.source(source, XContentType.JSON);
        return client.index(request, RequestOptions.DEFAULT);
    }

    /**
     * 添加文档 使用自动id
     * @param indexName
     * @param source
     * @return
     * @throws IOException
     */
    public IndexResponse addDoc(String indexName, String source) throws IOException{
        return addDoc(indexName, null, source);
    }

    /**
     * 简单模糊匹配 默认分页为 0,10
     * @param field
     * @param key
     * @param page
     * @param size
     * @param indexNames
     * @return
     * @throws IOException
     */
    public SearchResponse search(String field, String key, int page, int size, String ... indexNames) throws IOException{
        SearchRequest request = new SearchRequest(indexNames);
        SearchSourceBuilder builder = new SearchSourceBuilder();

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if (StrUtil.isEmpty(key)){
            builder.query(QueryBuilders.matchAllQuery())
                    .from((page-1) * size)
                    .size(size);
        }else{
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
            boolQuery.should(QueryBuilders.matchQuery(field, key));
            boolQueryBuilder.must(boolQuery);
            builder.query(boolQueryBuilder)
                    .from((page-1) * size)
                    .size(size);
        }

        request.source(builder);
        return client.search(request, RequestOptions.DEFAULT);
    }

    /**
     * term 查询 精准匹配
     * @param field
     * @param key
     * @param page
     * @param size
     * @param indexNames
     * @return
     * @throws IOException
     */
    public SearchResponse termSearch(String field, String key, int page, int size, String ... indexNames) throws IOException{
        SearchRequest request = new SearchRequest(indexNames);
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.termsQuery(field, key))
                .from(page)
                .size(size);
        request.source(builder);
        return client.search(request, RequestOptions.DEFAULT);
    }

    /**
     * term 查询 精准匹配,返回列表
     * @param field
     * @param key
     * @param page
     * @param size
     * @param indexNames
     * @return
     * @throws IOException
     */
    public List<Map<String, Object>> termSearchList(String field, String key, int page, int size, String ... indexNames){
        try {

            SearchRequest request = new SearchRequest(indexNames);
            SearchSourceBuilder builder = new SearchSourceBuilder();
            builder.query(QueryBuilders.termsQuery(field, key))
                    .from(page)
                    .size(size);
            request.source(builder);
            SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
            SearchHits hits = searchResponse.getHits();
            // 获取检索结果总数
            List<Map<String, Object>> resultList=new ArrayList<>();
            for (SearchHit hit : hits.getHits()) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                resultList.add(sourceAsMap);
            }
            return resultList;
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("查询失败");
        }

    }

    /**
     * term 查询 ,返回列表
     * @param indexNames
     * @return
     * @throws IOException
     */
    public List<Map<String, Object>> SearchList(SearchSourceBuilder builder, String ...indexNames){
        try {
            SearchRequest request = new SearchRequest(indexNames);
            request.source(builder);
            SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
            SearchHits hits = searchResponse.getHits();
            // 获取检索结果总数
            List<Map<String, Object>> resultList=new ArrayList<>();
            for (SearchHit hit : hits.getHits()) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                sourceAsMap.put("index",hit.getIndex());
                resultList.add(sourceAsMap);
            }
            return resultList;
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("查询失败");
        }

    }

    /**
     * 查询列表并高亮
     * @param builder
     * @param indexNames
     * @return
     */
    public List<Map<String, Object>> SearchListWithHigh(SearchSourceBuilder builder, String ...indexNames){
        try {
            SearchRequest request = new SearchRequest(indexNames);
            request.source(builder);
            SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
            SearchHits hits = searchResponse.getHits();
            // 获取检索结果总数
            List<Map<String, Object>> resultList=new ArrayList<>();
            for (SearchHit hit : hits.getHits()) {
                Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                Map<String, HighlightField> highlightFieldMap = hit.getHighlightFields();
                // 获取高亮
                for (Map.Entry<String, HighlightField> entry : highlightFieldMap.entrySet()) {
                    Map<String, String> map = new HashMap<>();
                    Text[] texts = highlightFieldMap.get(entry.getKey()).getFragments();
                    String title = "";
                    for (Text text : texts) {
                        title += text;
                    }
                    map.put(entry.getKey(), title);
                    sourceAsMap.put(entry.getKey(), title);
                }
                sourceAsMap.put("index",hit.getIndex());
                resultList.add(sourceAsMap);
            }
            return resultList;
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("查询失败");
        }

    }


    /**
     * 批量导入
     * @param indexName
     * @param isAutoId 使用自动id 还是使用传入对象的id
     * @param source
     * @return
     * @throws IOException
     */
    public BulkResponse importAll(String indexName, boolean isAutoId, String  source) throws IOException{
        if (0 == source.length()){
            //todo 抛出异常 导入数据为空
        }
        BulkRequest request = new BulkRequest();

        JSONArray array = JSON.parseArray(source);

        //todo 识别json数组
        if (isAutoId) {
            for (Object s : array) {
                request.add(new IndexRequest(indexName).source(s, XContentType.JSON));
            }
        } else {
            for (Object s : array) {
                request.add(new IndexRequest(indexName).id(JSONObject.parseObject(s.toString()).getString("id")).source(s, XContentType.JSON));
            }
        }
        return client.bulk(request, RequestOptions.DEFAULT);
    }

    /**
     * 获取分词结果
     * @param text
     * @return
     */
    public List<String> getAnalyze(String text){
        try{
            List<String> list = new ArrayList<>();
            Request request = new Request("GET", URLEncoder.encode("_analyze"));
            JSONObject entity = new JSONObject();
            entity.put("analyzer", "hanlp");
            entity.put("text", text);
            request.setJsonEntity(entity.toJSONString());
            Response response = client.getLowLevelClient().performRequest(request);
            JSONObject tokens = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));
            JSONArray arrays = tokens.getJSONArray("tokens");
            for (int i = 0; i < arrays.size(); i++)
            {
                JSONObject obj = JSON.parseObject(arrays.getString(i));
                list.add(obj.getString("token"));
            }

            return list;
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("获取分词结果失败");
        }
    }

    /**
     * 返回聚合结果
     * @param groupfield
     * @param indexNames
     * @return
     */
	public List<String> searchForGroupOne(String groupfield, String ... indexNames){
		try {
			SearchRequest request = new SearchRequest(indexNames);
			SearchSourceBuilder builder = new SearchSourceBuilder();
			TermsAggregationBuilder aggregation = AggregationBuilders.terms(groupfield).field(groupfield).size(100);
			builder.aggregation(aggregation);
			request.source(builder);
			SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
			//获取政策的聚合结果
			List<String> agglist=new ArrayList<>();
			//获取主分类-年份
			Terms terms = searchResponse.getAggregations().get(groupfield);
			if (terms != null) {
				for (Terms.Bucket bucket : terms.getBuckets()) {
					String the = (String) bucket.getKey();
					if (StrUtil.isNotBlank(the)) {
						agglist.add(the);
					}
				}
			}
			return agglist;
		}catch (Exception e){
			e.printStackTrace();
			throw new RuntimeException("查询失败");
		}
	}

	public List<String> searchForGroupOneAll(String groupfield, String ... indexNames){
		try {
			SearchRequest request = new SearchRequest(indexNames);
			SearchSourceBuilder builder = new SearchSourceBuilder();
			TermsAggregationBuilder aggregation = AggregationBuilders.terms(groupfield).field(groupfield);
			builder.aggregation(aggregation);
			request.source(builder);
			SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
			//获取政策的聚合结果
			List<String> agglist=new ArrayList<>();
			//获取主分类-年份
			Terms terms = searchResponse.getAggregations().get(groupfield);
			if (terms != null) {
				for (Terms.Bucket bucket : terms.getBuckets()) {
					String the = (String) bucket.getKey();
					if (StrUtil.isNotBlank(the)) {
						agglist.add(the);
					}
				}
			}
			return agglist;
		}catch (Exception e){
			e.printStackTrace();
			throw new RuntimeException("查询失败");
		}
	}
	public BulkByScrollResponse deleteByQuery(DeleteByQueryRequest request, RequestOptions aDefault)  {
		BulkByScrollResponse bulkByScrollResponse = null;
		try {
			bulkByScrollResponse = client.deleteByQuery(request, aDefault);
		}catch (Exception e){
			e.printStackTrace();
		}
		return bulkByScrollResponse;
	}
}

到了这里,关于Java + SpringBoot 操作 ElasticSearch7.x.x工具类RestHighLevelClientUtils的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot整合ElasticSearch7.x及实战】

    此笔记内容为狂神说SpringBoot整合ElasticSearch部分 目录 一、SpringBoot整合 1、创建工程 2、导入依赖 导入elasticsearch依赖 提前导入fastjson、lombok 3、创建并编写配置类 4、创建并编写实体类 5、测试 索引的操作 文档的操作 二、ElasticSearch实战 防京东商城搜索(高亮) 1、工程创建(

    2024年02月08日
    浏览(46)
  • SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询)

    章节 第一章链接: SpringBoot集成Elasticsearch7.x(1)|(增删改查功能实现) 第二章链接: SpringBoot集成Elasticsearch7.x(2)|(复杂查询) 第三章链接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指标聚合查询) 第四章链接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合查询)

    2024年02月05日
    浏览(39)
  • springboot集成Elasticsearch7.16,使用https方式连接并忽略SSL证书

    千万万苦利用科学上网找到了,记录一下

    2024年02月09日
    浏览(38)
  • elasticsearch7基础用法及java中使用

    GET、POST、PUT、DELETE、HEAD。 id content 1001 my name is zhang san 1002 i name is li si 1003 my name is wang wu keyword id name 1001,1002,1003 zhang 1001a my 1001,1003 PUT请求:http://127.0.0.1:9200/索引名称 返回值: 表头 含义 health 当前服务器健康状态: green (集群完整) yellow (单点正常、集群不完整) red(单点不正

    2024年02月03日
    浏览(25)
  • [Java Framework] [ELK] Spring 整合ES (ElasticSearch7.15.x +)

    ElasticSearch7.15.x 版本后,废弃了高级Rest客户端的功能 2.1 配置文件 2.2 配置类 3.1 索引的相关操作 3.2 实体映射相关操作 3.2.1 创建实体类 3.2.2 Doc实体操作API 3.3 聚合相关操作 3.3.1 创建实体类 3.3.2 创建操作类 [1] Elasticsearch Clients [2] Elasticsearch Clients - Aggregations

    2023年04月08日
    浏览(35)
  • ElasticSearch7.3学习(十六)----RestHighLevelClient Java api实现索引的创建、删除、是否存在、关闭、开启

    注意:导入的包区别,不同的包创建索引的方式不同。博主亲身实践,具体体现在createIndexRequest.mapping()里面。读者可自行试验。  由此可以猜想一下: 可以看到上述两种方式导入的包的子类名是相同的,但是具体对索引的操作方式可能是不同的。具体的区别博主暂时还不清

    2024年02月16日
    浏览(36)
  • Java SpringBoot API 实现ES(Elasticsearch)搜索引擎的一系列操作(超详细)(模拟数据库操作)

    小编使用的是elasticsearch-7.3.2 基础说明: 启动:进入elasticsearch-7.3.2/bin目录,双击elasticsearch.bat进行启动,当出现一下界面说明,启动成功。也可以访问http://localhost:9200/ 启动ES管理:进入elasticsearch-head-master文件夹,然后进入cmd命令界面,输入npm run start 即可启动。访问http

    2024年02月04日
    浏览(44)
  • 【Elasticsearch学习笔记五】es常用的JAVA API、es整合SpringBoot项目中使用、利用JAVA代码操作es、RestHighLevelClient客户端对象

    目录 一、Maven项目集成Easticsearch 1)客户端对象 2)索引操作 3)文档操作 4)高级查询 二、springboot项目集成Spring Data操作Elasticsearch 1)pom文件 2)yaml 3)数据实体类 4)配置类 5)Dao数据访问对象 6)索引操作 7)文档操作 8)文档搜索 三、springboot项目集成bboss操作elasticsearch

    2023年04月09日
    浏览(38)
  • Docker安装ElasticSearch7.14.0 docker安装elasticsearch7.14.0完整详细教程

    Docker常用命令大全 Docker ElasticSearch 官方仓库 我这边选择的版本是 7.14.0 ,这个版本比较安全可靠,在终端中执行以下命令以拉取 docker pull elasticsearch:7.14.0 使用以下命令创建一个新的 rabbitmq容器并将其启动: --name 是 容器别名 将 宿主机 9200 端口映射到 容器内 9200 and 端口 93

    2024年02月13日
    浏览(31)
  • 【elasticsearch】elasticsearch7.x集群搭建

    目录 一、服务器情况 二、安装前准备 1、下载es 2、配置服务器免密登录 3、升级jdk 三、安装es集群 (一)master服务器的操作 1、将es上传到Linux并解压 2、创建数据、日志存储文件夹 3、配置config/elasticsearch.yml 4、配置jvm 5、创建es用户 6、赋权限 7、修改配置文件 8、启动服务 9、启

    2023年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包