记录一个对nested嵌套文档的过滤问题,这两天一不小心踩了个小坑。
我有一个nested字段是这样定义的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'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
因为查询还包含对父文档的一些过滤条件,所以我当时的查询就写成了这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
{ "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个条件的子文档:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "query": { "bool": { "filter": [{ "nested": { "path": "main_category", "query": { "bool": { "filter": [{ "term": { "main_category.id": 10 } }, { "term": { "main_category.level": 1 } }] } } } }] } } } |
经过nested进入子文档上下文,然后执行普通的bool过滤即可filter得到同时满足2个条件的子文档,那么对应的父文档也就满足了条件。
本篇博客完~
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
