Elasticsearch三大属性详解:enabled、index与store
好的,我们来分别解释 Elasticsearch 中 enabled
、index
和 store
这三个属性的功能:
这三个属性都是在定义映射(Mapping)时,用于控制 Elasticsearch 如何处理某个字段或对象的。
-
enabled
- 功能: 控制 Elasticsearch 是否对该字段或对象的内容进行处理(解析、索引、存储)。
- 取值:
true
(默认) 或false
。 - 应用对象:
- 字段 (Field): 如果对某个字段设置
enabled: false
,那么:- 该字段的值不会被解析(例如,不会被分词)。
- 该字段的值不会被索引,意味着你无法对该字段进行搜索或聚合。
- 该字段的值仍然会存储在
_source
中,因此当你获取整个文档时,可以看到这个字段的值。它的主要作用是保留原始数据而不让其参与搜索。
- **对象(Object) 或 嵌套对象(Nested): **(更常见且主要用途) 如果对一个 Object 类型的字段设置
enabled: false
,那么:- ES 不会解析该对象内部的结构。它不会识别或处理该对象内部的任何嵌套字段。
- 该对象的整个内容被视为一个不透明的、单一的、未被索引的字段值(就像一个
"raw"
字符串)。 - 该对象的整个 JSON 结构会原样存储在
_source
中。 - 无法搜索或聚合该对象内部的任何字段。
- 字段 (Field): 如果对某个字段设置
- 典型场景:
- 存储不希望被搜索或分析的原始数据块(如第三方返回的整个 JSON payload)。
- 存储二进制数据 (
binary
类型字段默认enabled: false
)。 - 临时禁用某个对象内部的复杂结构,避免映射冲突或节省处理开销。
-
index
- 功能: 控制字段的值是否应被索引。
- 取值:
true
(默认) 或false
。 - 应用对象: 单个字段。
- 作用:
index: true
(默认):该字段的值会被处理(根据类型和分析器)并添加到倒排索引中。这使得你可以对该字段进行搜索、过滤和聚合。这是绝大多数需要被查询字段的设置。index: false
:该字段的值不会被添加到倒排索引中。- 你无法对该字段进行搜索(全文、精确值)、排序或聚合(基于字段值)。
- 字段值仍然会存储在
_source
中,因此当你获取整个文档时,可以看到这个字段的值。 doc_values
属性(如果适用)可能不受影响,但通常index: false
的字段如果不需要聚合或排序,也会设置doc_values: false
。
- 典型场景:
- 存储仅用于展示、不需要搜索或聚合的字段(例如文章的 HTML 内容副本,你只需要在搜索结果中展示它,但搜索是基于另一个被索引的纯文本字段进行的)。
- 存储敏感信息(如信用卡号),防止意外通过搜索暴露(但请注意,存储在
_source
中就存在暴露风险,安全措施需要更全面)。 - 节省索引开销和存储空间(对于确定永远不会查询的大字段)。
-
store
- 功能: 控制字段的值是否在
_source
之外被额外单独存储一份。 - 取值:
true
或false
(默认)。 - 应用对象: 单个字段。
- 作用:
store: false
(默认):字段的值仅存储在_source
字段中。当你需要某个字段的值时,ES 必须先获取整个文档的_source
,然后从中解析出所需的字段。store: true
:字段的值不仅存储在_source
中,还会在索引中单独存储一份。- 这允许你使用
stored_fields
参数在查询时高效地只检索这个特定字段的值,而无需解析整个(可能很大的)_source
。 - 注意:这个设置
不影响索引
!它与字段是否能被搜索无关。 它只影响该字段值是否可以被独立高效地获取。 - 即使
store: true
,字段仍然需要被索引(index: true
)才能被搜索。
- 这允许你使用
- 典型场景:
- 文档非常大(
_source
很大),但你只需要频繁访问其中几个小字段(如标题、摘要)。 - 使用
copy_to
合并的字段,你想单独获取合并后的值而不解析整个_source
。 - 需要在搜索结果中高亮显示 (
highlighting
) 某个字段,且该字段使用了不同于映射定义的分析器(此时 ES 可能需要访问原始存储值)。
- 文档非常大(
- 重要区别:
store
控制的是值的独立存储位置,而enabled/index
控制的是是否处理/索引该值。_source
是存储整个原始文档 JSON 的地方。
- 功能: 控制字段的值是否在
总结对比表:
属性 | 作用核心 | 默认值 | 影响搜索/聚合? | 值是否在 _source 中? | 值是否单独存储? | 主要应用对象 |
---|---|---|---|---|---|---|
enabled | 是否处理(解析/索引)内容 | true | 是 (禁用则完全不可) | 是 (Object/字段都在) | 否 | 字段或对象 |
index | 是否索引值(构建倒排索引) | true | 是 (禁用则不可搜索) | 是 | 否 | 字段 |
store | 是否在 _source 外单独存储值 | false | 否 | 是 | 是 (当为 true) | 字段 |
简单关系举例:
- 一个字段要想被搜索:
enabled: true
(如果应用于字段本身) 且index: true
是必须的。store
的值不影响是否可搜索。 - 一个字段设置了
enabled: false
(或index: false
),它通常也会设置store: false
,因为没有索引意义再去单独存储它(但值仍在_source
里)。 - 一个字段设置了
index: false
且store: true
是可能的:你不能搜索它,但你能高效地单独获取它的原始值(例如,一个大文档里的一个标题字段,只用于展示不用于搜索)。 - 一个对象设置了
enabled: false
:它内部的任何字段设置(包括index
和store
)都无效,整个对象被当作一个不透明的值处理。
理解这三个属性的区别对于优化 Elasticsearch 的映射设计、存储效率和查询性能至关重要。