【Elasticsearch】inner_hits

发布于:2025-02-19 ⋅ 阅读:(126) ⋅ 点赞:(0)

`inner_hits`是 Elasticsearch 中的一个功能,用于在搜索结果中嵌套显示与主查询相关的子查询结果。它通常与嵌套字段(`nested`fields)、父子关系(`parent-child`)或压缩(`collapse`)功能结合使用,用于提供更丰富的上下文信息或展示与主文档相关的详细子文档。

1.在压缩(Collapse)中的作用

在压缩功能中,`inner_hits`用于展开每个压缩后的顶级文档,展示与该压缩键相关的所有子文档。

场景举例:

假设你按`user.id`对搜索结果进行压缩,但你希望在每个用户下展示与该用户相关的多个文档(例如最近的5条记录或响应字节数最大的3条记录),就可以使用`inner_hits`来实现。

示例:

```json

{

  "query": {

    "match": {

      "message": "GET /search"

    }

  },

  "collapse": {

    "field": "user.id",

    "inner_hits": {

      "name": "most_recent", // 定义一个名称,用于标识这个 inner_hits

      "size": 5, // 每个用户返回的子文档数量

      "sort": [

        {

          "@timestamp": "desc" // 按时间降序排序

        }

      ]

    }

  },

  "sort": [

    {

      "http.response.bytes": {

        "order": "desc"

      }

    }

  ]

}

```

结果:

• 每个`user.id`只会返回一个顶级文档(压缩后的结果)。

• 在每个顶级文档中,`inner_hits`会嵌套返回该用户相关的最多5条最近的记录。

---

2.在嵌套字段(Nested Fields)中的作用

在嵌套字段中,`inner_hits`用于返回与嵌套字段匹配的子文档,而不仅仅是包含嵌套字段的父文档。

场景举例:

假设你有一个商品文档,每个商品包含多个属性(如颜色、尺寸等),这些属性是嵌套字段。当你搜索某个属性时,`inner_hits`可以展示匹配该属性的具体子文档。

示例:

```json

{

  "query": {

    "nested": {

      "path": "attributes",

      "query": {

        "match": {

          "attributes.color": "red"

        }

      },

      "inner_hits": {} // 返回匹配的嵌套字段

    }

  }

}

```

结果:

• 父文档(商品)会返回。

• `inner_hits`会嵌套返回匹配的嵌套字段(例如颜色为红色的属性)。

---

3.在父子关系(Parent-Child)中的作用

在父子关系中,`inner_hits`用于返回与父文档相关的子文档。

场景举例:

假设你有一个博客系统,博客文章是父文档,评论是子文档。当你搜索博客文章时,`inner_hits`可以返回与该文章相关的评论。

示例:

```json

{

  "query": {

    "has_child": {

      "type": "comment", // 子文档类型

      "query": {

        "match": {

          "comment.text": "Elasticsearch"

        }

      },

      "inner_hits": {} // 返回匹配的子文档

    }

  }

}

```

结果:

• 父文档(博客文章)会返回。

• `inner_hits`会嵌套返回匹配的子文档(评论)。

---

总结

`inner_hits`的主要作用是:

1. 在压缩结果中,展开每个压缩键相关的子文档。

2. 在嵌套字段中,返回匹配嵌套字段的具体子文档。

3. 在父子关系中,返回与父文档相关的子文档。

它为搜索结果提供了更丰富的上下文信息,而不仅仅是返回顶级文档。