spring-data-elasticsearch (elasticsearch 6.8.0) @Document 和 @Field 注解详解
首先在用法上的区别,@Document 一般用在类上,引起其他类。而@Field 注解一般用在参数上,比如定义一个es操作的VO:1、创建 ArticleEsDtoimport java.io.Serializable;import java.util.Date;import lombok.Data;import lombok.ToString;import org.springframework
首先在用法上的区别,@Document 一般用在类上,引起其他类。而 @Field 注解一般用在参数上,比如定义一个es操作的VO:
1、创建 ArticleEsDto
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
* @author nandao 2021/7/27
*/
@Data
@Document(indexName = "#{esAttribute.indexArticleType}", type = "#{esAttribute.indexArticleType}")
@ToString
public class ArticleEsDto implements Serializable {
private static final long serialVersionUID = 7118858963867439527L;
/**
* es id
*/
@Id
private String id;
/**
* 原始ID
*/
@Field(type = FieldType.Long)
private Long jid;
/**
* 文章ID
*/
@Field(type = FieldType.Long)
private Long articleId;
/**
* 文章标题
*/
@Field(type = FieldType.Text)
private String title;
/**
* 内容
*/
@ToString.Exclude
@Field(type = FieldType.Text)
private String content;
/**
* 摘要
*/
@ToString.Exclude
@Field(type = FieldType.Text)
private String summary;
/**
* 列表图
*/
@Field(type = FieldType.Text)
private String listPicturePath;
/**
* 文章来源
*/
@Field(type = FieldType.Text)
private String source;
/**
* 发布时间
*/
@Field(type = FieldType.Long)
private Date publishTime;
}
2、分析:@Document注解:
@Document(indexName = "#{esAttribute.indexArticleType}", type = "#{esAttribute.indexArticleType}")
2.1、点开@Document 进入:
@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
String indexName();//索引库的名称,个人建议以项目的名称命名
String type() default "";//类型,个人建议以实体的名称命名
boolean useServerConfiguration() default false;
short shards() default 5;//默认分区数
short replicas() default 1;//每个分区默认的备份数
String refreshInterval() default "1s";//刷新间隔
String indexStoreType() default "fs";//索引文件存储类型
boolean createIndex() default true;//创建新数据接口
VersionType versionType() default VersionType.EXTERNAL;//版本类型参数
}
2.2、esAttribute.indexArticleType 指一个类中的参数:
import lombok.Data;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author nandao
* @version 1.0
* @description 初始化索引配置
* @date 2021/07/27
**/
@Component
@Data
@ToString
public class EsAttribute {
/**
* 文章索引名字
*/
@Value("${spring.data.index.articleType}")//对应配置文件中的articleType
private String indexArticleType;
}
3、@Field注解分析,点击进入:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {
FieldType type() default FieldType.Auto; //自动检测属性的类型,可以根据实际情况自己设置
FieldIndex index() default FieldIndex.analyzed; //默认情况下分词,一般默认分词就好,除非这个字段你确定查询时不会用到
DateFormat format() default DateFormat.none; //时间类型的格式化
String pattern() default "";
boolean store() default false; //默认情况下不存储原文
boolean fielddata() default false;
String searchAnalyzer() default "";//指定字段搜索时使用的分词器
String analyzer() default "";
String normalizer() default "";
String[] ignoreFields() default {};//如果某个字段需要被忽略
boolean includeInParent() default false;
String[] copyTo() default {};
}
3.1、FieldType类型有多种:
@Field(type = FieldType.Text)
@Field(type = FieldType.Long)
点击进入该枚举类:
public enum FieldType {
Text,
Integer,
Long,
Date,
Float,
Double,
Boolean,
Object,
Auto,
Nested,
Ip,
Attachment,
Keyword
}
Text类型:索引全文字段,如电子邮件正文的描述或者产品描述。这些字段被分析器将字符串转换为单个术语列表。分析过程允许es在每个的全文域中搜索单个单词。文本字段不用于排序,也很少用于聚合。
Object类型:Json文档本质上是分层的,文档可能包含内部对象,而这些对象又可能包含内部对象本身。
Nested类型:嵌套类型是对象数据类型的一个专门的版本,他允许对象数组以一种彼此独立查询的方式进行索引。
Ip类型:ip字段可以索引和存储IPV4和IPv6地址。
Keyword类型:用于索引结构化内容(如电子邮件地址,主机名,状态码,邮政编码等)的字段。他们通常用于过滤、排序、聚合。关键字字段只能根据期确切的值进行搜索。
到此,这两个索引分析完毕,下篇我们从Kibana的角度分析es,敬请期待!
更多推荐
所有评论(0)