使用嵌套对象的布尔运算符时遇到一些麻烦。这是我的映射:
"IP": { "properties": { "ip": { "type": "ip" } }, "type": "nested" }
我想获取恰好包含两个指定ip甚至更多的文档。
假设我的文档具有以下ips:
DOC 1 192.168.1.0 192.168.0.1 10.0.0.9 DOC 2 192.168.0.1
我想通过使用此过滤器进行搜索来仅检索DOC 1:
"bool": { "must": { "terms": { "IP.ip": [ "192.168.0.1", "10.0.0.9" ] } } }
问题在于,同时检索了DOC 1和DOC2。
你可以使用"execution":"and"你的条件过滤器是这样的:
"execution":"and"
{ "filter": { "bool": { "must": [ { "terms": { "ip": [ "192.168.0.1", "10.0.0.9" ], "execution": "and" } } ] } } }
这是我用来测试的一些代码:
http://sense.qbox.io/gist/d6b5f4e4c0d2977a04b1795f4bbb0503f6365dfe
编辑: 嵌套的版本(我误解了问题)。
假设您的索引是按照我设置我的测试对象的方式设置的,那么该查询应该为您提供所需的信息(请参见下面的代码)。列表中需要包含两个nested子句,must因为我们要查找的文档包含两个不同的嵌套文档,每个嵌套IP。
nested
must
POST /test_index/_search { "filter": { "bool": { "must": [ { "nested": { "path": "ips", "filter": { "term": { "ip": "192.168.0.1" } } } }, { "nested": { "path": "ips", "filter": { "term": { "ip": "10.0.0.9" } } } } ] } } }
这是我用来设置的代码:
http://sense.qbox.io/gist/cd3a0ec61cb1348d5cc2bd1ef444f4898f6d8e57