Elasticsearch的nested过滤

栏目: 后端 · 发布时间: 7年前

内容简介:记录一个对nested嵌套文档的过滤问题,这两天一不小心踩了个小坑。我有一个nested字段是这样定义的:需求:符合条件的父文档必须包含至少一个满足下面条件的main_category子文档:

记录一个对nested嵌套文档的过滤问题,这两天一不小心踩了个小坑。

我有一个nested字段是这样定义的:

'main_category' => [
    'type' => 'nested',
    'dynamic' => false,
    'properties' => [
        'id' => [ // 分类ID
            'type' => 'long',
        ],
        'level' => [    // 层级
            'type' => 'integer',
        ],
        'parent_id' => [ // 父分类
            'type' => 'long',
        ],
        'title' => [ // 标题
            'type' => 'keyword',
        ],
        'nicktitle' => [    // 别名
            'type' => 'keyword',
        ],
    ],
],

需求:符合条件的父文档必须包含至少一个满足下面条件的main_category子文档:

  • level=1
  • id=10

因为查询还包含对父文档的一些过滤条件,所以我当时的查询就写成了这样:

{
	"query": {
		"bool": {
			"filter": [{
				"nested": {
					"path": "main_category",
					"query": {
						"term": {
							"main_category.id": 10
						}
					}
				}
			}, {
				"nested": {
					"path": "main_category",
					"query": {
						"term": {
							"main_category.level": 1
						}
					}
				}
			}]
		}
	}
}

这个查询的意思是,有任意一个main_category满足id=10,有另外任意一个main_category满足level=1即可,即满足2个条件的子文档不必是同一个,所以得到的结果是错误的。

正确的做法应该是先通过nested关键字进入到子文档的上下文中,然后过滤同时满足2个条件的子文档:

{
	"query": {
		"bool": {
			"filter": [{
				"nested": {
					"path": "main_category",
					"query": {
						"bool": {
							"filter": [{
								"term": {
									"main_category.id": 10
								}
							}, {
								"term": {
									"main_category.level": 1
								}
							}]
						}
					}
				}
			}]
		}
	}
}

经过nested进入子文档上下文,然后执行普通的bool过滤即可filter得到同时满足2个条件的子文档,那么对应的父文档也就满足了条件。

本篇博客完~


以上所述就是小编给大家介绍的《Elasticsearch的nested过滤》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

機器,平台,群眾

機器,平台,群眾

安德魯‧麥克費(Andrew McAfee)、艾瑞克‧布林優夫森(Erik Brynjolfsson) / 李芳齡 / 天下文化 / 2017-12-27 / TWD550

★★Amazon.com商業理財Top1 ★★ 全球暢銷書《第二次機器時代》作者最新力作 兩位MIT數位頂尖科學家歷時三年時間 走訪矽谷、華府、劍橋、紐約、倫敦、舊金山等科技政經重鎮 拜會許多領域精英進行交流,結合宏觀趨勢觀察, 指出人人都應關注的三重革命 科技正以空前速度改變每個產業及每個人的生活, 你該如何做,才能保持領先? 我們生活在一個奇特的......一起来看看 《機器,平台,群眾》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具