Вы ХОТИТЕ документы, в которых данный старт не находится в заблокированном периоде, а данный конец не находится в заблокированном периоде. Еще один способ сказать это
Вам НЕ нужны документы, в которых данный старт находится в заблокированном периоде или если данный конец находится в заблокированном периоде (!A AND !B === !(A OR B)
).
Если мы придерживаемся вашего отображения и делаем это вложенным способом, вот как:
{
"query": {
"bool": {
"must_not": [
{
"nested": {
"path": "blocked_periods",
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"range": {
"blocked_periods.start_date": {
"lte": "START"
}
}
},
{
"range": {
"blocked_periods.end_date": {
"gte": "START"
}
}
}
]
}
},
{
"bool": {
"must": [
{
"range": {
"blocked_periods.start_date": {
"lte": "END"
}
}
},
{
"range": {
"blocked_periods.end_date": {
"gte": "END"
}
}
}
]
}
}
]
}
}
}
}
]
}
}
}
Однако, если вы можете справиться с изменением имен ваших полей с start_date/end_date
на gte/lte
, я думаю, вы найдете подход date_range предпочтительным.
PUT my_index
{
"mappings": {
"item": {
"properties": {
"blocked_periods": {
"type": "date_range",
"format": "yyyy-MM-dd"
}
}
}
}
}
POST my_index/item/1
{
"blocked_periods": [
{
"gte": "2020-1-10",
"lte": "2020-1-15"
},
{
"gte": "2020-1-17",
"lte": "2020-1-25"
}
]
}
GET my_index/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"blocked_periods": "START"
}
},
{
"term": {
"blocked_periods": "END"
}
}
]
}
}
}