You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中elasticsearch-dsl如何返回Inner Hits?索引配置求助

问题解决思路

核心问题

你把posts字段定义为Object类型,但实际存储的是数组结构。Elasticsearch中Object类型会将数组内的对象扁平化存储,无法保留每个对象的独立关联关系,因此不支持nested查询和Inner Hits功能。必须将posts改为Nested类型才能实现需求。

修正后的模型代码

from elasticsearch_dsl import InnerDoc, Document, Text, Integer, Date, Nested

class Post(InnerDoc):
    text = Text()
    id = Integer()

class User(Document):
    name = Text()
    posts = Nested(doc_class=Post)  # 将Object替换为Nested
    signed_up_at = Date()

重新创建索引

字段类型修改后,必须重建索引才能生效(旧索引的字段类型无法直接修改):

# 删除已存在的旧索引
if User._index.exists():
    User._index.delete()

# 创建新索引,应用更新后的字段配置
User.init()

实现带Inner Hits的查询

现在可以用nested查询获取用户及匹配条件的帖子:

from elasticsearch_dsl import Search

# 构建nested查询,指定path为posts,同时开启inner_hits
s = Search(using=client).query(
    "nested",
    path="posts",
    query={"match": {"posts.text": "test"}},
    inner_hits={}  # 启用Inner Hits,返回匹配的posts数据
)

# 执行查询并遍历结果
response = s.execute()
for hit in response:
    print(f"用户名称: {hit.name}")
    print("符合条件的帖子:")
    # 从inner_hits中取出匹配的posts
    for matched_post in hit.meta.inner_hits.posts.hits.hits:
        post_data = matched_post["_source"]
        print(f"  帖子ID: {post_data['id']}, 内容: {post_data['text']}")

报错原因说明

之前的[nested] query does not support [posts]错误,是因为nested查询仅适用于Elasticsearch中的nested类型字段,而你原模型中posts是Object类型,不满足该查询的要求。

内容的提问来源于stack exchange,提问作者user20418895

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:25:33