#elasticsearch
Вопрос:
Я могу получить все значения в базе данных для текстового поля, используя агрегированный запрос в эластичном поиске 6.8:
{
aggs: {
values: {
terms: { field: 'City.keyword', size: 200 },
},
},
size: 0,
};
Я пытаюсь сделать то же самое для вложенного поля.
Ниже приведен пример текстового поля (Город) и вложенного поля (Охлаждение)
"City": "Fredericksburg",
"Cooling": [
{
"key": "Fuel",
"value": "Electric"
},
{
"key": "Central Air",
"value": "Y"
},
{
"key": "Central A/C",
"value": "true"
}
],
И вот документация, на которую я ссылался:
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations-bucket-terms-aggregation.html
Вот соответствующее отображение:
{
"listings:366": {
"mappings": {
"_default_": {
"_all": {
"enabled": false
},
"dynamic_templates": [
...
{
"Cooling": {
"path_match": "Cooling.*",
"mapping": {
"type": "text"
}
}
},
...
],
"properties": {
...
"Cooling": {
"type": "nested"
},
...
}
},
"listings": {
"_all": {
"enabled": false
},
"dynamic_templates": [
...
{
"Cooling": {
"path_match": "Cooling.*",
"mapping": {
"type": "text"
}
}
},
...
],
"properties": {
...
"Cooling": {
"type": "nested",
"properties": {
"key": {
"type": "text"
},
"value": {
"type": "text"
}
}
},
}
}
}
}
}
Ответ №1:
Если Cooling
имеет nested
тип, то вы можете достичь желаемого terms
, сначала вложив агрегацию в агрегацию верхнего уровня nested
, чтобы «погрузиться» во вложенные документы.:
{
"size": 0,
"aggs": {
"cooling": {
"nested": {
"path": " Cooling"
},
"aggs": {
"values": {
"terms": {
"field": "Cooling.key", <--- make sure this field is mapped as keyword
"size": 200
}
}
}
}
}
}
Обновить
Ваше отображение должно измениться на это:
"properties": {
...
"Cooling": {
"type": "nested",
"properties": {
"key": {
"type": "keyword" <--- change this
},
"value": {
"type": "text"
}
}
},
}
Комментарии:
1. Спасибо, это выглядит правильно, но он по-прежнему возвращает нулевые ячейки в массиве ячеек.
2. Можете ли вы обновить свой вопрос с помощью реального отображения вашего индекса, пожалуйста, используя
GET your-index-name
?3. Я добавил соответствующее отображение, надеясь, что это то, что вы искали.
4. Хорошо, проблема в том , что
Cooling.key
должно быть сопоставлено какkeyword
вместоtext
, иначе агрегации не будут работать5. Перечитайте мой комментарий, пожалуйста. Ваше поле имеет тип
text
, и оно должно иметь типkeyword
, иначе оно не будет работать. Смотрите мой обновленный ответ
Ответ №2:
попробуйте использовать составную агрегацию : см. раздел Составная агрегация
Комментарии:
1. Спасибо. Я уже пробовал примеры, перечисленные в этом разделе документации, но не могу заставить их возвращать что-либо, кроме пустых ведер. Не могли бы вы привести пример, используя приведенный мной сценарий?