Прежде всего, вы должны попытаться максимально денормализовать данные в ES, чтобы получить лучшая производительность и возможности, предлагаемые им, и я просмотрел образцы, предоставленные вами, и комментарии в вопросе, и кажется, что это может быть легко достигнуто в вашем случае использования и показано в приведенном ниже примере путем объединения индексов user
и check
в один индекс.
Сопоставление индекса
{
"mappings": {
"properties": {
"user_id": {
"type": "text",
"fielddata": "true"
},
"price": {
"type": "integer"
},
"goods_count": {
"type": "integer"
}
}
}
}
Данные индекса:
С помощью сопоставления индекса, определенного выше, проиндексируйте эти три документа, где один документ имеет "user_id":"1"
, а 2 документа имеют "user_id":"2"
.
{
"user_id":"1",
"price":500,
"goods_count":100
}
{
"user_id":"2",
"price":500,
"goods_count":100
}
{
"user_id":"2",
"price":100,
"goods_count":200
}
Поисковый запрос:
См. официальную документацию ES по адресу Агрегация терминов, Агрегация лучших результатов, Суммирование и Среднее агрегирование, чтобы получить подробное объяснение.
{
"size": 0,
"aggs": {
"user": {
"terms": {
"field": "user_id"
},
"aggs": {
"top_user_hits": {
"top_hits": {
"_source": {
"includes": [
"user_id"
]
}
}
},
"avg_price": {
"avg": {
"field": "price"
}
},
"goods_count": {
"sum": {
"field": "goods_count"
}
}
}
}
}
}
Результат поиска:
{
"took": 10,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
]
},
"aggregations": {
"user": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "2",
"doc_count": 2,
"top_user_hits": {
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "stof_63925596",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"user_id": "2"
}
},
{
"_index": "stof_63925596",
"_type": "_doc",
"_id": "3",
"_score": 1.0,
"_source": {
"user_id": "2"
}
}
]
}
},
"avg_price": {
"value": 300.0
},
"goods_count": {
"value": 300.0
}
},
{
"key": "1",
"doc_count": 1,
"top_user_hits": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "stof_63925596",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"user_id": "1"
}
}
]
}
},
"avg_price": {
"value": 500.0
},
"goods_count": {
"value": 100.0
}
}
]
}
}
}
Как видно из результатов поиска выше, для "user_id":"2"
средняя цена составляет (500+100)/2 = 300
, а сумма goods_count
равна 100+200 = 300
.
Точно так же для "user_id":"1"
средняя цена равна 500/1 = 500
, а сумма goods_count
равна 100
.
person
user156327
schedule
19.09.2020
user_index
для получения ожидаемого результата? Поскольку поля, которые содержит ваш ожидаемый вывод, также присутствуют вcheck_index
. - person ESCoder   schedule 17.09.2020