ElasticSearch - как отобразить дополнительное имя поля в агрегированном запросе
Как добавить новый ключ с именем "agency_name" в мой выходной блок.
Я запускаю код агрегации, как показано ниже
{
"aggs": {
"name": {
"terms": {
"field": "agency_code"
}
}
}
}
Я получаю сообщение вне
"aggregations": {
"name": {
"doc_count_error_upper_bound": 130,
"sum_other_doc_count": 39921,
"buckets": [
{
"key": "1000",
"doc_count": 105163
},
{
"key": "2100",
"doc_count": 43006
}
]
}
}
Во время отображения мне нужно показать имя агентства, код и doc_count
Как я могу изменить запрос агрегации, чтобы получить следующий формат. Я новичок в ElasticSearch, не знаю, как это исправить.
"aggregations": {
"name": {
"doc_count_error_upper_bound": 130,
"sum_other_doc_count": 39921,
"buckets": [
{
"key": "1000",
"doc_count": 105163,
"agency_name": 'Agent 1'
},
{
"key": "2100",
"doc_count": 43006,
"agency_name": 'Agent 2'
}
]
}
}
Примеры данных в ElasticSearch (поля анализируются)
{
"_index": "feeds",
"_type": "news",
"_id": "22005",
"_version": 1,
"_score": 1,
"_source": {
"id": 22005,
"name": "Test News",
"agency_name": "Agent 1",
"agency_code": "1000",
}
}
Ответы
Ответ 1
Вы можете использовать агрегацию топ-хитов, как в приведенной ниже ссылке. Формат будет немного отличаться, так как создание дополнительной агрегации будет вставлять название агентства под другой ключ "hits".
Добавление дополнительных полей в агрегацию терминов ElasticSearch
{
"aggs": {
"name": {
"terms": {
"field": "agency_code"
},
"aggs": {
"agency_names" : {
"top_hits": {
size: 1,
_source: {
include: ['agency_name']
}
}
}
}
}
}
}
Ответ 2
Я думаю, вам нужно будет добавить к нему еще одно "aggs". Но это было бы не в том формате, в котором вы хотите, а как в другом поле на выходе, поэтому в настоящее время вы агрегируете на основе "agency_code", а doc_count показывает, сколько раз происходит код конкретного агентства. Теперь, когда вы хотите скомпилировать его на основе "agency_name", поле может быть в разных документах, кроме "agency_code", а также в разных числах, если они всегда существуют в паре, чем это может означать индексирование родительского ребенка.
https://www.elastic.co/guide/en/elasticsearch/guide/current/indexing-parent-child.html
Ответ 3
Это старое сообщение, однако я столкнулся с той же проблемой, и я следил за тем, что дано в https://www.elastic.co/guide/en/elasticsearch/reference/current/agg-metadata.html. Добавьте данные метаданных, и они возвращаются как часть результата над ведром. Надеюсь, что это поможет кому-то в будущем.
Ответ 4
У ES нет способа узнать, что agency_name
и agency_code
сопоставляются взаимно однозначно. Поэтому я бы рекомендовал ряд возможных стратегий.
- Не анализируйте
agency_name
и используйте термин agg над этим полем. Я был бы удивлен, если вам действительно нужно сделать токенизацию agency_name
.
- Хранить идентификатор для сопоставления имен в реляционной базе данных или плоском кеше файлов и выполнять клиентскую часть соединения
- Храните документы агентства как другой тип и делайте два вызова. Первый, чтобы получить идентификаторы, а затем второй, чтобы найти агентства по id
Как уже упоминал Aditya Patel, отношения родительского ребенка могут помочь, но я считаю, что вам все равно придется использовать одну из вышеперечисленных стратегий для разрешения сопоставления имен id- > .