elasticSearch 增删改查 java api

新增 index 类似表名,id就是主键,map是字段和内容

java 复制代码
IndexRequest request=new IndexRequest(index).id(id).source(map);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);

编辑

单个更新

java 复制代码
 // 创建XContentBuilder构建JSON内容(自动处理转义)
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
builder.field("title", esArchiveVo.getTitle());
builder.field("content", esArchiveVo.getContent());
builder.endObject();

// 构建更新请求,使用XContentBuilder而非字符串
UpdateRequest request = new UpdateRequest(index,id).doc(builder);
// 执行更新操作
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);

删除

java 复制代码
 DeleteRequest deleteRequest = new DeleteRequest(index,id);
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);

分页查询

java 复制代码
// 年份精确查询
if (year != null) {
  TermQueryBuilder yearQuery = QueryBuilders.termQuery("year", year);
  boolQueryBuilder.must(yearQuery);
}

// 月份精确查询
if (month != null) {
 TermQueryBuilder monthQuery = QueryBuilders.termQuery("month", month);
 boolQueryBuilder.must(monthQuery);
}

// 日期范围查询
RangeQueryBuilder dateRangeQuery = QueryBuilders.rangeQuery("date");
boolean hasDateCondition = false; // 标记是否有有效的日期条件
// 开始日期:>= startDate
if (StringUtils.isNotBlank(startDate)) {
  archiveDateRangeQuery.gte(startDate); // gte = greater than or equal
  hasDateCondition = true;
}
// 结束日期:<= endDate
if (StringUtils.isNotBlank(endDate)) {
  archiveDateRangeQuery.lte(endDate); // lte = less than or equal
  hasDateCondition = true;
}
// 如果有有效的日期条件,添加到查询中
if (hasDateCondition) {
   boolQueryBuilder.must(archiveDateRangeQuery);
}

// 学生号模糊查询(修改为短语匹配)
if (StringUtils.isNotBlank(studentNum)) {
  MatchPhraseQueryBuilder studentNumQuery =QueryBuilders.matchPhraseQuery("studentNum",studentNum);
  boolQueryBuilder.must(agencyVolumeNumQuery);
}


builder.query(boolQueryBuilder);
builder.from((page-1)*limit);
builder.size(limit);
builder.highlighter(highlightBuilder);
builder.sort("title.keyword", SortOrder.ASC);
searchRequest.source(builder);
LinkedList<EsArchiveVo> archiveList = new LinkedList<>();
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);

创建index 类似创建表 index自定义,如index=student

java 复制代码
 Settings settings = Settings.builder()
                    .put("index.number_of_shards", 3)
                    .put("index.number_of_replicas", 2)
                    .build();
            String mapping = "{\n" +
                    "    \"properties\": {\n" +
                    "        \"id\": {\n" +
                    "            \"type\": \"keyword\"\n" +
                    "        },\n" +
                    "        \"title\": {\n" +
                    "            \"type\": \"text\",\n" +
                    "            \"fields\": {\n" +
                    "                \"keyword\": {\n" +
                    "                    \"type\": \"keyword\",\n" +
                    "                    \"ignore_above\": 256\n" +
                    "                }\n" +
                    "            }\n" +
                    "        },\n" +
                    "        \"content\": {\n" +
                    "            \"type\": \"text\",\n" +
                    "            \"fields\": {\n" +
                    "                \"keyword\": {\n" +
                    "                    \"type\": \"keyword\",\n" +
                    "                    \"ignore_above\": 256\n" +
                    "                }\n" +
                    "            }\n" +
                    "        },\n" +
                    "        \"year\": {\n" +
                    "            \"type\": \"integer\"\n" +
                    "        },\n" +
                    "        \"month\": {\n" +
                    "            \"type\": \"integer\"\n" +
                    "        },\n" +
                    "        \"date\": {\n" +
                    "            \"type\": \"date\",\n" +
                    "            \"format\": \"yyyy-MM-dd\"\n" +
                    "        },\n" +
                    "        \"studentNum\": {\n" +
                    "            \"type\": \"text\",\n" +
                    "            \"fields\": {\n" +
                    "                \"keyword\": {\n" +
                    "                    \"type\": \"keyword\",\n" +
                    "                    \"ignore_above\": 256\n" +
                    "                }\n" +
                    "            }\n" +
                    "        },\n" +
                    "    }\n" +
                    "}";

 CreateIndexRequest indexRequest = new CreateIndexRequest(index)
                    .settings(settings).mapping(mapping, XContentType.JSON);
            CreateIndexResponse response = null;
            try {
                response = client.indices().create(indexRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                log.info("错误信息", e);
                throw new ServiceException(e.getMessage());
            }
            if (response != null) {
                return response.isAcknowledged();
            } else {
                return false;
            }

删除index,类似删表操作

java 复制代码
DeleteIndexRequest request = new DeleteIndexRequest(index);
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
response.isAcknowledged();

批量删除 根据mapping里的id字段批量删除 idList是List<String>格式

复制代码
DeleteByQueryRequest request = new DeleteByQueryRequest(index);
request.setQuery(new TermsQueryBuilder("id", idList));
client.deleteByQuery(request, RequestOptions.DEFAULT);

批量更新

java 复制代码
BulkRequest bulkRequest = new BulkRequest();
for (EsUpdateDto esUpdateDto: list){
   try (XContentBuilder builder = XContentFactory.jsonBuilder()) {
       builder.startObject();
       // 动态添加非空字段
       if (esUpdateDto.getYear() != null) {
           builder.field("year", esUpdateDto.getYear());
       }
       if (esUpdateDto.getDate() != null && !esUpdateDto.getDate().isEmpty()) {
           builder.field("date", esUpdateDto.getDate());
       }
      builder.endObject();

       // 构建更新请求
      UpdateRequest request = new UpdateRequest(index, esUpdateDto.getId())
                        .doc(builder); // 使用XContentBuilder而非字符串
                builder.close();
                bulkRequest.add(request);
       } catch (Exception e) {
           log.error("构建更新请求失败, ID: {}", esUpdateDto.getId(), e);
          throw new ServiceException(e);
       }
}
try{
    // 执行批量更新
    BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
    // 处理响应
    if (bulkResponse.hasFailures()) {
      // 处理失败请求
      bulkResponse.forEach(item -> {
        if (item.isFailed()) {
          log.error("更新失败 - ID: " + item.getId() + ", 错误: " + 
          item.getFailureMessage());
        }
      });
     } else {
          log.info("✅ 批量更新成功,共更新 " + bulkResponse.getItems().length + " 个文档");
     }
catch (Exception e){
    e.printStackTrace();
    throw new ServiceException(e.getMessage());
}

根据id查询数据

复制代码
GetRequest getRequest = new GetRequest(index,id);
GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
response.getSource();
相关推荐
市场部需要一个软件开发岗位3 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿7 分钟前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD00111 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东14 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology19 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble23 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域24 分钟前
AI抢人大战:谁在收割你的红包
大数据·人工智能·算法
人道领域31 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
qq_12498707531 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
Hello.Reader1 小时前
Flink 使用 Amazon S3 读写、Checkpoint、插件选择与性能优化
大数据·flink