默认情况下,对字段值进行索引以使其可搜索,但不存储它们 (store)。 这意味着可以查询该字段,但是无法检索原始字段值。在这里我们必须理解的一点是: 如果一个字段的mapping中含有store属性为true,那么有一个单独的存储空间为这个字段做存储,而且这个存储是独立于_source的存储的。它具有更快的查询。存储该字段会占用磁盘空间。如果需要从文档中提取(即在脚本中和聚合),它会帮助减少计算。在聚合时,具有store属性的字段会比不具有这个属性的字段快。 此选项的可能值为false和true。

通常这无关紧要。 该字段值已经是_source字段的一部分,默认情况下已存储。 如果您只想检索单个字段或几个字段的值,而不是整个_source的值,则可以使用source filtering来实现。

在某些情况下,存储字段可能很有意义。 例如,如果您有一个带有标题,日期和很大的内容字段的文档,则可能只想检索标题和日期,而不必从较大的_source字段中提取这些字段。

接下来我们还是通过一个具体的例子来解释这个,虽然上面的描述有点绕口。

首先我们来创建一个叫做my_index的索引:

  1. PUT my_index
  2. {
  3. "mappings": {
  4. "properties": {
  5. "title": {
  6. "type": "text",
  7. "store": true
  8. },
  9. "date": {
  10. "type": "date",
  11. "store": true
  12. },
  13. "content": {
  14. "type": "text"
  15. }
  16. }
  17. }
  18. }

在上面的mapping中,我们把title及date字段里的store属性设置为true,表明有一个单独的index fragement是为它们而配备的,并存储它们的值。我们来写入一个文档到my_index索引中:

  1. PUT my_index/_doc/1
  2. {
  3. "title": "Some short title",
  4. "date": "2015-01-01",
  5. "content": "A very long content field..."
  6. }

接下来,我们来做一个搜索:

  1. GET my_index/_search

显示的结果是:

  1. "hits" : {
  2. "total" : {
  3. "value" : 1,
  4. "relation" : "eq"
  5. },
  6. "max_score" : 1.0,
  7. "hits" : [
  8. {
  9. "_index" : "my_index",
  10. "_type" : "_doc",
  11. "_id" : "1",
  12. "_score" : 1.0,
  13. "_source" : {
  14. "title" : "Some short title",
  15. "date" : "2015-01-01",
  16. "content" : "A very long content field..."
  17. }
  18. }
  19. ]
  20. }

在上面我们可以在_source中看到这个文档的title,date及content字段。

我们可以通过source filtering的方法提前我们想要的字段:

  1. GET my_index/_search
  2. {
  3. "_source": ["title", "date"]
  4. }

显示的结果是:

  1. "hits" : {
  2. "total" : {
  3. "value" : 1,
  4. "relation" : "eq"
  5. },
  6. "max_score" : 1.0,
  7. "hits" : [
  8. {
  9. "_index" : "my_index",
  10. "_type" : "_doc",
  11. "_id" : "1",
  12. "_score" : 1.0,
  13. "_source" : {
  14. "date" : "2015-01-01",
  15. "title" : "Some short title"
  16. }
  17. }
  18. ]
  19. }

显然上面的结果显示我们想要的字段date及title是可以从_source里获取的。

我们也可以通过如下的方法来获取这两个字段的值:

  1. GET my_index/_search
  2. {
  3. "stored_fields": [
  4. "title",
  5. "date"
  6. ]
  7. }

返回的结果是:

  1. "hits" : {
  2. "total" : {
  3. "value" : 1,
  4. "relation" : "eq"
  5. },
  6. "max_score" : 1.0,
  7. "hits" : [
  8. {
  9. "_index" : "my_index",
  10. "_type" : "_doc",
  11. "_id" : "1",
  12. "_score" : 1.0,
  13. "fields" : {
  14. "date" : [
  15. "2015-01-01T00:00:00.000Z"
  16. ],
  17. "title" : [
  18. "Some short title"
  19. ]
  20. }
  21. }
  22. ]
  23. }

在上面,我们可以看出来在fields里有一个date及title的数组返回查询的结果。

也许我们很多人想知道到底这个store到底有什么用途呢?如果都能从_source里得到字段的值。

有一种就是我们在开头我们已经说明的情况:我们有时候并不想存下所有的字段在_source里,因为该字段的内容很大,或者我们根本就不想存_source,但是有些字段,我们还是想要获取它们的内容。那么在这种情况下,我们就可以使用store来实现。

我们还是用一个例子来说明。首先创建一个叫做my_index1的索引:

  1. PUT my_index1
  2. {
  3. "mappings": {
  4. "_source": {
  5. "enabled": false
  6. },
  7. "properties": {
  8. "title": {
  9. "type": "text",
  10. "store": true
  11. },
  12. "date": {
  13. "type": "date",
  14. "store": true
  15. },
  16. "content": {
  17. "type": "text",
  18. "store": false
  19. }
  20. }
  21. }
  22. }

因为我们认为content字段的内容可能会很大,那么我不想存这个字段。在上面,我们也把_source的enabled开关设置为false,表明将不存储任何的source字段。接下来写入一个文档到my_index1里去:

  1. PUT my_index1/_doc/1
  2. {
  3. "title": "Some short title",
  4. "date": "2015-01-01",
  5. "content": "A very long content field..."
  6. }

同样我们来做一个搜索:

  1. GET my_index1/_search
  2. {
  3. "query": {
  4. "match": {
  5. "content": "content"
  6. }
  7. }
  8. }

我们可以看到搜索的结果:

  1. "hits" : {
  2. "total" : {
  3. "value" : 1,
  4. "relation" : "eq"
  5. },
  6. "max_score" : 0.2876821,
  7. "hits" : [
  8. {
  9. "_index" : "my_index1",
  10. "_type" : "_doc",
  11. "_id" : "1",
  12. "_score" : 0.2876821
  13. }
  14. ]
  15. }

在这次的显示中,我们没有看到_source字段,这是因为我们已经把它给disabled了。但是我们可以通过如下的方法来获取那些store 字段:

  1. GET my_index1/_search
  2. {
  3. "stored_fields": [
  4. "title",
  5. "date"
  6. ],
  7. "query": {
  8. "match": {
  9. "content": "content"
  10. }
  11. }
  12. }

返回结果是:

  1. "hits" : {
  2. "total" : {
  3. "value" : 1,
  4. "relation" : "eq"
  5. },
  6. "max_score" : 0.2876821,
  7. "hits" : [
  8. {
  9. "_index" : "my_index1",
  10. "_type" : "_doc",
  11. "_id" : "1",
  12. "_score" : 0.2876821,
  13. "fields" : {
  14. "date" : [
  15. "2015-01-01T00:00:00.000Z"
  16. ],
  17. "title" : [
  18. "Some short title"
  19. ]
  20. }
  21. }
  22. ]
  23. }

我们可以在返回结果里查看到date及title的值。

可以合理地存储字段的另一种情况是,对于那些未出现在_source字段(例如copy_to字段)中的字段。您可以参阅我的另外一篇文章“如何使用Elasticsearch中的copy_to来提高搜索效率”。

如果你想了解更多关于Elasticsearch的存储,可以阅读文章“Elasticsearch:inverted index,doc_values及source”。

参考:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-store.html
  2. https://stackoverflow.com/questions/17103047/why-do-i-need-storeyes-in-elasticsearch

版权声明:本文为CSDN博主「Elastic 中国社区官方博客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/UbuntuTouch/article/details/103810863

Elasticsearch 理解mapping中的store属性的更多相关文章

  1. 深入理解css中的margin属性

    深入理解css中的margin属性 之前我一直认为margin属性是一个非常简单的属性,但是最近做项目时遇到了一些问题,才发现margin属性还是有一些“坑”的,下面我会介绍margin的基本知识以及 ...

  2. 【JVM虚拟机】(8)--深入理解Class中--方法、属性表集合

    #[JVM虚拟机](8)--深入理解Class中--方法.属性表集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机] ...

  3. IL角度理解C#中字段,属性与方法的区别

    IL角度理解C#中字段,属性与方法的区别 1.字段,属性与方法的区别 字段的本质是变量,直接在类或者结构体中声明.类或者结构体中会有实例字段,静态字段等(静态字段可实现内存共享功能,比如数学上的pi就 ...

  4. 理解css中的position属性

    理解css中的position 两种类型的定位 static类型:只有一个值position: static.position默认值 relative类型:包括三个值,这三个值会相互影响,允许你以特定 ...

  5. 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承

    ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...

  6. Elasticsearch:理解 mapping 中的 null_value

    转载自:https://elasticstack.blog.csdn.net/article/details/114266732 null 不能被索引或搜索. 当字段设置为 null(或空数组或 所有 ...

  7. 理解 NgModelController 中相关方法和属性

    1. 理解$formatters和$parsers方法 angular的双向绑定可以实现view和model中的值自动同步,但有时候我们不想让用户输入的(view值)和发送给后台的(model值)并不 ...

  8. 理解display中的box-flex属性

    今天有个同学在面试的时候碰到了使用css2和css3实现一种页面布局,要求页面效果如下: 在实现这种页面布局时,他使用了display:box-flex,下面是相应的代码: css2 方式 <! ...

  9. 怎样理解 Vue 中的计算属性 computed 和 methods ?

    需求: 在 Vue 中, 我们可以像下面这样通过在 引号 或 双花括号 内写 js 表达式去做一些简单运算, 这是可以的, 不过这样写是不直观的, 而且在 html 中 夹杂 一些运算逻辑这种做法其实 ...

随机推荐

  1. DRF (学习第一部)

    目录 Web应用模式 API接口 RESTful API 规范 序列化 Django Rest_Framework 环境安装预与配置 序列化器 -Serializer Web应用模式 在开发web应用 ...

  2. Spring Boot学习笔记(二)——HelloWorld实现

    提示:要在Eclipse里使用Spring Boot,首先要安装STS插件,前面我们已经安装了STS插件了,可以创建Spring Boot项目了. 1.创建项目: 新建项目,选择Spring Boot ...

  3. VMware Workstation Pro 虚拟机安装CentOS-7

    一.下载CentOS-7镜像 我是通过阿里开源镜像站下载的, 下载url:https://mirrors.aliyun.com/centos/7/isos/x86_64/ 下载CentOS-7-x86 ...

  4. SpringBoot+HikariCP+Dropwizard-Metrics统计连接池使用情况

    SpringBoot+HikariCP+Dropwizard-Metrics统计连接池使用情况 背景,HikariCP是Java目前使用最广的连接池工具类,SpringBoot默认也是用这个,现在想获 ...

  5. requests 库和beautifulsoup库

    python 爬虫和解析 库的安装:pip install requests; pip install beautifulsoup4 requests 的几个常用方法: requests.reques ...

  6. ABAP-字符串常用处理方法

    字符串处理 SPLIT dobj AT sep INTO { {result1 result2 ...} | {TABLE result_tab} } 必须指定足够目标字段.否则,用字段dobj的剩余 ...

  7. java安全编码指南之:序列化Serialization

    目录 简介 序列化简介 注意serialVersionUID writeObject和readObject readResolve和writeReplace 不要序列化内部类 如果类中有自定义变量,那 ...

  8. STM32入门系列-使用C语言封装寄存器

    前面文章介绍了存储器映射.寄存器和寄存器映射,这些都是为了介绍使用 C语言封装寄存器做铺垫.这里我们通过一个实例来对 C 语言封装寄存器进行介绍. 具体实例:控制 GPIOC 端口的第 0 管脚输出一 ...

  9. python使用zlib库压缩图片,使用ffmpeg压缩视频

    python压缩图片.视频 图片压缩使用zlib库 视频压缩使用工具ffmpeg # ffmpeg -i 1.mp4 -r 10 -pix_fmt yuv420p -vcodec libx264 -p ...

  10. eyou去版权

    公司老板要求做一个自己门户网站,苦于公司自己又没有开发相应的cms内容管理系统,找了一个星期,综合各方面的考虑,决定选择eyoucms来搭建,经过快速安装,来到了简单干净的后台. 现将使用体会记录如下 ...