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
相关产品推荐
相关产品推荐

