文字統計の集約

集約された文書から抽出された文字値に対して統計を計算する multi-value メトリクス集約です。これらの値は、特定の keyword フィールドから取得できます。

文字統計の集約は、以下の結果を返します:

  • count - カウントされた非空フィールドの数。
  • min_length - 最短用語の長さ。
  • max_length - 最長用語の長さ。
  • avg_length - すべての用語に対して計算された平均長。
  • entropy - 集約によって収集されたすべての用語に対して計算された シャノンエントロピー 値。シャノンエントロピーは、フィールドに含まれる情報の量を定量化します。これは、データセットの多様性、類似性、ランダム性など、さまざまな特性を測定するための非常に有用な指標です。

例えば:

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. size="0",
  4. aggs={
  5. "message_stats": {
  6. "string_stats": {
  7. "field": "message.keyword"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. message_stats: {
  7. string_stats: {
  8. field: 'message.keyword'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: 0,
  4. aggs: {
  5. message_stats: {
  6. string_stats: {
  7. field: "message.keyword",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. POST /my-index-000001/_search?size=0
  2. {
  3. "aggs": {
  4. "message_stats": { "string_stats": { "field": "message.keyword" } }
  5. }
  6. }

上記の集約は、すべての文書における message フィールドの文字統計を計算します。集約タイプは string_stats で、field パラメータは統計が計算される文書のフィールドを定義します。上記は以下を返します:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "message_stats": {
  5. "count": 5,
  6. "min_length": 24,
  7. "max_length": 30,
  8. "avg_length": 28.8,
  9. "entropy": 3.94617750050791
  10. }
  11. }
  12. }

集約の名前(上記の message_stats)は、返されたレスポンスから集約結果を取得するためのキーとしても機能します。

文字の分布

シャノンエントロピー値の計算は、集約によって収集されたすべての用語における各文字の出現確率に基づいています。すべての文字の確率分布を表示するには、show_distribution(デフォルト:false)パラメータを追加できます。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. size="0",
  4. aggs={
  5. "message_stats": {
  6. "string_stats": {
  7. "field": "message.keyword",
  8. "show_distribution": True
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. message_stats: {
  7. string_stats: {
  8. field: 'message.keyword',
  9. show_distribution: true
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: 0,
  4. aggs: {
  5. message_stats: {
  6. string_stats: {
  7. field: "message.keyword",
  8. show_distribution: true,
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST /my-index-000001/_search?size=0
  2. {
  3. "aggs": {
  4. "message_stats": {
  5. "string_stats": {
  6. "field": "message.keyword",
  7. "show_distribution": true
  8. }
  9. }
  10. }
  11. }
show_distribution パラメータを true に設定し、すべての文字の確率分布が結果に返されるようにします。

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "message_stats": {
  5. "count": 5,
  6. "min_length": 24,
  7. "max_length": 30,
  8. "avg_length": 28.8,
  9. "entropy": 3.94617750050791,
  10. "distribution": {
  11. " ": 0.1527777777777778,
  12. "e": 0.14583333333333334,
  13. "s": 0.09722222222222222,
  14. "m": 0.08333333333333333,
  15. "t": 0.0763888888888889,
  16. "h": 0.0625,
  17. "a": 0.041666666666666664,
  18. "i": 0.041666666666666664,
  19. "r": 0.041666666666666664,
  20. "g": 0.034722222222222224,
  21. "n": 0.034722222222222224,
  22. "o": 0.034722222222222224,
  23. "u": 0.034722222222222224,
  24. "b": 0.027777777777777776,
  25. "w": 0.027777777777777776,
  26. "c": 0.013888888888888888,
  27. "E": 0.006944444444444444,
  28. "l": 0.006944444444444444,
  29. "1": 0.006944444444444444,
  30. "2": 0.006944444444444444,
  31. "3": 0.006944444444444444,
  32. "4": 0.006944444444444444,
  33. "y": 0.006944444444444444
  34. }
  35. }
  36. }
  37. }

distribution オブジェクトは、すべての用語における各文字の出現確率を示します。文字は降順に確率でソートされています。

スクリプト

単一のフィールドよりも複雑な何かの string_stats を取得する必要がある場合は、ランタイムフィールドで集約を実行します。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. size=0,
  4. runtime_mappings={
  5. "message_and_context": {
  6. "type": "keyword",
  7. "script": "\n emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)\n "
  8. }
  9. },
  10. aggs={
  11. "message_stats": {
  12. "string_stats": {
  13. "field": "message_and_context"
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: 0,
  4. runtime_mappings: {
  5. message_and_context: {
  6. type: "keyword",
  7. script:
  8. "\n emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)\n ",
  9. },
  10. },
  11. aggs: {
  12. message_stats: {
  13. string_stats: {
  14. field: "message_and_context",
  15. },
  16. },
  17. },
  18. });
  19. console.log(response);

コンソール

  1. POST /my-index-000001/_search
  2. {
  3. "size": 0,
  4. "runtime_mappings": {
  5. "message_and_context": {
  6. "type": "keyword",
  7. "script": """
  8. emit(doc['message.keyword'].value + ' ' + doc['context.keyword'].value)
  9. """
  10. }
  11. },
  12. "aggs": {
  13. "message_stats": {
  14. "string_stats": { "field": "message_and_context" }
  15. }
  16. }
  17. }

欠損値

missing パラメータは、値が欠損している文書がどのように扱われるべきかを定義します。デフォルトでは無視されますが、値があるかのように扱うことも可能です。

Python

  1. resp = client.search(
  2. index="my-index-000001",
  3. size="0",
  4. aggs={
  5. "message_stats": {
  6. "string_stats": {
  7. "field": "message.keyword",
  8. "missing": "[empty message]"
  9. }
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my-index-000001',
  3. size: 0,
  4. body: {
  5. aggregations: {
  6. message_stats: {
  7. string_stats: {
  8. field: 'message.keyword',
  9. missing: '[empty message]'
  10. }
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. index: "my-index-000001",
  3. size: 0,
  4. aggs: {
  5. message_stats: {
  6. string_stats: {
  7. field: "message.keyword",
  8. missing: "[empty message]",
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST /my-index-000001/_search?size=0
  2. {
  3. "aggs": {
  4. "message_stats": {
  5. "string_stats": {
  6. "field": "message.keyword",
  7. "missing": "[empty message]"
  8. }
  9. }
  10. }
  11. }
message フィールドに値がない文書は、[empty message] の値を持つ文書として扱われます。