Запрос уникальных значений без агрегирования - PullRequest
0 голосов
/ 14 февраля 2019

У нас есть индекс уникальных продуктов, где каждый документ представляет отдельный продукт со следующими полями: 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"
            }
        }
      }
    }
  }
}

Проблема в том, что запрос действительно медленный из-за агрегации и важна эффективность поиска.

Мы хотели бы услышать ваше мнение о лучшем / эффективном решении.

Изменение структуры индекса допустимо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...