Лучший способ сделать это - использовать nested
документы.
Сначала: настройте сопоставление, чтобы указать, что документ hours
должен рассматриваться как вложенный:
curl -XPUT 'http://127.0.0.1:9200/foo/?pretty=1' -d '
{
"mappings" : {
"location" : {
"properties" : {
"hours" : {
"include_in_root" : 1,
"type" : "nested",
"properties" : {
"open" : {
"type" : "short"
},
"close" : {
"type" : "short"
},
"day" : {
"index" : "not_analyzed",
"type" : "string"
}
}
},
"name" : {
"type" : "string"
}
}
}
}
}
'
Добавить некоторые данные: (обратите внимание на несколько значений для часов работы)
curl -XPOST 'http://127.0.0.1:9200/foo/location?pretty=1' -d '
{
"name" : "Test",
"hours" : [
{
"open" : 9,
"close" : 12,
"day" : "monday"
},
{
"open" : 13,
"close" : 17,
"day" : "monday"
}
]
}
'
Затем запустите ваш запрос, фильтруя по текущему дню и времени:
curl -XGET 'http://127.0.0.1:9200/foo/location/_search?pretty=1' -d '
{
"query" : {
"filtered" : {
"query" : {
"text" : {
"name" : "test"
}
},
"filter" : {
"nested" : {
"path" : "hours",
"filter" : {
"and" : [
{
"term" : {
"hours.day" : "monday"
}
},
{
"range" : {
"hours.close" : {
"gte" : 10
}
}
},
{
"range" : {
"hours.open" : {
"lte" : 10
}
}
}
]
}
}
}
}
}
}
'
Это должно работать.
К сожалению, в 0.17.5 он выбрасывает NPE - скорее всего это будет простая ошибка, которая будет исправлена в ближайшее время. Я открыл вопрос для этого здесь: https://github.com/elasticsearch/elasticsearch/issues/1263
ОБНОВЛЕНИЕ Как ни странно, теперь я не могу реплицировать NPE - кажется, что этот запрос корректно работает как в версии 0.17.5, так и выше. Должно быть, был какой-то временный глюк.
Клинт