У нас есть индекс уникальных продуктов, где каждый документ представляет отдельный продукт со следующими полями: product_id, group_id, group_score и product_score.Рассмотрим следующий индекс:
{
"product_id": "100-001",
"group_id": "100",
"group_score": 100,
"product_score": 60,
},
{
"product_id": "100-002",
"group_id": "100",
"group_score": 100,
"product_score": 40,
},
{
"product_id": "100-001",
"group_id": "100",
"group_score": 100,
"product_score": 50,
},
{
"product_id": "200-001",
"group_id": "200",
"group_score": 73,
"product_score": 20,
},
{
"product_id": "200-002",
"group_id": "200",
"group_score": 73,
"product_score": 53,
}
Каждая группа содержит ~ 1-200 товаров.Мы пытаемся выполнить запрос, который соответствует следующим условиям: 1. Продукты должны быть отсортированы по их group_score (desc).2. Не более одного продукта на group_id.3. Получите продукт с наивысшим баллом product_score в группе.
Например, применение запроса к приведенному выше должно вернуть:
{
"product_id": "100-001"
},
{
"product_id": "200-002"
}
В итоге мы получили следующий запрос:
{
"size": 0,
"aggs": {
"group_by_group_id": {
"terms": {
"field": "group_id",
"order":{
"max_group_score":"desc"
}
},
"aggs": {
"top_scores_hits": {
"top_hits": {
"sort": [
{
"product_score": {
"order": "desc"
}
}
],
"size": 1
}
},
"max_group_score":{
"max":{
"field":"group_score"
}
}
}
}
}
}
Проблема в том, что запрос действительно медленный из-за агрегации и важна эффективность поиска.
Мы хотели бы услышать ваше мнение о лучшем / эффективном решении.
Изменение структуры индекса допустимо .