Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Агрегации ›Агрегации метрик

Агрегация string stats

Агрегация метрик, которая вычисляет статистику по строковым значениям, извлечённым из агрегированных документов. Эти значения могут быть получены из конкретных keyword полей.

Агрегация string stats возвращает следующие результаты:

  • count — количество непустых подсчитанных полей.
  • min_length — длина наименьшего термина.
  • max_length — длина наибольшего термина.
  • avg_length — средняя длина, вычисленная по всем терминам.
  • entropy — значение энтропии Шеннона, вычисленное по всем терминам, собранным агрегацией. Энтропия Шеннона количественно определяет количество информации, содержащейся в поле. Это очень полезная метрика для измерения широкого спектра свойств набора данных, таких как разнообразие, сходство, случайность и т. д.

Например:

resp = client.search(
    index="my-index-000001",
    size="0",
    aggs={
        "message_stats": {
            "string_stats": {
                "field": "message.keyword"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  size: 0,
  aggs: {
    message_stats: {
      string_stats: {
        field: "message.keyword",
      },
    },
  },
});
console.log(response);
POST /my-index-000001/_search?size=0
{
  "aggs": {
    "message_stats": { "string_stats": { "field": "message.keyword" } }
  }
}

Вышеуказанная агрегация вычисляет строковую статистику для message поля во всех документах. Тип агрегации — string_stats, а параметр field определяет поле документов, по которому будет вычисляться статистика. В результате будет возвращено следующее:

{
  ...

  "aggregations": {
    "message_stats": {
      "count": 5,
      "min_length": 24,
      "max_length": 30,
      "avg_length": 28.8,
      "entropy": 3.94617750050791
    }
  }
}

Имя агрегации (message_stats выше) также служит ключом, по которому можно получить результат агрегации из возвращённого ответа.

Распределение символов

Вычисление значения энтропии Шеннона основано на вероятности появления каждого символа во всех терминах, собранных агрегацией. Чтобы просмотреть распределение вероятностей для всех символов, можно добавить параметр show_distribution (по умолчанию: false).

resp = client.search(
    index="my-index-000001",
    size="0",
    aggs={
        "message_stats": {
            "string_stats": {
                "field": "message.keyword",
                "show_distribution": True
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword',
          show_distribution: true
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  size: 0,
  aggs: {
    message_stats: {
      string_stats: {
        field: "message.keyword",
        show_distribution: true,
      },
    },
  },
});
console.log(response);
POST /my-index-000001/_search?size=0
{
  "aggs": {
    "message_stats": {
      "string_stats": {
        "field": "message.keyword",
        "show_distribution": true  
      }
    }
  }
}

Установите параметр show_distribution в значение true, чтобы распределение вероятностей всех символов было возвращено в результатах.

{
  ...

  "aggregations": {
    "message_stats": {
      "count": 5,
      "min_length": 24,
      "max_length": 30,
      "avg_length": 28.8,
      "entropy": 3.94617750050791,
      "distribution": {
        " ": 0.1527777777777778,
        "e": 0.14583333333333334,
        "s": 0.09722222222222222,
        "m": 0.08333333333333333,
        "t": 0.0763888888888889,
        "h": 0.0625,
        "a": 0.041666666666666664,
        "i": 0.041666666666666664,
        "r": 0.041666666666666664,
        "g": 0.034722222222222224,
        "n": 0.034722222222222224,
        "o": 0.034722222222222224,
        "u": 0.034722222222222224,
        "b": 0.027777777777777776,
        "w": 0.027777777777777776,
        "c": 0.013888888888888888,
        "E": 0.006944444444444444,
        "l": 0.006944444444444444,
        "1": 0.006944444444444444,
        "2": 0.006944444444444444,
        "3": 0.006944444444444444,
        "4": 0.006944444444444444,
        "y": 0.006944444444444444
      }
    }
  }
}

Объект distribution показывает вероятность появления каждого символа во всех терминах. Символы отсортированы по убыванию вероятности.

Сценарий

Если вам нужно получить string_stats для чего-то более сложного, чем одно поле, выполните агрегацию на поле runtime.

resp = client.search(
    index="my-index-000001",
    size=0,
    runtime_mappings={
        "message_and_context": {
            "type": "keyword",
            "script": "\n        emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)\n      "
        }
    },
    aggs={
        "message_stats": {
            "string_stats": {
                "field": "message_and_context"
            }
        }
    },
)
print(resp)
const response = await client.search({
  index: "my-index-000001",
  size: 0,
  runtime_mappings: {
    message_and_context: {
      type: "keyword",
      script:
        "\n        emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)\n      ",
    },
  },
  aggs: {
    message_stats: {
      string_stats: {
        field: "message_and_context",
      },
    },
  },
});
console.log(response);
POST /my-index-000001/_search
{
  "size": 0,
  "runtime_mappings": {
    "message_and_context": {
      "type": "keyword",
      "script": """
        emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)
      """
    }
  },
  "aggs": {
    "message_stats": {
      "string_stats": { "field": "message_and_context" }
    }
  }
}

Пропущенное значение

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

resp = client.search(
    index="my-index-000001",
    size="0",
    aggs={
        "message_stats": {
            "string_stats": {
                "field": "message.keyword",
                "missing": "[empty message]"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my-index-000001',
  size: 0,
  body: {
    aggregations: {
      message_stats: {
        string_stats: {
          field: 'message.keyword',
          missing: '[empty message]'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "my-index-000001",
  size: 0,
  aggs: {
    message_stats: {
      string_stats: {
        field: "message.keyword",
        missing: "[empty message]",
      },
    },
  },
});
console.log(response);
POST /my-index-000001/_search?size=0
{
  "aggs": {
    "message_stats": {
      "string_stats": {
        "field": "message.keyword",
        "missing": "[empty message]" 
      }
    }
  }
}

Документы без значения в поле message будут обрабатываться как документы со значением [empty message].

© 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/8.17/search-aggregations-metrics-string-stats-aggregation.html

Spec-Zone.ru

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