我在使用嵌套对象的布尔运算符时遇到了一些麻烦。 这是我的映射:
"IP": {
"properties": {
"ip": {
"type": "ip"
}
},
"type": "nested"
}
我想获得的文档包含两个指定的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和DOC 2都被检索到了。
答案 0 :(得分:3)
您可以在terms filter上使用"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文件。
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