Elasticsearch权威指南:复杂核心字段类型解析

Elasticsearch权威指南:复杂核心字段类型解析

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

引言

在Elasticsearch中处理数据时,我们不仅会遇到简单的标量数据类型,还会遇到JSON中的复杂数据结构。本文将深入探讨Elasticsearch如何处理这些复杂核心字段类型,包括多值字段、空字段和多级对象等概念。

多值字段

基本概念

在实际应用中,我们经常需要处理包含多个值的字段。例如,一个文档可能有多个标签:

{ "tag": [ "search", "nosql" ]}

Elasticsearch对数组类型的处理非常直观,不需要特殊的映射配置。任何字段都可以包含零个、一个或多个值,这与全文字段被分析产生多个词项的方式类似。

重要特性

  1. 类型一致性:数组中的所有值必须是相同的数据类型。不能混合使用日期和字符串等不同类型。

  2. 类型推断:当通过索引数组创建新字段时,Elasticsearch会使用数组中第一个值的数据类型来确定新字段的类型。

  3. 排序特性

    • 从Elasticsearch获取文档时,数组会保持索引时的顺序
    • 但在索引过程中,数组被处理为无序的多值字段,这意味着在搜索时不能引用"第一个元素"或"最后一个元素"

空字段处理

空值表示

在Elasticsearch中,空字段可以通过多种方式表示:

"null_value": null,
"empty_array": [],
"array_with_null_value": [ null ]

这三种形式都会被Elasticsearch视为空字段,不会被索引。

底层实现

由于Lucene(Elasticsearch的底层库)无法直接存储null值,因此包含null值的字段被视为空字段。这与空数组的处理方式一致。

多级对象(内嵌对象)

对象结构

JSON对象(在其他语言中可能称为哈希、哈希映射、字典或关联数组)是Elasticsearch支持的另一种复杂数据类型。内嵌对象常用于将一个实体嵌入到另一个实体中。

示例结构:

{
    "tweet": "Elasticsearch is very flexible",
    "user": {
        "id": "@johnsmith",
        "name": {
            "full": "John Smith",
            "first": "John"
        }
    }
}

映射处理

Elasticsearch会自动检测新的对象字段,并将它们映射为object类型。每个内部字段都列在properties下:

{
  "properties": {
    "user": {
      "type": "object",
      "properties": {
        "id": { "type": "string" },
        "name": {
          "type": "object",
          "properties": {
            "full": { "type": "string" }
          }
        }
      }
    }
  }
}

根对象

type映射实际上是一种特殊的object映射,称为根对象。它与普通对象类似,但包含一些用于文档元数据的顶级字段,如_source_all字段。

内嵌对象的索引机制

扁平化处理

Lucene不理解内嵌对象的概念,它只能处理扁平的键值对列表。因此,Elasticsearch会将内嵌对象转换为以下形式:

{
    "tweet": [elasticsearch, flexible, very],
    "user.id": [@johnsmith],
    "user.name.full": [john, smith]
}

字段引用方式

内嵌字段可以通过以下方式引用:

  1. 直接使用字段名(如first
  2. 使用完整路径(如user.name.first
  3. 使用类型名加路径(如tweet.user.name.first

内嵌对象数组

处理方式

当处理包含内嵌对象的数组时,Elasticsearch会将其扁平化:

原始数据:

{
    "followers": [
        { "age": 35, "name": "Mary White"},
        { "age": 26, "name": "Alex Jones"}
    ]
}

索引表示:

{
    "followers.age": [26, 35],
    "followers.name": [alex, jones, mary, white]
}

局限性

这种扁平化处理会导致对象间的关联信息丢失:

  • 可以回答"是否有26岁的关注者?"
  • 但无法准确回答"是否有26岁且名叫Alex Jones的关注者?"

对于需要保持对象间关联的场景,Elasticsearch提供了**嵌套对象(nested objects)**的特殊处理方式,这将在后续章节中详细介绍。

总结

Elasticsearch通过智能的扁平化处理,使得复杂的JSON数据结构能够被高效地索引和搜索。理解这些复杂类型的处理机制对于设计高效的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
发出的红包

打赏作者

姬虹俪Humble

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

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

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

打赏作者

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

抵扣说明:

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

余额充值