Elasticsearch权威指南:类型与映射机制深度解析

Elasticsearch权威指南:类型与映射机制深度解析

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

理解Elasticsearch中的类型概念

在Elasticsearch中,类型(Type)代表一类相似的文档。每个类型由名称(如userblogpost)和映射(Mapping)组成。映射类似于数据库模式,它描述了该类型文档可能包含的字段或属性,每个字段的数据类型(如字符串、整数或日期),以及这些字段应如何被Lucene索引和存储。

类型作为抽象概念,对于划分相似但不完全相同的数据非常有用。但由于Lucene底层的工作机制,类型的使用也存在一些限制。

Lucene视角下的文档结构

从Lucene的角度来看,文档只是简单的字段-值对列表。每个字段至少需要一个值,但可以包含多个值。字符串值在分析过程中可能被转换为多个值。Lucene并不关心值是字符串、数字还是日期——所有值都被视为不透明的字节序列。

当我们在Lucene中索引文档时,每个字段的值会被添加到相应字段的倒排索引中。原始值也可以选择性地原样存储,以便后续检索。

Elasticsearch类型的实现机制

Elasticsearch的类型建立在这个简单基础之上。一个索引可以包含多个类型,这些类型的文档可以存储在同一索引中。

由于Lucene本身没有文档类型的概念,Elasticsearch通过元数据字段_type来存储每个文档的类型名称。当我们搜索特定类型的文档时,Elasticsearch只需在_type字段上应用过滤器来限制结果。

映射是Elasticsearch用来将复杂的JSON文档转换为Lucene期望的简单扁平文档的中间层。例如,user类型中name字段的映射可能声明该字段是字符串类型,并且在被索引到名为name的倒排索引之前,应该使用whitespace分析器进行分析。

类型使用中的陷阱与解决方案

一个有趣的问题是:如果两个不同类型中存在同名但映射不同的字段(例如一个是字符串类型,另一个是数字类型),会发生什么?

简短的回答是:这会导致问题,Elasticsearch根本不允许定义这样的映射,在尝试配置时会抛出异常。

深层原因是:每个Lucene索引包含所有字段的单一扁平模式。特定字段只能被映射为一种类型(字符串或数字),不能同时是两种类型。由于类型是Elasticsearch在Lucene之上添加的机制(通过元数据_type字段实现),Elasticsearch中的所有类型最终共享相同的映射。

例如,假设data索引中有两个类型peopletransactions,每个类型定义了两个字段。表面上看它们是独立的,但在底层,Lucene会创建一个单一的全局映射模式。这就是为什么两个类型不能定义冲突字段的原因——Lucene在扁平化映射时会无所适从。

类型使用的最佳实践

从技术上讲,只要字段不冲突(要么字段互斥,要么字段完全相同),多个类型可以共存于同一索引中。

但实际应用中,重要经验是:当需要区分同一集合中的不同片段时,类型非常有用。这些不同片段的数据"形状"应该相同或非常相似。

类型并不适合存储完全不同类型的数据。如果两种类型的字段集互斥,意味着索引中一半将包含"空"值(字段将变得稀疏),最终会导致性能问题。这种情况下,使用两个独立的索引是更好的选择。

总结最佳实践:

  • 推荐做法:在products索引中包含kitchenlawn-care类型,因为这两种类型本质上是相同的模式
  • 不推荐做法:在data索引中包含productslogs类型,因为这两种类型互斥。应该将它们分离到各自的索引中

理解这些底层机制将帮助您更好地设计Elasticsearch数据模型,避免性能问题,并充分利用Elasticsearch的强大功能。

elasticsearch-definitive-guide The Definitive Guide to Elasticsearch elasticsearch-definitive-guide 项目地址: https://gitcode.com/gh_mirrors/el/elasticsearch-definitive-guide

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

段琳惟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值