Как применить агрегации к сгруппированным полям в Elasticsearch? - PullRequest
0 голосов
/ 29 августа 2018

В моем магазине электронной коммерции я хочу включить в окончательные результаты только первый элемент в каждой группе (сгруппированный по item_id). В то же время я не хочу терять свои агрегаты (маленькие цифры рядом с атрибутами, которые указывают, сколько элементов с этим атрибутом найдено).

Вот небольшой пример:

Предположим, я делаю поиск предметов, и только 25 появляются. Вот результат для агрегации цветов, которую я сейчас получаю:


  • черный (65)
  • зеленый (32)
  • белый (13)

И я хочу, чтобы это было:


  • черный (14)
  • зеленый (6)
  • белый (5)

Число должно соответствовать общему количеству, которое пользователь фактически видит на странице.

Как я мог достичь этого с Elasticsearch? Я пробовал как группирование (топ-хиты), так и свертывание полей, и оба, похоже, не подходят для моего варианта использования. Solr делает это почти по умолчанию с помощью функции группировки.

1 Ответ

0 голосов
/ 29 августа 2018

Это должно быть довольно легко. Когда вы запрашиваете агрегирование, вы просто отправляете запрос на конечную точку _search. Пример:

POST /exams/_search
{
  "aggs" : {
    "avg_grade" : { "avg" : { "field" : "grade" } }
  }
}

и в приведенном выше примере вы получите агрегацию для всех документов.

Если вы хотите получить агрегацию для конкретных документов, вам просто нужно добавить конкретный query в тело запроса, например:

POST /exams/_search
{
  "query": {
    "bool" : {
      "must" : {
        "query_string" : {
          "query" : "some query string here"
        }
      },
      "filter" : {
        "term" : { "user" : "kimchy" }
      }
    }
  },
  "aggs" : {
    "avg_grade" : { "avg" : { "field" : "grade" } }
  }
}

и вы также можете отправить параметры size и from.

...