【ElasticSearch】索引生命周期管理(二)
背景
接文章 【ElasticSearch】索引生命周期管理(一)
这里主要记录使用ILM后,如何使用Java语言对索引数据进行增删改查以及使用Nest嵌套查询如何进行数据查询
依赖
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> </dependency>
实现
索引模板
PUT _template/image_audit_template
{
"mappings" : {
"image_audit_type" : {
"_source" : {
"enabled" : true
},
"properties" : {
"appId" : {
"type" : "keyword"
},
"bizType" : {
"type" : "keyword"
},
"content" : {
"type" : "keyword"
},
"createTime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis"
},
"detailResult" : {
"type" : "nested",
"properties" : {
"label" : {
"type" : "keyword"
},
"score" : {
"type" : "long"
}
}
},
"keywords" : {
"type" : "keyword"
},
"label" : {
"type" : "keyword"
},
"reqChannel" : {
"type" : "integer"
},
"requestId" : {
"type" : "keyword"
},
"score" : {
"type" : "long"
},
"suggestion" : {
"type" : "keyword"
},
"type" : {
"type" : "integer"
},
"userId" : {
"type" : "long"
},
"nnNumber" : {
"type" : "long"
},
"nickName" : {
"type" : "text"
}
}
}
},
"index_patterns": ["image-audit*"],
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"index.lifecycle.name": "image_audit_ilm_policy",
"index.lifecycle.rollover_alias": "image-audit"
}
}
创建索引 指定别名
PUT image-audit-1 { "aliases": { "image-audit": { "is_write_index":true } } }
索引对应的Java实体
注意:这里 detailResult 字段类型为Field.Nest
@Data @Document(indexName = "text-audit", type = "text_audit_type", shards = 1, replicas = 0, createIndex = false) public class TextModerationEntity { @Id private Long dbId; /** * 用户Id */ @Field(type = FieldType.Long) private Long userId; /** * nn号 */ @Field(type = FieldType.Long) private Long nnNumber; /** * 昵称 */ @Field(type = FieldType.Text) private String nickName; /** * 策略类型 */ @Field(type = FieldType.Keyword) private String bizType; /** * 审核结果建议 */ @Field(type = FieldType.Keyword) private String suggestion; /** * 标签 */ @Field(type = FieldType.Keyword) private String label; /** * 当前标签下的置信度 */ @Field(type = FieldType.Long) private Long score; /** * SDK 请求ID */ @Field(type = FieldType.Keyword) private String requestId; /** * 审核内容 */ @Field(type = FieldType.Text) private String content; /** * 数据详情 */ @Field(type = FieldType.Nested) private List<DetailResultEntity> detailResult; /** * 关键词 */ @Field(type = FieldType.Keyword) private List<String> keywords; /** * 审核类型 */ @Field(type = FieldType.Integer) private Integer type; /** * 请求来源 */ @Field(type = FieldType.Integer) private Integer reqChannel; /** * 应用名称 */ @Field(type = FieldType.Keyword) private String appId; /** * 审核时间 */ @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; }
DetailResultEntity 实体类型
@Data @ApiModel(value = "二级标签信息") public class DetailResultEntity { @ApiModelProperty(value = "二级标签") @Field(type = FieldType.Keyword) private String label; @ApiModelProperty(value = "置信度") @Field(type = FieldType.Keyword) private Long score; }
查询语句
BoolQueryBuilder builder = QueryBuilders.boolQuery(); if (!StringUtils.isEmpty(request.getNickName())) { builder.filter(QueryBuilders.matchQuery("nickName", request.getNickName())); } if (!StringUtils.isEmpty(request.getRequestId())) { builder.filter(QueryBuilders.termQuery("requestId", request.getRequestId())); } if (!StringUtils.isEmpty(request.getContent())) { builder.filter(QueryBuilders.matchQuery("content", request.getContent())); } if (!StringUtils.isEmpty(request.getSuggestion())) { builder.filter(QueryBuilders.termQuery("suggestion", request.getSuggestion())); } if (!StringUtils.isEmpty(request.getLabel())) { builder.filter(QueryBuilders.termQuery("label", request.getLabel())); } if (!ObjectUtils.isEmpty(request.getTargetType())) { builder.filter(QueryBuilders.termQuery("type", request.getLabel())); } if (!ObjectUtils.isEmpty(request.getUIdOrNnNumber())) { BoolQueryBuilder nameBuilder = QueryBuilders.boolQuery(); nameBuilder.should(QueryBuilders.termQuery("userId", request.getUIdOrNnNumber())); nameBuilder.should(QueryBuilders.termQuery("nnNumber", request.getUIdOrNnNumber())); builder.filter(nameBuilder); } if (!StringUtils.isEmpty(request.getSubLabel())) { NestedQueryBuilder queryBuilder = QueryBuilders.nestedQuery("detailResult", QueryBuilders.termQuery("detailResult.label", request.getSubLabel()), ScoreMode.None); builder.filter(queryBuilder); } if (!ObjectUtils.isEmpty(request.getBeginTime()) || !ObjectUtils.isEmpty(request.getEndTime())) { RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("createTime"); if (!ObjectUtils.isEmpty(request.getBeginTime())) { rangeQueryBuilder.gt(DateUtil.beginOfDay(request.getBeginTime())); } if (!ObjectUtils.isEmpty(request.getEndTime())) { rangeQueryBuilder.lt(DateUtil.endOfDay(request.getEndTime())); } builder.filter(rangeQueryBuilder); } NativeSearchQuery queryBuilder = new NativeSearchQueryBuilder() .withQuery(builder) .withPageable(PageRequest.of(request.getPageNo() - 1, request.getPageSize())) .withSort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC)) .build(); log.info("==========>审核结果详情查询查询:{}", builder.toString());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言