Как получить все значения для вложенного поля с помощью elasticsearch?

#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. Спасибо. Я уже пробовал примеры, перечисленные в этом разделе документации, но не могу заставить их возвращать что-либо, кроме пустых ведер. Не могли бы вы привести пример, используя приведенный мной сценарий?