如何在Elasticsearch查询中返回嵌套字段且不影响结果
解决方案:不影响查询结果的前提下返回嵌套字段
要实现完全不基于嵌套字段过滤结果,仅获取嵌套字段内容,你需要把嵌套查询放到bool的filter子句中,结合inner_hits来获取嵌套字段。这样既不会改变原查询的匹配结果,又能返回嵌套字段的内容。
正确的查询示例
{ "stored_fields": [ "document_code", "filename" ], "query": { "bool": { "should": [ { "match": { "filename": "some filename" } } ], "filter": [ { "nested": { "path": "nested_fields", "query": { "match_all": {} }, "inner_hits": { "stored_fields": [ "nested_fields.field_one", "nested_fields.field_two" ] } } } ] } } }
为什么这样有效?
filter子句会对should匹配到的结果做进一步过滤,但这里用match_all的嵌套查询,会匹配所有包含nested_fields的文档(你提到所有文档都有这个字段),所以不会过滤掉任何原should匹配到的文档。filter不会影响文档的相关性得分,完全保留原查询的排序逻辑。inner_hits会提取每个匹配文档中nested_fields的指定字段,返回在结果的inner_hits节点下。
为什么之前的方法不行?
- 把嵌套查询放到
should里:should只要满足任意一个条件就会返回文档,match_all的嵌套查询会匹配所有文档,导致最终返回全部数据,完全覆盖了原match的过滤效果。 - 用
match_none作为嵌套查询:没有匹配到任何嵌套文档,inner_hits自然为空,无法获取嵌套字段内容。
内容的提问来源于stack exchange,提问作者baja_slap
相关产品推荐
相关产品推荐

