有很多人会有这样的一个疑问:
_source字段存储的是索引的原始内容,那 store 属性的设置是为何呢?elasticsearch 为什么要把 store 的默认取值设置为 no?设置为 yes 是否是重复的存储呢?
我们将一个 field 的值写入 elasticsearch 中,是想在这个 field 上执行 search 操作。但是,如果不显式的将该 field 的 store 属性设置为yes,同时 _source 字段 enabled 的情况下,你仍然可以获取到这个 field 的值。这就意味着在一些情况下让一个 field 不被 index 或者 store 仍然是有意义的。当你将一个field的store属性设置为true,这个会在lucene层面处理。
elasticsearch 并不需要你单独存储需要返回的每一个 field 的值,因为默认情况下每一个文档的的完整信息都已经存储了(存储在_source字段中),因此可以跟随查询结果返回你想要的所有 field值。有一些情况下,显式的存储某些field的值是必须的:
> 当 _source 被 disabled 的时候,或者你并不想从 source 中 parser 来得到 field 的值(即使这个过程是自动的)
请记住:从每一个stored field中获取值都需要一次磁盘io,如果想获取多个field的值,就需要多次磁盘io,但是,如果从_source中获取多个field的值,则只需要一次磁盘io,因为_source只是一个字段而已。所以在大多数情况下,从_source中获取是快速而高效的。
elasticsearch 中默认的设置 _source 是 enable 的,存储整个文档的值。这意味着在执行 search 操作的时候可以返回整个文档的信息。如果不想返回这个文档的完整信息,也可以指定要求返回的 field,elasticsearch 会自动从 _source 中抽取出指定 field 的值返回。
你可以指定一些字段 store 为 true,这意味着这个field的数据将会被单独存储。这时候,如果你要求返回 field1(store:yes),es会分辨出 field1 已经被存储了,因此不会从 _source 中加载,而是从 field1 的存储块中加载。
哪些情形下需要显式的指定store属性呢?
大多数情况并不是必须的。从 _source 中获取值是快速而且高效的。如果你的文档长度很长,存储 _source 或者从 _source 中获取 field 的代价很大,你可以显式的将某些 field 的 store 属性设置为 yes。
优点是只查询这一个字段的值的话效率高;
缺点如上边所说:假设你存储了10个 field,而如果想获取这10个 field的值,则需要多次的 io,
如果从_source中获取则只需要一次,而且_source是被压缩过的。
总结:
如果对某个 field 做了索引,则可以查询。如果 store:yes,则可以展示该field的值。
但是如果你存储了这个doc的数据(_source enable),即使 store 为 no,仍然可以得到field的值(client去解析)。
所以一个store设置为 no 的 field,如果 _source 被 disable,则只能检索不能展示。