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过滤》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

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

孵化Twitter

孵化Twitter

[美]尼克·比尔顿(Nick Bilton) / 欧常智、张宇、单旖 / 浙江人民出版社 / 2014-1 / 49.90元

一个在挣扎中生存的博客平台Odeo,一小撮龙蛇混杂的无政府主义者员工,经历了怎样的涅槃,摇身一变,成为纽交所最闪耀的上市企业Twitter? 一个野心勃勃的农场小男孩,一个满身纹身的“无名氏“,一个爱开玩笑的外交家,一位害羞而又充满活力的极客,这四位各有特色的创始人如何从兢兢业业、每日劳作的工程师,成为了登上杂志封面、奥普拉秀和每日秀的富裕名人?而在Twitter日益茁壮成长的过程中,他们又......一起来看看 《孵化Twitter》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换