示例mappings 下 fragment 是nested类型,fragment.tagTree也是嵌套类型
"mappings" : {
"properties" : {
"content" : {
"type" : "text",
"analyzer" : "ik_max_custom",
"search_analyzer" : "ik_smart"
},
"id" : {
"type" : "keyword"
},
"fragment" : {
"type" : "nested",
"properties" : {
"content" : {
"type" : "text",
"analyzer" : "ik_max_custom",
"search_analyzer" : "ik_smart"
},
"id" : {
"type" : "integer"
},
"tagTree" : {
"type" : "nested",
"properties" : {
"tag_id" : {
"type" : "integer"
},
"tag_name" : {
"type" : "keyword"
},
"tag_path" : {
"type" : "keyword"
}
}
},
"title" : {
"type" : "text",
"analyzer" : "ik_max_word",
"search_analyzer" : "ik_smart"
}
}
}
}
}
查询多层嵌套
- 示例
是否计算得分需自行考虑{ "constant_score": { "filter": { "nested": { "path": "fragment", "query": { "nested": { "path": "fragment.tagTree", "query": { "terms": { "fragment.tagTree.tag_id": [927597] } } } } } }, "boost": 0 } }
inner_hits嵌套过滤结果值
-
例如一个文档,根据fragment.tagTree.tag_id=930365查询,预期结果是只有fragment.id=111,不想要fragment.id=222,因为都在一个文档中,如果不过滤那么结果中会包含id =1这个文档的所有内容
{ "fragment" : [ { "tagTree" : [ { "tag_name" : "北京", "tag_id" : 930365, "tag_path" : "930364" } ], "id" : 111, "content" : "1111", }, { "tagTree" : [ ], "id" : 222, "content" : "2222" } ], "id" : 1, "title" : "示例结果" }
-
操作
- “inner_hits”:可以实现如上结果,
如果size不填写,则默认展示3条
- ““inner_hits”: {“size”:0}”:可以实现分页
一个查询中同一个字段只能有一个inner_hits
{ "constant_score": { "filter": { "nested": { "path": "fragment", "query": { "nested": { "path": "fragment.tagTree", "query": { "terms": { "fragment.tagTree.tag_id": [111] } } } }, "inner_hits": {} } }, "boost": 0 } }
- “inner_hits”:可以实现如上结果,
嵌套一个字段多值查询
{
"constant_score": {
"filter": {
"nested": {
"path": "fragment",
"query": {
"bool": {
"must": [{
"nested": {
"path": "fragment.tagTree",
"query": {
"terms": {
"fragment.tagTree.tag_id": [991714]
}
}
}
},
{
"nested": {
"path": "fragment.tagTree",
"query": {
"terms": {
"fragment.tagTree.tag_id": [1004568]
}
}
}
}]
}
},
"inner_hits": {}
}
},
"boost": 0
}
}