Вложенные логические запросы в elastic search
Я пытаюсь сделать запрос в эластичный поиск, который будет делать следующее: Я хочу, чтобы он проверил результат, который имеет (metropolitan_area 16 и starts_at 05072013) или (metropolitan_id 16 и starts_at "пустой".
Это мой текущий запрос, но я чувствую, что он должен быть тупо как-то, и я не уверен, как это сделать.
{
"query" : {
"bool" : {
"must" : [
{
"term" : {"user" : "a"}
},
{
"term" :{"metropolitan_area" : "16"}
}
],
"must_not" : [],
"should" : []
}
},
"filter" : {
"or" : {
"filters" : [
{
"term" : {"user":"519"}
},
{
"term" : {"user":"6"}
},
{
"term" : {"user":"5"}
},
{
"term" : {"user":"36"}
},
{
"term" : {"starts_at":"05072013"}
},
{
"term" : {"starts_at":"blank"}
}
]
}
}
}
2 ответов
and
, or
и not
запросы устарели в elasticsearch 2.x. Документация Elasticsearch рекомендует bool
запрос вместо. Например, вы можете написать вложенный запрос bool следующим образом в контексте фильтра:
{
"query":{
"bool":{
"must":[
{
"term":{
"user":"a"
}
},
{
"term":{
"metropolitan_area":"16"
}
}
],
"filter":{
"bool":{
"should":[
{
"term":{
"user":"519"
}
},
{
"term":{
"user":"6"
}
},
{
"term":{
"user":"5"
}
},
{
"term":{
"user":"36"
}
},
{
"term":{
"starts_at":"05072013"
}
},
{
"term":{
"starts_at":"blank"
}
}
]
}
}
}
}
}
правильно вложенное логическое выражение показано ниже:
{
"filter": {
"or" : [{
"and" : [
{ "term" : { "metropolian_area" : 16 } },
{ "term" : { "starts_at" : 0123213 } }
]
}, {
"and" : [
{ "term" : ... },
{ "term" : ... }
]
}]
}
}