【高级篇】第6章 Elasticsearch 高级查询与搜索优化

时间:2024-07-05 07:52:46

在Elasticsearch的深入应用之旅中,掌握高级查询技巧与优化搜索性能是提升数据处理效率的关键。本章将带你深入探索Elasticsearch的高级查询特性,揭示搜索性能优化的奥秘,以及如何利用高亮与建议API增强用户体验。

6.1 复杂查询

6.1.1 Nested查询

Nested基本概念与用法:

在Elasticsearch中,nested类型是一种特殊的数据类型,用于存储复杂对象数组,使得数组中的每个对象作为一个独立的、完整的文档对待,而非简单地扁平化处理。这意味着,数组内的每个对象都可以拥有自己的元数据,包括独立的评分、分析设置等。这种设计特别适用于那些数组元素之间存在一对一关联关系,且需要单独查询或聚合的情况,比如订单中的商品列表、文章中的评论列表等。

nested查询正是针对这种数据结构设计的,它允许你深入到数组内部,对每个对象单独进行匹配和过滤。与之相对的是普通对象字段上的查询,后者无法区分数组内各对象的独立性。

实际案例:

假设有一个电商网站,其订单索引ecommerce_orders中每个订单文档包含一个名为products的nested字段,记录了订单中所有商品的信息,包括商品ID(product_id)、商品名称(product_name)和购买数量(quantity)。

案例需求: 我们需要找到所有包含商品名称为“MacBook Pro”的订单,并且关心这些订单中具体是哪些商品满足条件。

查询示例:

GET /ecommerce_orders/_search
{
   
  "query": {
   
    "nested": {
   
      "path": "products",  // 指定nested字段的路径
      "query": {
              // nested查询内部的查询条件
        "match": {
   
          "products.product_name": "MacBook Pro"
        }
      },
      "inner_hits": {
          // 请求包含匹配nested对象的详细信息
        "_source": ["products.product_name", "products.quantity"]
      }
    }
  }
}

解析:

  • 查询路径(path): 指定了执行nested查询的字段名称,这里是products
  • 内部查询(query): 使用match查询,针对products.product_name字段查找值为“MacBook Pro”的记录。
  • inner_hits: 这是一个关键选项,它让每个匹配的nested对象在结果中单独列出,展示指定的_source字段,这里我们只关心商品名称和购买数量。

查询结果示例:

{
   
  "hits": {
   
    "total": {
   
      "value": 2, // 假设有两个订单包含"MacBook Pro"
      "relation": "eq"
    },
    "hits": [
      {
   
        "_source": {
   
          "order_id": "123",
          "products": [
            // 其他商品省略...
            {
   
              "product_id": "456",
              "product_name": "MacBook Pro",
              "quantity": 1
            }
          ]
        },
        "inner_hits": {
   
          "products": [
            {
   
              "_source": {
   
                "product_id": "456",
                "product_name": "MacBook Pro",
                "quantity": 1
              }
            }
          ]
        }
      },
      // 另一订单信息省略...
    ]
  }
}

通过这个案例,我们不仅找到了包含特定商品的订单,还通过inner_hits获得了这些订单中具体匹配商品的详细信息,为后续的分析和处理提供了便利。

6.1.2 Parent/Child查询

Parent/Child基本概念与用法:

在Elasticsearch中,Parent/Child关系是一种特殊的文档关系模型,用于表示一对多的关联关系。与Nested