Elasticsearch - как сделать запрос max_documents_per_field - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть индекс с людьми.Я хочу получить в общей сложности 100 человек (согласно количеству фильтров), но в конце хочу наложить максимум 3 человека на местоположение.

например

Индекс:

| name    | location |
|---------|----------|
| Frodo   | Shire    |
| Sam     | Shire    |
| Merry   | Shire    |
| Pippin  | Shire    |
| Boromir | Gondor   |
| Faramir | Gondor   |

Результат запроса должен быть примерно таким: Фродо, Сэм, Мерри, Боромир, Фарамир

1 Ответ

0 голосов
/ 09 ноября 2018

Я не думаю, что можно получить именно то, что вы хотите. По сути, вы делаете группирование (объединение терминов) в поле местоположения. Поскольку невозможно точно узнать, сколько у вас локаций, количество групп не ограничено. Таким образом, если есть 101 группа и вы возвращаете одно имя на группу, вы получите 101 результат. И если мы фильтруем до 100 максимальных результатов, какую группу мы отбрасываем? Random

Тем не менее, вы можете получить верхние x местоположения, где местоположения сортируются по убыванию, хотя вы можете изменить порядок сортировки . 33 местоположения ведра с 3 результатами на ведро 99 ... достаточно близко?

Таким образом, вы можете получить не более 3 результатов для каждого местоположения для 33 местоположений, используя агрегирование терминов и вложенное агрегация топ-хитов

GET lotr/_search?size=0
{
  "aggs": {
    "location": {
      "terms": {
        "field": "location",
        "size": 33
      },
      "aggs": {
        "name": {
          "top_hits": {
            "size": 3,
            "_source": {
              "includes": ["name"]
            }
          }
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...