详解Elasticsearch中 ‘store‘, ‘index‘ 属性和 ‘_all‘, ‘_source‘字段

本文深入探讨Elasticsearch中的关键概念,包括反向索引原理、字段存储(store)及索引(index)选项的设置方法,同时介绍了_source字段的作用及字段_all的功能与使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍Elasticsearch中容易混淆的几个属性和字段。理解ES需要理解反向索引,即内存中的数据结构(如hash或map),其中存储所有分词和文档引用(不是整个文档,仅是包含该分词的文档引用)。之所以称为反向索引,是因为分词作为key,文档ID是值。正常索引(非反向索引)使用文档ID作为key,分词作为它包含的值。

设置mapping中store选项

它用于控制是否单独往索引中增加每个字段。上面示例展示每个字段设置store属性。store默认被禁用,启用的字段存储在stored_fields字段中。

需要提醒的是,设置store为false(或其他任何值)不会改变事实————ES仍然存储整个原始文档至磁盘上,即能从_source字段中返回每个字段。
如果你确定仅需要返回一个字段,而不是整个文档,可以考虑禁用_source字段。

mapping中设置index选项

缺省情况下每个字段都需要分析,这意味着进行分析过程的每一步(如,字符过滤、分词、分词过滤),最后结果分词被加入至索引中。
对于字段是索引字段,则定义mapping时,可以设置index选项使得字段不被搜索(“false”),缺省是true。analyzer参数指定使用分析器,缺省为"analyzed"。即意味着使用默认分析器进行分析并生成反向索引。

对于index设置为false字段进行检索会报错:"Cannot search on field [content] since it is not indexed."。字符串类型不需要分词可以直接设置为keyword类型,相当于设置了"index": "not_analyzed"

_source 字段

通常字段在ES中存储了则能被返回(即作为搜索结果的一部分)。也就是说,如果字段被包括在_source,或store被显示设置为true
当在ES中插入文档时,原始文档(没有被分析或分词)被存储中特定字段_source中。我们可以禁用该功能(是否需要禁用是另一个问题)。
因为这涉及到整个文档,需要在索引级别进行配置。举例,如果有event索引,设置mapping禁用_source字段,即不让ES存储这个文档):

PUT my-index-000001
{
  "mappings": {
    "_source": {"enabled": false}, 
    "properties": {
      "title": {
        "type": "text",
        "store": true 
      },
      "date": {
        "type": "date",
        "store": true 
      },
      "content": {
        "type": "text",
        "store": true
      }
    }
  }
}

设置后你需要手动设置每个字段store选项为true,否则不能被返回。下面介绍store选项。需要提醒的是,禁用_source字段,则 update, update_by_query, reindex APIs,highlighting等功能不能使用。

字段 _all

字段 _all是一个特殊字段,包括文档中每个其他字段。对于想同时搜索所有字段非常方便。实际上,当你不指定字段时即搜索 _all字段。我们也可以禁用字段 _all

PUT my-index-000001
{
  "mappings": {
    "_source": {"enabled": false}, 
    "_all": {"enabled": true}, 
    "properties": {
      "title": {
        "type": "text",
        "store": true 
      }
  }
}

我们也可以指定字段是否被包括在_all字段中:

PUT my-index-000001
{
  "mappings": {
    "_source": {"enabled": false}, 
    "_all": {"enabled": true}, 
    "properties": {
      "title": {
        "type": "text",
        "store": true ,
        "include_in_all": false
      }
    }
  }
}

_all不包括该字段,对其查询需要使用match指明字段才能检索。

### Elasticsearch 数据类型的官方文档说明 Elasticsearch 提供了丰富的数据类型支持,这些数据类型用于定义字段的内容及其存储方式。以下是关于 Elasticsearch 数据类型的详细介绍: #### 1. **核心数据类型** Elasticsearch 的核心数据类型涵盖了常见的数值、文本布尔值等基本需求[^1]。 - `text`:适用于全文检索的字符串字段。此类型会对输入内容进行分词处理以便于后续查询操作。 - `keyword`:适合精确匹配的字符串字段,不会被分析器拆解为多个词条[^3]。 - `integer`, `long`, `float`, `double`:分别表示不同精度范围内的数字值[^4]。 - `boolean`:逻辑值 true/false 表示开关状态或其他二元选项[^2]。 #### 2. **日期与时间戳** 对于时间日期信息,Elasticsearch 使用专门设计的数据结构来优化索引效率并简化跨时区计算过程: - `date`:能够接受多种格式的时间表达形式,包括但不限于 ISO8601 标准以及 Unix 时间戳(单位可选秒或毫秒)。例如 `"2015-01-01"` 或者 `1420070400`(代表Unix epoch time)[^4]。 #### 3. **复杂对象映射** 当面对嵌套关系或者数组列表这样的高级场景时,则需要用到更复杂的映射机制: - `object`: 当某个字段本身又是一个 JSON 对象的时候适用该类型;它允许进一步定义子属性的具体配置项. - `nested`: 如果希望保持父子级联之间的一致性独立性则应该考虑采用 nested type 来代替普通的 object 类型因为后者会在扁平化过程中丢失部分关联特性. #### 示例代码展示如何创建带有不同类型字段的索引模板 ```json PUT my_index { "mappings": { "_doc": { "properties": { "name": {"type":"text"}, "age":{"type":"integer"}, "birthDate":{"type":"date","format":"yyyy-MM-dd||epoch_millis"} } } } } ``` 上述例子演示了一个简单的人员档案模型其中包含了姓名(name), 年龄(age),出生日期(birthDate)三个基本信息,并分别为它们设定了相应的数据类别。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值