Мой лучший подход: переход вложенный с помощью Nested Datatype
За исключением упрощения запросов, проще читать и понимать связи между теми объектами, которые в настоящее время разбросаны по разным массивам.
Да, если вы решите этот подход, вам придется отредактировать свое сопоставление и переиндексировать все ваши данные.
Как будет выглядеть сопоставление? что-то вроде этого:
{
"mappings": {
"properties": {
"last_updated": {
"type": "date"
},
"country": {
"type": "string"
},
"records": {
"type": "nested",
"properties": {
"price": {
"type": "string"
},
"max_occupancy": {
"type": "long"
},
"type": {
"type": "string"
},
"availability": {
"type": "long"
},
"size": {
"type": "string"
}
}
}
}
}
}
EDIT: новая структура документа (содержащая вложенные документы) -
{
"last_updated": "2017-10-25T18:33:51.434706",
"country": "Italia",
"records": [
{
"price": "a‚¬ 139",
"max_occupancy": 2,
"type": "Type 1",
"availability": 10,
"size": "26 m?"
},
{
"price": "a‚¬ 125",
"max_occupancy": 2,
"type": "Type 1 - (Tag)",
"availability": 10,
"size": "35 m?"
},
{
"price": "a‚¬ 120",
"max_occupancy": 1,
"type": "Type 2",
"availability": 10,
"size": "47 m?"
},
{
"price": "a‚¬ 108",
"max_occupancy": 1,
"type": "Type 2 (Tag)",
"availability": 10,
"size": "31 m?"
}
]
}
Теперь его проще запросить для любого конкретного условия с помощью Nested Query и Inner Hits . например:
{
"_source": [
"last_updated",
"country"
],
"query": {
"bool": {
"must": [
{
"term": {
"country": "Italia"
}
},
{
"nested": {
"path": "records",
"query": {
"bool": {
"must": [
{
"range": {
"records.max_occupancy": {
"gte": 2
}
}
}
]
}
},
"inner_hits": {
"sort": {
"records.price": "asc"
},
"size": 1
}
}
}
]
}
}
}
Условия являются: Italia
AND max_occupancy > 2
.
Внутренние хиты: сортируйте по возрастанию по цене и получите первый результат .
Надеюсь, вы найдете это полезным