ElasticSearch多层nested查询、nested过滤排除非结果内容、inner_hits

示例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
    	}
    }
    

在这里插入图片描述

嵌套一个字段多值查询

{
	"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
	}
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值