如何查询嵌套数组并仅高亮同时包含A和C的对应key字段?
你遇到的是Elasticsearch对象数组默认扁平化存储导致的高亮问题:默认会将所有DOC.key的值合并为一个字段检索,只要整个文档满足A和C的查询条件,所有包含A或C的数组成员都会被高亮。
解决方案
前提条件
首先需要将DOC字段设置为nested类型,该类型会将数组内的每个对象作为独立文档存储,支持针对单个数组成员做条件匹配。索引映射配置如下:
PUT your_index_name { "mappings": { "properties": { "DOC": { "type": "nested", "properties": { "key": { "type": "text" } } } } } }
查询语句
使用nested查询搭配inner_hits返回匹配的数组成员,同时在inner_hits中配置高亮规则:
POST your_index_name/_search { "query": { "nested": { "path": "DOC", "query": { "match": { "DOC.key": { "query": "A C", "operator": "and" } } }, "inner_hits": { "highlight": { "fields": { "DOC.key": { "pre_tags": ["<keyword>"], "post_tags": ["</keyword>"] } } } } } } }
结果说明
返回结果的hits.hits[].inner_hits.DOC.hits节点下只会包含同时匹配A和C的数组成员,对应highlight字段就是你期望的仅符合条件的高亮内容,不会返回其他不匹配的数组元素。如果你的索引当前DOC字段不是nested类型,需要重新创建索引修改映射后再导入数据即可生效。
内容的提问来源于stack exchange,提问作者Rurien
相关产品推荐
相关产品推荐

