Elasticsearch元数据

💡 原文中文,约5400字,阅读约需13分钟。
📝

内容提要

本文介绍了Elasticsearch中的元数据字段,包括_all、_field_names、_id和_index等。_all字段用于搜索包含特定关键字的文档,_field_names存储非空字段名,_id用于唯一标识文档,_index支持多索引查询。此外,还讨论了父子文档关系、路由参数和_source字段的使用。

🔎

延伸解读

元数据字段的查询能力差异

文章指出,不同元数据字段支持的查询类型不同。例如,_id可用于term、terms、match等查询,但不能用于聚合、脚本和排序;_index支持term、terms查询及聚合、排序和脚本,但不支持prefix、wildcard、regexp和fuzzy查询。_type和_uid则支持查询、聚合、脚本和排序。了解这些差异有助于避免在查询设计时误用字段。

_all字段的替代与自定义

虽然_all字段能实现全字段搜索,但文章也介绍了使用copy_to自定义_all字段的方法。通过将多个字段复制到自定义字段(如full_content),可以更灵活地控制哪些字段参与全字段搜索,避免不必要的字段被索引,从而优化性能和存储。

_source字段的关闭风险

文章强调,_source字段默认开启,存储文档原始值。关闭_source虽然可以节省存储空间,但会导致无法使用update、update_by_query、reindex、高亮、数据备份、改变mapping、升级索引以及通过原始字段debug查询或聚合等功能。因此,除非明确不需要这些操作,否则不建议关闭。

路由参数对分片的影响

通过_routing参数可以自定义文档的路由,影响文档存储到哪个分片。默认路由值是文档的_id或_parent。文章示例中,将同一用户的博客指定相同routing,可确保它们存储在同一分片,提高查询效率。此外,还可以在mapping中设置_routing为必须,强制索引时提供路由值。

❓

Q&A

_all字段在Elasticsearch中有什么作用?

_all字段用于搜索包含特定关键字的文档,所有字段用空格分开,但不存储。

_field_names字段的用途是什么?

_field_names字段存储文档中的所有非空字段名,常用于exists查询。

如何使用_routing参数自定义文档的路由?

通过_routing参数可以设置自定义路由,影响文档的分片。

_id字段在Elasticsearch中有什么限制?

_id字段可以用于多种查询,但不能用于聚合、脚本和排序。

_index字段的作用是什么?

_index字段支持多索引查询,可以对索引名进行查询、聚合和排序,但不支持某些查询类型。

_source字段的默认设置是什么?

_source字段存储文档的原始值,默认开启,通常不建议关闭。

🏷️

标签

➡️

继续阅读