内容简介:记录一个对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过滤》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java数据结构和算法
拉佛 / 计晓云 / 中国电力出版社 / 2004-02-01 / 55.00元
《Java数据结构和算法》(第2版)以一种易懂的方式教授如何安排和操纵数据的问题,其中不乏一些难题:了解这些知识以期使计算机的应用获得最好的表现。不管使用何种语言或平台,掌握了数据结构和算法将改进程序的质量和性能。 《Java数据结构和算法》(第2版)提供了一套独创的可视讨论专题用以阐明主要的论题:它使用Java语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。经......一起来看看 《Java数据结构和算法》 这本书的介绍吧!