深入理解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的嵌套对象功能如何帮助我们以一种非常灵活和强大的方式来处理和查询复杂的数据结构。嵌套对象不仅使得数据模型更加丰富,而且提供了强大的查询能力,使得我们可以轻松地执行复杂的搜索、排序和聚合操作。

相关推荐
青岛前景互联信息技术有限公司5 小时前
OpenClaw 重构智慧消防:AI时代的平台融合实践
大数据·人工智能
梦梦代码精6 小时前
BuildingAI 上部署自定义工作流智能体:5 个实用技巧
大数据·人工智能·算法·开源软件
极客老王说Agent6 小时前
2026智造前瞻:实在Agent生产排期智能助理核心功能与使用方法详解
大数据·人工智能·ai·chatgpt
数智化精益手记局7 小时前
什么是设备维护管理?设备维护管理包含哪些内容?
大数据·网络·人工智能·安全·信息可视化
AllData公司负责人8 小时前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
桃花键神8 小时前
Bright Data Web Scraping指南 2026: 使用 MCP + Dify 自动采集海外社交媒体数据
大数据·前端·人工智能
程序鉴定师11 小时前
西安App开发推荐与业界认可的优秀实践
大数据·小程序
workflower11 小时前
从拿订单到看方向
大数据·人工智能·设计模式·机器人·动态规划
CableTech_SQH12 小时前
F5G 全光网,赋能智慧校园数字化建设
大数据·网络·5g·运维开发·信息与通信
goyeer12 小时前
【ITIL4】- 服务价值体系
大数据·运维·信息化·自动运维·itil