Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Отображение ›Поля во время выполнения

Определение полей во время выполнения в запросе на поиск

Вы можете указать раздел runtime_mappings в запросе на поиск для создания полей во время выполнения, которые существуют только в рамках запроса. Вы указываете скрипт в разделе runtime_mappings, точно так же, как если бы вы добавляли поле во время выполнения в отображение.

Определение поля во время выполнения в запросе на поиск использует тот же формат, что и определение поля во время выполнения в отображении индекса. Просто скопируйте определение поля из раздела runtime_mappings в запросе на поиск в раздел runtime отображения индекса.

Следующий запрос на поиск добавляет поле day_of_week в раздел runtime_mappings. Значения поля будут вычисляться динамически и только в контексте этого запроса на поиск:

GET my-index-000001/_search
{
  "runtime_mappings": {
    "day_of_week": {
      "type": "keyword",
      "script": {
        "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
      }
    }
  },
  "aggs": {
    "day_of_week": {
      "terms": {
        "field": "day_of_week"
      }
    }
  }
}

Создание полей во время выполнения, использующих другие поля во время выполнения

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

POST my-index-000001/_bulk?refresh=true
{"index":{}}
{"@timestamp":1516729294000,"model_number":"QVKC92Q","measures":{"voltage":"5.2","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516642894000,"model_number":"QVKC92Q","measures":{"voltage":"5.8","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516556494000,"model_number":"QVKC92Q","measures":{"voltage":"5.1","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516470094000,"model_number":"QVKC92Q","measures":{"voltage":"5.6","start": "300","end":"8675309"}}
{"index":{}}
{"@timestamp":1516383694000,"model_number":"HG537PU","measures":{"voltage":"4.2","start": "400","end":"8625309"}}
{"index":{}}
{"@timestamp":1516297294000,"model_number":"HG537PU","measures":{"voltage":"4.0","start": "400","end":"8625309"}}

Вы понимаете после индексирования, что ваши числовые данные были отображены как тип text. Вы хотите выполнить агрегацию по полям measures.start и measures.end, но агрегация терпит неудачу, потому что вы не можете выполнить агрегацию по полям типа text. На помощь приходят поля во время выполнения! Вы можете добавить поля во время выполнения с тем же именем, что и ваши индексированные поля, и изменить тип данных:

PUT my-index-000001/_mapping
{
  "runtime": {
    "measures.start": {
      "type": "long"
    },
    "measures.end": {
      "type": "long"
    }
  }
}

Поля во время выполнения имеют приоритет над полями, определёнными с тем же именем в отображениях индексов. Эта гибкость позволяет вам «затенять» существующие поля и вычислять другое значение без изменения самого поля. Если вы допустили ошибку в своём отображении индекса, вы можете использовать поля во время выполнения для вычисления значений, которые перезаписывают значения в отображении во время запроса на поиск.

Теперь вы можете легко выполнить агрегацию среднего значения (Avg aggregation) по полям measures.start и measures.end:

GET my-index-000001/_search
{
  "aggs": {
    "avg_start": {
      "avg": {
        "field": "measures.start"
      }
    },
    "avg_end": {
      "avg": {
        "field": "measures.end"
      }
    }
  }
}

Ответ включает результаты агрегации без изменения значений базовых данных:

{
  "aggregations" : {
    "avg_start" : {
      "value" : 333.3333333333333
    },
    "avg_end" : {
      "value" : 8658642.333333334
    }
  }
}

Кроме того, вы можете определить поле во время выполнения в рамках запроса на поиск, которое вычисляет значение, а затем выполнить агрегацию по этому полю (Stats aggregation) в том же запросе.

Поле во время выполнения duration не существует в отображении индекса, но мы все равно можем искать и агрегировать по этому полю. Следующий запрос возвращает вычисленное значение для поля duration и выполняет агрегацию по статистике для вычисления статистики числовых значений, извлечённых из агрегированных документов.

GET my-index-000001/_search
{
  "runtime_mappings": {
    "duration": {
      "type": "long",
      "script": {
        "source": """
          emit(doc['measures.end'].value - doc['measures.start'].value);
          """
      }
    }
  },
  "aggs": {
    "duration_stats": {
      "stats": {
        "field": "duration"
      }
    }
  }
}

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

{
  "aggregations" : {
    "duration_stats" : {
      "count" : 6,
      "min" : 8624909.0,
      "max" : 8675009.0,
      "avg" : 8658309.0,
      "sum" : 5.1949854E7
    }
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/runtime-search-request.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API