深入理解Elasticsearch中的嵌套对象

Elasticsearch(简称ES)是一个基于Lucene的搜索引擎,它提供了全文搜索功能,而且也支持结构化数据的存储和查询。在ES中,嵌套对象(nested object)是一种特殊的数据结构,允许我们将多个文档存储在单个父文档中。这在处理具有复杂关系的数据时非常有用,例如订单和其包含的商品。

案例介绍

在这个案例中,我们将创建一个名为order-nested的索引,用于存储订单信息。每个订单包含一个或多个商品,这些商品以嵌套对象的形式存储在订单文档中。

创建索引和映射

首先,我们需要定义索引的映射,以指定每个字段的数据类型。特别是goods字段,我们将使用nested类型来定义它。

json 复制代码
PUT order-nested
{
  "mappings": {
    "properties": {
      "orderid": {
        "type": "integer"
      },
      "buyer": {
        "type": "keyword"
      },
      "order_time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      },
      "goods": {
        "type": "nested",
        "properties": {
          "goodsid": {
            "type": "integer"
          },
          "goods_name": {
            "type": "keyword"
          },
          "price": {
            "type": "double"
          },
          "produce_time": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
          }
        }
      }
    }
  }
}

添加文档

接下来,我们添加一个订单文档,包含两个商品。

json 复制代码
PUT order-nested/_doc/1
{
  "orderid": "1",
  "buyer": "tom",
  "order_time": "2020-11-04 00:00:00",
  "goods": [
    {
      "goodsid": "1",
      "goods_name": "milk",
      "price": 5.2,
      "produce_time": "2020-10-04 00:00:00"
    },
    {
      "goodsid": "2",
      "goods_name": "juice",
      "price": 8.2,
      "produce_time": "2020-10-12 00:00:00"
    }
  ]
}

更新文档

我们可以使用更新API来向订单中添加更多的商品。

json 复制代码
POST order-nested/_update/1
{
  "doc": {
    "goods": [
      {
        "goodsid": "3",
        "goods_name": "apple",
        "price": 18.2,
        "produce_time": "2020-10-05 00:00:00"
      }
    ]
  }
}

搜索和查询

使用嵌套查询,我们可以针对嵌套对象进行搜索。例如,我们可以找到所有包含特定商品名称和生产日期的订单。

json 复制代码
POST order-nested/_search
{
  "query": {
    "nested": {
      "path": "goods",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "goods.goods_name": "juice"
              }
            },
            {
              "match": {
                "goods.produce_time": "2020-10-04 00:00:00"
              }
            }
          ]
        }
      }
    }
  }
}

我们还可以在搜索结果中高亮显示匹配的嵌套字段。

json 复制代码
POST order-nested/_search
{
  "query": {
    "nested": {
      "path": "goods",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "goods.goods_name": "milk"
              }
            }
          ]
        }
      },
      "inner_hits": {
        "highlight": {
          "fields": {
            "*": {}
          }
        }
      }
    }
  }
}

排序和聚合

除了搜索,我们还可以对嵌套对象进行排序和聚合。例如,我们可以按照商品价格降序排序所有订单。

json 复制代码
POST order-nested/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "goods.price": {
        "order": "desc",
        "nested": {
          "path": "goods"
        },
        "mode": "sum"
      }
    }
  ]
}

或者,我们可以对商品名称进行聚合,以查看哪些商品名称最常见。

json 复制代码
POST order-nested/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "nest_agg": {
      "nested": {
        "path": "goods"
      },
      "aggs": {
        "items": {
          "terms": {
            "field": "goods.goods_name"
          }
        }
      }
    }
  }
}

结论

通过这个案例,我们可以看到Elasticsearch的嵌套对象功能如何帮助我们以一种非常灵活和强大的方式来处理和查询复杂的数据结构。嵌套对象不仅使得数据模型更加丰富,而且提供了强大的查询能力,使得我们可以轻松地执行复杂的搜索、排序和聚合操作。

相关推荐
深圳市九鼎创展科技8 小时前
MT8883 vs RK3588 开发板全面对比:选型与场景落地指南
大数据·linux·人工智能·嵌入式硬件·ubuntu
阿里云大数据AI技术10 小时前
深度回顾 | 阿里云携手 Elastic 定义 Agent 时代搜索新范式,解锁 Search AI 核心生产力
elasticsearch·agent
渣渣盟10 小时前
Flink事件时间与窗口操作实战指南
大数据·flink·scala
Yyyyy123jsjs10 小时前
如何选用外汇接口实现稳定数据抓取?
大数据·python·金融
孟意昶11 小时前
Doris专题31-SQL手册-基础元素
大数据·数据库·数据仓库·分布式·sql·知识图谱·doris
飞飞传输11 小时前
国产化FTP替代方案哪个好?选对平台让传输更安全高效
大数据·运维·安全
2501_9333295511 小时前
企业舆情处置实战:Infoseek数字公关AI中台技术架构与功能解析
大数据·人工智能·架构·数据库开发
你有医保你先上11 小时前
Elasticsearch Go 客户端
后端·elasticsearch·go
编程迪12 小时前
基于Java和Vue开发的剪辑接单小程序APP软件系统源码
大数据
551只玄猫12 小时前
【模块1 建立认知2】金融数据的类型与获取方式(附实战)
大数据·金融·数据科学·数据处理