Elasticsearch元数据
内容提要
本文介绍了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字段存储文档的原始值,默认开启,通常不建议关闭。