Elasticsearch中的_source、_all、store、index

首先要明确一份数据在进入es中之后通常是如何存储的

原始文档数据在进入es中之后,es会将其存为两份,一部分是对其中的索引字段数据进行分词索引,然后存储所有的分词索引结果,这个结果并不一定是整个文档数据(通常都指定索引部分字段)。而另一份则是原始文档数据,而该文档的所有的分词索引都会指向该文档。

1. _source的作用

_source就是指源文档的存储,你可以理解为是es将你传输的原始文档数据放在了_source字段中存储,该设置是用来控制是否存储源文档数据的,如果将该设置设置为false,那就表示不会存储源文档的数据。会出现的问题就是导致查询的时候无法完整展示所有文档数据,只能看到索引中的数据。在检索数据时,最终检索结果实际上就是_source中的数据。

2._all的作用

与_source类似,_all也是一个字段,同样也是存储了完整的文档数据,但不同的是_all是一个超级字段。以图中的文档为例,如果开启_all字段,那么name+author+content会组成一个超级字段,这个字段包含了其他字段的所有内容,当然也可以设置只存储某几个字段到_all属性里面或者排除某些字段,该字段默认不会被存储,也就是说只会在进行分词索引时存在,分词索引结束后该字段就不会存在,如果要存储该字段,对_all字段开启store属性即可。

_all主要是在当检索内容无法确定是在哪个字段上的时候,比较适合开启该字段。

3.文档对象中设置字段的store属性作用

@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
public class Item {
    @Id
    private Long id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word", store = false)
    private String title; //标题

    @Field(type = FieldType.Keyword)
    private String category;// 分类

    @Field(type = FieldType.Keyword)
    private String brand; // 品牌

    @Field(type = FieldType.Double)
    private Double price; // 价格

    @Field(index = false, type = FieldType.Keyword)
    private String images; // 图片地址

    public Item() {
    }
    
}

store属性设置作用于文档中的某个字段之上,表示是否开启索引字段原数据存储,其实简单来理解就是将_source的范围缩小为某个属性字段,设置为true后,es会将该属性字段的原数据额外单独存储一份,即该字段的原数据会存储两份,一份是在原始文档,另一份则是单独该字段的存储。这也是为什么es的API中默认将该属性设为false,因为其与_source字段重复存储了同一部分数据。

_source和store两个设置任意为true都能够对字段实现高亮查询,因为高亮查询必须保证原字段数据的存储,才能进行高亮查询。

通常不建议开启该属性,store属性和_source字段两个设置同时开启会存储重复数据。而且当通过索引检索时,检索的结果中如果包含store属性字段,该store属性字段的内容不会从原始文档中读取,而是额外进行一次IO,读取该字段的单独存储的文档,所以会损失部分性能。

总结:

(1)_source和_all其实都是两个字段,只不过区别是_source是存储的结构化的原始文档,而_all是存储的是一个所有field字段拼接而成的字符串,两者是有区别的。

(2)store是作用于field(字段)上的属性,决定该field是否单独存储一份文档,该属性可以作用于_all字段上,但与_source字段重复。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值