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

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

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

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

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

PUT my_index
{
"mappings": {
"properties": {
"title": {
"type": "text",
"store": true
},
"date": {
"type": "date",
"store": true
},
"content": {
"type": "text"
}
}
}
}

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

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

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

GET my_index/_search

显示的结果是:

  "hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "Some short title",
"date" : "2015-01-01",
"content" : "A very long content field..."
}
}
]
}

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

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

GET my_index/_search
{
"_source": ["title", "date"]
}

显示的结果是:

  "hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"date" : "2015-01-01",
"title" : "Some short title"
}
}
]
}

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

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

GET my_index/_search
{
"stored_fields": [
"title",
"date"
]
}

返回的结果是:

  "hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"fields" : {
"date" : [
"2015-01-01T00:00:00.000Z"
],
"title" : [
"Some short title"
]
}
}
]
}

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

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

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

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

PUT my_index1
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"title": {
"type": "text",
"store": true
},
"date": {
"type": "date",
"store": true
},
"content": {
"type": "text",
"store": false
}
}
}
}

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

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

同样我们来做一个搜索:

GET my_index1/_search
{
"query": {
"match": {
"content": "content"
}
}
}

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

  "hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "my_index1",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821
}
]
}

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

GET my_index1/_search
{
"stored_fields": [
"title",
"date"
],
"query": {
"match": {
"content": "content"
}
}
}

返回结果是:

  "hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "my_index1",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"fields" : {
"date" : [
"2015-01-01T00:00:00.000Z"
],
"title" : [
"Some short title"
]
}
}
]
}

我们可以在返回结果里查看到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. vue-router入门随笔

    下面整理根据官方文档以及自我理解整理,如有不足,请指教. 下面是来自一段官方的原话. Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得 ...

  2. springboot配置定时任务并发执行

    @Configuration public class ScheduleConfig implements SchedulingConfigurer { @Override public void c ...

  3. APP后台架构开发实践笔记

    1 App后台入门 1.1 App后台的功能 (1)远程存储数据: (2)消息中转. 1.2 App后台架构 架构设计的流程 (1) 根据App的设计,梳理出App的业务流程: (2) 把每个业务流程 ...

  4. D. Kilani and the Game 解析(裸BFS、實作)

    Codeforce 1105 D. Kilani and the Game 解析(裸BFS.實作) 今天我們來看看CF1105D 題目連結 題目 給一個\(n\times m\)的地圖,地圖上有幾種格 ...

  5. MIPS学习笔记(一)

    写在前面 本文是根据"MIPS Assembly Language Programming CS50 Discussion and Project Book. Daniel J. Ellar ...

  6. Route53导出解析记录

    使用AWS CLI来进行导出 可以参考AWS的官方文档 安装AWS CLI 官方安装aws cli文档 curl "https://awscli.amazonaws.com/awscli-e ...

  7. openssl ec/ecparam/errstr/ripemd160/camellia-128-ecb/camellia-192-cbc/camellia-192-ecb3条指令及1个哈希算法3个加密算法的学习

    ecparam ecparam指令通过用椭圆曲线加密方式,生成ec密钥,可以指定参数 openssl ecparam [-inform DER|PEM] [-outform DER|PEM] [-in ...

  8. Dubbo 迈出云原生重要一步 - 应用级服务发现解析

    作者 | 刘军(陆龟)  Apache Dubbo PMC 概述 社区版本 Dubbo 从 2.7.5 版本开始,新引入了一种基于实例(应用)粒度的服务发现机制,这是我们为 Dubbo 适配云原生基础 ...

  9. 4、Django之视图层

    一 视图函数 视图函数,简称视图,属于Django的视图层,默认定义在views.py文件中,是用来处理web请求信息以及返回响应信息的函数,所以研究视图函数只需熟练掌握两个对象即可:请求对象(Htt ...

  10. bert做阅读理解的一个细节

    如上图所示,展示了如何用BERT来做信息抽取任务的结构图.注意一下几点即可: 1.将Question和Paragraph分别作为BERT的text1和text2输入. 2.start/end span ...