千家信息网

Elasticsearch中store field与non-store field的区别是什么

发表于:2024-09-23 作者:千家信息网编辑
千家信息网最后更新 2024年09月23日,这篇文章主要介绍"Elasticsearch中store field与non-store field的区别是什么",在日常操作中,相信很多人在Elasticsearch中store field与non
千家信息网最后更新 2024年09月23日Elasticsearch中store field与non-store field的区别是什么

这篇文章主要介绍"Elasticsearch中store field与non-store field的区别是什么",在日常操作中,相信很多人在Elasticsearch中store field与non-store field的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Elasticsearch中store field与non-store field的区别是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Elasticsearch中store field与non-store field的区别

在定义index的mapping的时候,我们可以指定某些fields是否要store(默认是不store)

那么他们有什么区别呢?

PUT /my_index{  "mappings": {    "my_type": {      "properties": {        "title": {          "type": "string",          "store": true         },        "date": {          "type": "date",          "store": true         },        "content": {          "type": "string"        }      }    }  }}

其实不管你将store设置为ture or false, elasticsearch都将为我们存储这些field, 不同的是:

  1. 当store为false时(默认配置),这些field只存储在"_source" field中。

  2. 当store为true时,这些field的value会存储在一个跟_source平级的独立的field中。同时也会存储在_source中,所以有两份拷贝。

那么什么情况下需要设置store field呢?一般情况有两种情况:

  • _source field在索引的mapping 中disable了。这种情况下,如果不将某个field定义成store=true,那些将无法在返回的查询结果中看到这个field.

  • _source的内容非常大。这时候如果我们想要在返回的_source document中解释出某个field的值的话,开销会很大(当然你也可以定义source filtering将减少network overhead),比例某个document中保存的是一本书,所以document中可能有这些field: title, date, content。假如我们只是想查询书的title 跟date信息,而不需要解释整个_source(非常大),这个时候我们可以考虑将title, date这些field设置成store=true。

  • 需要注意的是,看起来将field store可以减少查询的开销,但其实这样也会加大disk的访问频率。假如你将_source中的10个field都定义store,那么在你查询这些field的时候会将会有10次disk seek的操作。而返回_source只有一次disk seek的操作。所以这个也是我们在定义的时候需要blance的。


elasticsearch的store属性跟_source字段

众所周知_source字段存储的是索引的原始内容,那store属性的设置是为何呢?es为什么要把store的默认取值设置为no?设置为yes是否是重复的存储呢?

我们将一个field的值写入es中,要么是想在这个field上执行search操作(不知道具体的id),要么执行retrieve操作(根据id来检索)。但是,如果不显式的将该field的store属性设置为yes,同时_source字段enabled的情况下,你仍然可以获取到这个field的值。这就意味着在一些情况下让一个field不被index或者store仍然是有意义的。

当你将一个field的store属性设置为true,这个会在lucene层面处理。lucene是倒排索引,可以执行快速的全文检索,返回符合检索条件的文档id列表。在全文索引之外,lucene也提供了存储字段的值的特性,以支持提供id的查询(根据id得到原始信息)。通常我们在lucene层面存储的field的值是跟随search请求一起返回的(id+field的值)。es并不需要存储你想返回的每一个field的值,因为默认情况下每一个文档的的完整信息都已经存储了,因此可以跟随查询结构返回你想要的所有field值。

有一些情况下,显式的存储某些field的值是必须的:当_source被disabled的时候,或者你并不想从source中parser来得到field的值(即使这个过程是自动的)。请记住:从每一个stored field中获取值都需要一次磁盘io,如果想获取多个field的值,就需要多次磁盘io,但是,如果从_source中获取多个field的值,则只需要一次磁盘io,因为_source只是一个字段而已。所以在大多数情况下,从_source中获取是快速而高效的。

es中默认的设置_source是enable的,存储整个文档的值。这意味着在执行search操作的时候可以返回整个文档的信息。如果不想返回这个文档的完整信息,也可以指定要求返回的field,es会自动从_source中抽取出指定field的值返回(比如说highlighting的需求)。

你可以指定一些字段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是被压缩过的。

还有一种情形:reindex from some field,对某些字段重建索引的时候。从source中读取数据然后reindex,和从某些field中读取数据相比,显然后者代价更低一些。这些字段store设置为yes比较合适。

到此,关于"Elasticsearch中store field与non-store field的区别是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

存储 情况 字段 时候 属性 文档 查询 信息 索引 学习 意味 数据 磁盘 检索 原始 很大 代价 全文 内容 只是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 ip地址网络技术 上海外高桥英德网络技术 北京市中奥网络技术有限公司 银行需要哪些网络安全软硬件 增城网络安全建设价格是怎样的 阿里云服务器带宽买多大 温州第三方网络技术怎么样 凌云诺可以切换服务器吗 恒生银行软件开发 商业数据库硕士研究生解读 关于软件开发的法学论文 软件开发可以兼职 怎么做仿真动画软件开发 数据库索引是自动生成的吗 服务器电脑电源功率 网络安全教育相关的一幅绘画 电子商务网络技术题 服务器为啥ban线圈 怎样在手机上玩拔刀剑服务器 工伤认定数据库名称 dns服务器ip怎么用 手机应用 服务器 浙江北斗时钟监控网关服务器 数据库中字段的差怎么写 做网络技术需要多少电脑 软件开发 哪个语言工资最高 网络安全溯源的书籍 移动互联与软件开发方法 网络安全意识的主要文献 逾期一天报送金融数据库严重吗
0