首先在用法上的区别,@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,敬请期待!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐