内容简介:记录一个对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过滤》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Tomcat架构解析
刘光瑞 / 人民邮电出版社 / 2017-5 / 79.00元
本书全面介绍了Tomcat的架构、各组件的实现方案以及使用方式。包括Tomcat的基础组件架构以及工作原理,Tomcat各组件的实现方案、使用方式以及详细配置说明,Tomcat与Web服务器集成以及性能优化,Tomcat部分扩展特性介绍等。读者可以了解应用服务器的架构以及工作原理,学习Tomcat的使用、优化以及详细配置。一起来看看 《Tomcat架构解析》 这本书的介绍吧!