Группировка значений в агрегации - PullRequest
0 голосов
/ 10 октября 2018

Я довольно новичок в Elasticsearch.

У меня есть запрос, который выглядит так:

GET animals/_search

{
  "aggregations" : {
    "top_animals" : {
      "terms" : {"field" : "animals", "size" : 10}
    }
  },
  "size" : 0
}

Это возвращает что-то вроде:

{
  (...)
  "aggregations": {
    "top_animals": {
      (...)
      "buckets": [
        {
          "key": "dogs",
          "doc_count": 100
        },
        {
          "key": "whales",
          "doc_count": 70
        },
        {
          "key": "dolphins",
          "doc_count": 50
        },
        {
          "key": "cats",
          "doc_count": 10
        }
      ]
    }
  }
}

СейчасМне дали список животных, которые эквивалентны и должны учитываться вместе.Поэтому «собаки» и «кошки» - это «домашние животные», а «дельфины» и «киты» - это «aquatic_mammals».

Мне бы хотелось получить такой результат (обратите внимание, что результаты упорядочены):

{
  (...)
  "aggregations": {
    "top_animals": {
      (...)
      "buckets": [
        {
          "key": "aquatic_mammals",
          "doc_count": 120
        },
        {
          "key": "pets",
          "doc_count": 110
        }
      ]
    }
  }
}

Как мне изменить мой запрос?

Спасибо!

1 Ответ

0 голосов
/ 11 октября 2018

Если я вас хорошо понимаю, значения pets и aquatic не являются частью хранимых данных?

Возможно, есть сценарий (который я не могу проверить, поэтому ..удачи!), что-то вроде:

GET animals/_search

{
  "aggregations" : {
    "top_animals" : {
      "terms" : {
        "field": "animals",
        "script" : {
          "source": """
            if (_value == 'cats' || _value == 'dogs') {
              return 'pets';
            } else if (_value == 'whales' || _value == 'dolphins') {
              return 'aquatic';
            } else {
              return 'alien';
            }
          """,
          "lang": "painless"
        },
        "size" : 10
      }
    }
  },
  "size" : 0
}

Здесь _value установлено, потому что нацелен на "field".Проверьте совокупность терминов документация .

Писать довольно скучно, потому что switch, кажется, не существует на их языке, но это должно сработать.Кроме того, у более опытного программиста могут быть более короткие / лучшие способы написания этого сценария: я никогда не пользовался этим «безболезненным» сценарием.

Надеюсь, это поможет.И работает.;)

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