Elasticsearch включает другие поля в агрегации верхнего уровня - PullRequest
0 голосов
/ 01 марта 2019

Мои проиндексированные документы выглядят следующим образом:

{
  "user": { 
     "email": "test@test.com",
     "firstName": "test",
     "lastName": "test" 
  },
  ...
  "category": "test_category"
}

В настоящее время у меня есть агрегат, который подсчитывает документы по электронной почте пользователя, а затем подгруппу для подсчета категорий для каждого пользователя:

"aggs": {
  "users": {
    "terms": {
      "field": "user.email",
      "order": {
        "_count": "desc"
      }
    },
    "aggs": {
      "categories": {
        "terms": {
          "field": "category",
          "order": {
            "_count": "desc"
          }
        }
      }
    }
  }
}

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

Есть какой-нибудь совет?Спасибо!

РЕДАКТИРОВАТЬ:

Позвольте мне перефразировать.Я действительно получил желаемый результат с точки зрения пользовательских данных с агрегацией top_hits, я просто не знаю, как правильно включить ее в исходное агрегирование, чтобы субагрегация categories по-прежнему давала мне тот же результат.Я попробовал следующее top_hits агрегирование:

"aggs": {
  "user": {
    "top_hits": {
      "size": 1,
      "_source": {
        "include": ["user"]
      }
    }
  }
}

Я хочу, чтобы пользовательские данные были в верхних сегментах агг, а затем все еще иметь агрегирование по категориям ниже этого.

1 Ответ

0 голосов
/ 01 марта 2019

Если я прав, у фамилии пользователя и имени есть биекция.

Таким образом, вы можете получить их, используя таможенный скрипт для этих полей (и извлечь значение этих сегментов на стороне клиента, разделив их символом «_» или wathever).разделитель)

aggs: {
  users: {
    terms: {
        script: 'doc["users.email"].value + "_" + doc["users.firstName"].value + "_" + doc["users.lastName"].value'
    }
  }
}
...