【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());
复制代码

 

 


posted @   听风是雨  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
/* 看板娘 */
点击右上角即可分享
微信分享提示