Самая близкая вещь, которую я могу придумать, чтобы делать то, что вы хотите, это Составные агрегаты . Это не настоящее соединение, но оно МОЖЕТ приблизить вас к тому, что вы хотите.
УСЛОВИЯ:
- Поля должны иметь одинаковые имена между индексами
- Вам придется сгладить результирующую агрегацию
- Все поля результатов (те, которые вас интересуют) будут какими-то агрегатами
Вот минимальный пример (взломан в Kibana Console):
С документами:
POST my-test1/_doc/_bulk
{"index": {}}
{"entityID":"entity1", "value": 12}
{"index": {}}
{"entityID":"entity1", "value": 22}
{"index": {}}
{"entityID":"entity2", "value": 2}
{"index": {}}
{"entityID":"entity2", "value": 12}
POST my-test2/_doc/_bulk
{"index": {}}
{"entityID":"entity1", "otherValue": 5}
{"index": {}}
{"entityID":"entity1", "otherValue": 1}
{"index": {}}
{"entityID":"entity2", "otherValue": 3}
{"index": {}}
{"entityID":"entity2", "otherValue": 7}
Мы будем агрегировать вокруг поля общего объекта entityID
GET my-test*/_search
{
"size": 0,
"aggs": {
"by-entity": {
"composite": {
"sources": [
{
"entityID": {
"terms": {
"field": "entityID.keyword"
}
}
}
]
},
"aggs": {
"value": {
"avg": {
"field": "value"
}
},
"otherValue": {
"avg": {
"field": "otherValue"
}
}
}
}
}
}
Это приведет к ответу:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 10,
"successful" : 10,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 8,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"by-entity" : {
"after_key" : {
"entityID" : "entity2"
},
"buckets" : [
{
"key" : {
"entityID" : "entity1"
},
"doc_count" : 4,
"otherValue" : {
"value" : 3.0
},
"value" : {
"value" : 17.0
}
},
{
"key" : {
"entityID" : "entity2"
},
"doc_count" : 4,
"otherValue" : {
"value" : 5.0
},
"value" : {
"value" : 7.0
}
}
]
}
}
}
Вы можете создать составную агрегацию вокруг множества различных полей и разных групп агрегации. Таким образом, вы можете создать terms
агрегирование для вашего hotel_id
и объединить его с date_histogram
вокруг вашего timestamp
.