我是elasticsearch查询DSL的新手,我的ES索引中有以下文档
{
"doc_id":1,
"city_id": 1,
"name": "test1",
"vvip": false
},
{
"doc_id":2,
"city_id": 1,
"name": "test2",
"vvip": false
},
{
"doc_id":3,
"city_id": 1,
"name": "test3"
}
{
"doc_id":4,
"city_id": 1,
"name": "test4"
}
{
"doc_id":5,
"city_id": 1,
"name": "test5",
"vvip": true
}
{
"doc_id":6,
"city_id": 1,
"name": "test6",
"vvip": true
}
对于doc_id 3和doc_id 4 vvip字段不存在
我想以这样的方式构成查询:如果我查询vvip:true或vvip:false,则应始终返回这些文档
含义查询city_id = 1和vvip = false响应将包含doc_id 1,2,3,4对于city_id = 1和vvip = true响应将包含doc_id 3,4,5,6
我尝试了以下查询,但没有帮助
{
"query": {
"bool": {
"must": [
{
"bool": {
"must": [
{
"term": {
"city_id": "1"
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "vvip"
}
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"city_id": "1"
}
},
{
"match": {
"vvip": false
}
}
]
}
}
]
}
}
}
您可以像这样简化查询,它应该可以按预期工作:
{
"query": {
"bool": {
"must": [
{
"match": {
"city_id": "1"
}
},
{
"bool": {
"should": [
{
"match": {
"vvip": true
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "vvip"
}
}
}
}
]
}
}
]
}
}
}
查询表示您匹配city_id=1
AND(vvip=true
ORvvip
不存在)。
您的方向正确,只需将must
更改为should
(意味着在第一个OR)
查询中为bool
。
请参见下面的查询:
GET my_index/_search
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"city_id": "1"
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "vvip"
}
}
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"city_id": "1"
}
},
{
"match": {
"vvip": false
}
}
]
}
}
]
}
}
}
说明:
此查询:
GET my_index/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"city_id": "1"
}
},
{
"bool": {
"must_not": {
"exists": {
"field": "vvip"
}
}
}
}
]
}
}
}
将为您提供文件3,4
此查询
GET my_index/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"city_id": "1"
}
},
{
"match": {
"vvip": false
}
}
]
}
}
}
将为您提供文件1,2
现在您想在它们之间设置OR
,表示should
。