テキスト構造APIの検索
テキストの構造を見つけます。テキストには、Elastic Stackに取り込むのに適したデータが含まれている必要があります。
リクエスト
POST _text_structure/find_structure
前提条件
- Elasticsearchのセキュリティ機能が有効になっている場合、このAPIを使用するには
monitor_text_structure
またはmonitor
のクラスター権限が必要です。詳細はセキュリティ権限を参照してください。
説明
このAPIは、Elasticsearchにデータを取り込むための出発点を提供し、他のElastic Stack機能での後続の使用に適した形式です。
他のElasticsearchエンドポイントとは異なり、このエンドポイントに投稿されるデータはUTF-8エンコードされている必要はなく、JSON形式である必要もありません。ただし、テキストである必要があります。バイナリテキスト形式は現在サポートされていません。
APIからの応答には次の情報が含まれます:
- テキストの最初の数行からのメッセージ。
- テキスト内で検出されたすべてのフィールドの最も一般的な値を示す統計と、数値フィールドの基本的な数値統計。
- テキストの構造に関する情報。これは、インデックス作成のための取り込み構成を書くときや、同様の形式のテキストを書くときに役立ちます。
- テキストを取り込むために使用できるElasticsearchインデックスの適切なマッピング。
このすべての情報は、構造ファインダーによってガイダンスなしで計算できます。ただし、1つ以上のクエリパラメータを指定することで、テキスト構造に関するいくつかの決定をオーバーライドすることができます。
出力の詳細は例で確認できます。
構造ファインダーが一部のテキストに対して予期しない結果を生成した場合は、explain
クエリパラメータを指定してください。これにより、応答にexplanation
が表示され、返された構造が選択された理由を特定するのに役立ちます。
クエリパラメータ
charset
- (オプション、文字列) テキストの文字セット。Elasticsearchが使用するJVMによってサポートされている文字セットである必要があります。たとえば、
UTF-8
、UTF-16LE
、windows-1252
、またはEUC-JP
です。このパラメータが指定されていない場合、構造ファインダーは適切な文字セットを選択します。 column_names
- (オプション、文字列)
format
をdelimited
に設定した場合、カンマ区切りのリストで列名を指定できます。このパラメータが指定されていない場合、構造ファインダーはテキストのヘッダ行から列名を使用します。テキストにヘッダ行がない場合、列は「column1」、「column2」、「column3」などと名付けられます。 delimiter
- (オプション、文字列)
format
をdelimited
に設定した場合、各行の値を区切るために使用される文字を指定できます。サポートされるのは単一の文字のみで、区切り文字は複数の文字を持つことはできません。デフォルトでは、APIは次の可能性を考慮します:カンマ、タブ、セミコロン、およびパイプ(|
)。このデフォルトのシナリオでは、すべての行は区切られた形式を検出するために同じ数のフィールドを持っている必要があります。区切り文字を指定した場合、最初の行とは異なる列数を持つ行は最大10%まで許可されます。 explain
- (オプション、ブール値)
true
の場合、応答にはexplanation
というフィールドが含まれ、これは構造ファインダーが結果を生成した方法を示す文字列の配列です。デフォルト値はfalse
です。 format
- (オプション、文字列) テキストの高レベルの構造。有効な値は
ndjson
、xml
、delimited
、およびsemi_structured_text
です。デフォルトでは、APIは形式を選択します。このデフォルトのシナリオでは、すべての行は区切られた形式を検出するために同じ数のフィールドを持っている必要があります。ただし、format
がdelimited
に設定され、delimiter
が設定されていない場合、APIは最初の行とは異なる列数を持つ行を最大5%まで許容します。 grok_pattern
- (オプション、文字列)
format
をsemi_structured_text
に設定した場合、テキスト内の各メッセージからフィールドを抽出するために使用されるGrokパターンを指定できます。Grokパターン内のタイムスタンプフィールドの名前は、timestamp_field
パラメータで指定されたものと一致する必要があります。このパラメータが指定されていない場合、Grokパターン内のタイムスタンプフィールドの名前は「timestamp」と一致する必要があります。grok_pattern
が指定されていない場合、構造ファインダーはGrokパターンを作成します。 ecs_compatibility
- (オプション、文字列) ECS準拠のGrokパターンとの互換性のモード。このパラメータを使用して、構造ファインダーがGrokパターンを作成する際に、レガシーのものではなくECS Grokパターンを使用するかどうかを指定します。有効な値は
disabled
とv1
です。デフォルト値はdisabled
です。この設定は、%{CATALINALOG}
のような全メッセージGrokパターンが入力に一致する場合に主に影響します。構造ファインダーが一般的な構造を特定するが意味を理解していない場合、path
、ipaddress
、field1
、およびfield2
のような一般的なフィールド名がgrok_pattern
出力に使用され、意味を知っているユーザーがこれらのフィールドの名前を変更して使用することを意図しています。 has_header_row
- (オプション、ブール値)
format
をdelimited
に設定した場合、テキストの最初の行に列名があるかどうかを示すためにこのパラメータを使用できます。このパラメータが指定されていない場合、構造ファインダーはテキストの最初の行と他の行の類似性に基づいて推測します。 line_merge_size_limit
- (オプション、符号なし整数) 半構造化テキストを分析する際に、行がメッセージを形成するためにマージされるときのメッセージ内の最大文字数。デフォルトは
10000
です。非常に長いメッセージがある場合は、これを増やす必要があるかもしれませんが、行をメッセージにグループ化する方法が誤って検出されると、非常に長い処理時間がかかる可能性があることに注意してください。 lines_to_sample
- (オプション、符号なし整数) テキストの最初から構造分析に含める行の数。最小は2で、デフォルトは
1000
です。このパラメータの値がテキストの行数を超える場合、分析は(テキストに少なくとも2行がある限り)すべての行に対して進行します。
行数と行の変動は分析の速度に影響します。たとえば、最初の1000行がすべて同じメッセージのバリエーションであるテキストをアップロードすると、分析はより多くの共通性を見つけますが、より大きなサンプルでは見られないでしょう。ただし、可能であれば、最初の1000行により多くのバリエーションがあるサンプルテキストをアップロードする方が、100000行の分析を要求してバリエーションを得るよりも効率的です。 quote
- (オプション、文字列)
format
をdelimited
に設定した場合、各行の値に改行や区切り文字が含まれている場合に、それらを引用するために使用される文字を指定できます。サポートされるのは単一の文字のみです。このパラメータが指定されていない場合、デフォルト値は二重引用符("
)です。区切り文字を使用しない形式のテキストでは、サンプル内に出現しない文字にこの引数を設定することで回避策を講じることができます。 should_trim_fields
- (オプション、ブール値)
format
をdelimited
に設定した場合、区切り文字の間の値から空白を削除するかどうかを指定できます。このパラメータが指定されていない場合、区切り文字がパイプ(|
)の場合、デフォルト値はtrue
です。それ以外の場合、デフォルト値はfalse
です。 timeout
- (オプション、時間単位) 構造分析にかかる最大時間を設定します。タイムアウトが切れると分析がまだ実行中の場合、分析は停止されます。デフォルト値は25秒です。
timestamp_field
- (オプション、文字列) テキスト内の各レコードの主要なタイムスタンプを含むフィールドの名前。特に、テキストがインデックスに取り込まれた場合、これは
@timestamp
フィールドを埋めるために使用されるフィールドです。format
がsemi_structured_text
の場合、このフィールドはgrok_pattern
で適切な抽出の名前と一致する必要があります。したがって、半構造化テキストの場合、grok_pattern
が指定されていない限り、このパラメータを指定しない方が良いです。
構造化テキストの場合、このパラメータを指定した場合、フィールドはテキスト内に存在する必要があります。
このパラメータが指定されていない場合、構造ファインダーは主要なタイムスタンプフィールドがどれかを決定します。構造化テキストの場合、テキストにタイムスタンプがあることは必須ではありません。 timestamp_format
- (オプション、文字列) テキスト内のタイムスタンプフィールドのJava時間形式。
サポートされているのはJava時間形式の文字グループのサブセットのみです:a
d
dd
EEE
EEEE
H
HH
h
M
MM
MMM
MMMM
mm
ss
XX
XXX
yy
yyyy
zzz
さらに、S
の文字グループ(小数秒)の長さが1から9のものが、ss
の後に発生し、ss
から.
、,
または:
で区切られている場合にサポートされます。スペースと句読点も許可されますが、?
、改行、キャリッジリターン、およびシングルクォートで囲まれたリテラルテキストは除外されます。たとえば、MM/dd HH.mm.ss,SSSSSS 'in' yyyy
は有効なオーバーライド形式です。
このパラメータの貴重な使用例は、形式が半構造化テキストで、テキスト内に複数のタイムスタンプ形式があり、主要なタイムスタンプに対応する形式がわかっているが、完全なgrok_pattern
を指定したくない場合です。もう1つは、タイムスタンプ形式が構造ファインダーがデフォルトで考慮しないものである場合です。
このパラメータが指定されていない場合、構造ファインダーは組み込みのセットから最適な形式を選択します。
特別な値null
が指定されている場合、構造ファインダーはテキスト内で主要なタイムスタンプを探しません。形式が半構造化テキストの場合、これは構造ファインダーがテキストを単一行メッセージとして扱う結果になります。
次の表は、いくつかの例のタイムスタンプに対する適切なtimeformat
値を提供します:
| 時間形式 | 表示 |
| :— | :— |
| yyyy-MM-dd HH:mm:ssZ | 2019-04-20 13:15:22+0000 |
| EEE, d MMM yyyy HH:mm:ss Z | Sat, 20 Apr 2019 13:15:22 +0000 |
| dd.MM.yy HH:mm:ss.SSS | 20.04.19 13:15:22.285 |
日付と時間の形式構文に関する詳細は、Java日付/時間形式のドキュメントを参照してください。
リクエストボディ
分析したいテキスト。Elasticsearchに取り込むのに適したデータが含まれている必要があります。JSON形式である必要はなく、UTF-8エンコードである必要もありません。サイズは、デフォルトで100MBのElasticsearch HTTP受信バッファサイズに制限されています。
例
改行区切りJSONの取り込み
改行区切りのJSONテキストにいくつかの本に関する情報が含まれているとします。内容をfind_structure
エンドポイントに送信できます:
Python
resp = client.text_structure.find_structure(
text_files=[
{
"name": "Leviathan Wakes",
"author": "James S.A. Corey",
"release_date": "2011-06-02",
"page_count": 561
},
{
"name": "Hyperion",
"author": "Dan Simmons",
"release_date": "1989-05-26",
"page_count": 482
},
{
"name": "Dune",
"author": "Frank Herbert",
"release_date": "1965-06-01",
"page_count": 604
},
{
"name": "Dune Messiah",
"author": "Frank Herbert",
"release_date": "1969-10-15",
"page_count": 331
},
{
"name": "Children of Dune",
"author": "Frank Herbert",
"release_date": "1976-04-21",
"page_count": 408
},
{
"name": "God Emperor of Dune",
"author": "Frank Herbert",
"release_date": "1981-05-28",
"page_count": 454
},
{
"name": "Consider Phlebas",
"author": "Iain M. Banks",
"release_date": "1987-04-23",
"page_count": 471
},
{
"name": "Pandora's Star",
"author": "Peter F. Hamilton",
"release_date": "2004-03-02",
"page_count": 768
},
{
"name": "Revelation Space",
"author": "Alastair Reynolds",
"release_date": "2000-03-15",
"page_count": 585
},
{
"name": "A Fire Upon the Deep",
"author": "Vernor Vinge",
"release_date": "1992-06-01",
"page_count": 613
},
{
"name": "Ender's Game",
"author": "Orson Scott Card",
"release_date": "1985-06-01",
"page_count": 324
},
{
"name": "1984",
"author": "George Orwell",
"release_date": "1985-06-01",
"page_count": 328
},
{
"name": "Fahrenheit 451",
"author": "Ray Bradbury",
"release_date": "1953-10-15",
"page_count": 227
},
{
"name": "Brave New World",
"author": "Aldous Huxley",
"release_date": "1932-06-01",
"page_count": 268
},
{
"name": "Foundation",
"author": "Isaac Asimov",
"release_date": "1951-06-01",
"page_count": 224
},
{
"name": "The Giver",
"author": "Lois Lowry",
"release_date": "1993-04-26",
"page_count": 208
},
{
"name": "Slaughterhouse-Five",
"author": "Kurt Vonnegut",
"release_date": "1969-06-01",
"page_count": 275
},
{
"name": "The Hitchhiker's Guide to the Galaxy",
"author": "Douglas Adams",
"release_date": "1979-10-12",
"page_count": 180
},
{
"name": "Snow Crash",
"author": "Neal Stephenson",
"release_date": "1992-06-01",
"page_count": 470
},
{
"name": "Neuromancer",
"author": "William Gibson",
"release_date": "1984-07-01",
"page_count": 271
},
{
"name": "The Handmaid's Tale",
"author": "Margaret Atwood",
"release_date": "1985-06-01",
"page_count": 311
},
{
"name": "Starship Troopers",
"author": "Robert A. Heinlein",
"release_date": "1959-12-01",
"page_count": 335
},
{
"name": "The Left Hand of Darkness",
"author": "Ursula K. Le Guin",
"release_date": "1969-06-01",
"page_count": 304
},
{
"name": "The Moon is a Harsh Mistress",
"author": "Robert A. Heinlein",
"release_date": "1966-04-01",
"page_count": 288
}
],
)
print(resp)
Ruby
response = client.text_structure.find_structure(
body: [
{
name: 'Leviathan Wakes',
author: 'James S.A. Corey',
release_date: '2011-06-02',
page_count: 561
},
{
name: 'Hyperion',
author: 'Dan Simmons',
release_date: '1989-05-26',
page_count: 482
},
{
name: 'Dune',
author: 'Frank Herbert',
release_date: '1965-06-01',
page_count: 604
},
{
name: 'Dune Messiah',
author: 'Frank Herbert',
release_date: '1969-10-15',
page_count: 331
},
{
name: 'Children of Dune',
author: 'Frank Herbert',
release_date: '1976-04-21',
page_count: 408
},
{
name: 'God Emperor of Dune',
author: 'Frank Herbert',
release_date: '1981-05-28',
page_count: 454
},
{
name: 'Consider Phlebas',
author: 'Iain M. Banks',
release_date: '1987-04-23',
page_count: 471
},
{
name: "Pandora's Star",
author: 'Peter F. Hamilton',
release_date: '2004-03-02',
page_count: 768
},
{
name: 'Revelation Space',
author: 'Alastair Reynolds',
release_date: '2000-03-15',
page_count: 585
},
{
name: 'A Fire Upon the Deep',
author: 'Vernor Vinge',
release_date: '1992-06-01',
page_count: 613
},
{
name: "Ender's Game",
author: 'Orson Scott Card',
release_date: '1985-06-01',
page_count: 324
},
{
name: '1984',
author: 'George Orwell',
release_date: '1985-06-01',
page_count: 328
},
{
name: 'Fahrenheit 451',
author: 'Ray Bradbury',
release_date: '1953-10-15',
page_count: 227
},
{
name: 'Brave New World',
author: 'Aldous Huxley',
release_date: '1932-06-01',
page_count: 268
},
{
name: 'Foundation',
author: 'Isaac Asimov',
release_date: '1951-06-01',
page_count: 224
},
{
name: 'The Giver',
author: 'Lois Lowry',
release_date: '1993-04-26',
page_count: 208
},
{
name: 'Slaughterhouse-Five',
author: 'Kurt Vonnegut',
release_date: '1969-06-01',
page_count: 275
},
{
name: "The Hitchhiker's Guide to the Galaxy",
author: 'Douglas Adams',
release_date: '1979-10-12',
page_count: 180
},
{
name: 'Snow Crash',
author: 'Neal Stephenson',
release_date: '1992-06-01',
page_count: 470
},
{
name: 'Neuromancer',
author: 'William Gibson',
release_date: '1984-07-01',
page_count: 271
},
{
name: "The Handmaid's Tale",
author: 'Margaret Atwood',
release_date: '1985-06-01',
page_count: 311
},
{
name: 'Starship Troopers',
author: 'Robert A. Heinlein',
release_date: '1959-12-01',
page_count: 335
},
{
name: 'The Left Hand of Darkness',
author: 'Ursula K. Le Guin',
release_date: '1969-06-01',
page_count: 304
},
{
name: 'The Moon is a Harsh Mistress',
author: 'Robert A. Heinlein',
release_date: '1966-04-01',
page_count: 288
}
]
)
puts response
Js
const response = await client.textStructure.findStructure({
text_files: [
{
name: "Leviathan Wakes",
author: "James S.A. Corey",
release_date: "2011-06-02",
page_count: 561,
},
{
name: "Hyperion",
author: "Dan Simmons",
release_date: "1989-05-26",
page_count: 482,
},
{
name: "Dune",
author: "Frank Herbert",
release_date: "1965-06-01",
page_count: 604,
},
{
name: "Dune Messiah",
author: "Frank Herbert",
release_date: "1969-10-15",
page_count: 331,
},
{
name: "Children of Dune",
author: "Frank Herbert",
release_date: "1976-04-21",
page_count: 408,
},
{
name: "God Emperor of Dune",
author: "Frank Herbert",
release_date: "1981-05-28",
page_count: 454,
},
{
name: "Consider Phlebas",
author: "Iain M. Banks",
release_date: "1987-04-23",
page_count: 471,
},
{
name: "Pandora's Star",
author: "Peter F. Hamilton",
release_date: "2004-03-02",
page_count: 768,
},
{
name: "Revelation Space",
author: "Alastair Reynolds",
release_date: "2000-03-15",
page_count: 585,
},
{
name: "A Fire Upon the Deep",
author: "Vernor Vinge",
release_date: "1992-06-01",
page_count: 613,
},
{
name: "Ender's Game",
author: "Orson Scott Card",
release_date: "1985-06-01",
page_count: 324,
},
{
name: "1984",
author: "George Orwell",
release_date: "1985-06-01",
page_count: 328,
},
{
name: "Fahrenheit 451",
author: "Ray Bradbury",
release_date: "1953-10-15",
page_count: 227,
},
{
name: "Brave New World",
author: "Aldous Huxley",
release_date: "1932-06-01",
page_count: 268,
},
{
name: "Foundation",
author: "Isaac Asimov",
release_date: "1951-06-01",
page_count: 224,
},
{
name: "The Giver",
author: "Lois Lowry",
release_date: "1993-04-26",
page_count: 208,
},
{
name: "Slaughterhouse-Five",
author: "Kurt Vonnegut",
release_date: "1969-06-01",
page_count: 275,
},
{
name: "The Hitchhiker's Guide to the Galaxy",
author: "Douglas Adams",
release_date: "1979-10-12",
page_count: 180,
},
{
name: "Snow Crash",
author: "Neal Stephenson",
release_date: "1992-06-01",
page_count: 470,
},
{
name: "Neuromancer",
author: "William Gibson",
release_date: "1984-07-01",
page_count: 271,
},
{
name: "The Handmaid's Tale",
author: "Margaret Atwood",
release_date: "1985-06-01",
page_count: 311,
},
{
name: "Starship Troopers",
author: "Robert A. Heinlein",
release_date: "1959-12-01",
page_count: 335,
},
{
name: "The Left Hand of Darkness",
author: "Ursula K. Le Guin",
release_date: "1969-06-01",
page_count: 304,
},
{
name: "The Moon is a Harsh Mistress",
author: "Robert A. Heinlein",
release_date: "1966-04-01",
page_count: 288,
},
],
});
console.log(response);
コンソール
POST _text_structure/find_structure
{"name": "Leviathan Wakes", "author": "James S.A. Corey", "release_date": "2011-06-02", "page_count": 561}
{"name": "Hyperion", "author": "Dan Simmons", "release_date": "1989-05-26", "page_count": 482}
{"name": "Dune", "author": "Frank Herbert", "release_date": "1965-06-01", "page_count": 604}
{"name": "Dune Messiah", "author": "Frank Herbert", "release_date": "1969-10-15", "page_count": 331}
{"name": "Children of Dune", "author": "Frank Herbert", "release_date": "1976-04-21", "page_count": 408}
{"name": "God Emperor of Dune", "author": "Frank Herbert", "release_date": "1981-05-28", "page_count": 454}
{"name": "Consider Phlebas", "author": "Iain M. Banks", "release_date": "1987-04-23", "page_count": 471}
{"name": "Pandora's Star", "author": "Peter F. Hamilton", "release_date": "2004-03-02", "page_count": 768}
{"name": "Revelation Space", "author": "Alastair Reynolds", "release_date": "2000-03-15", "page_count": 585}
{"name": "A Fire Upon the Deep", "author": "Vernor Vinge", "release_date": "1992-06-01", "page_count": 613}
{"name": "Ender's Game", "author": "Orson Scott Card", "release_date": "1985-06-01", "page_count": 324}
{"name": "1984", "author": "George Orwell", "release_date": "1985-06-01", "page_count": 328}
{"name": "Fahrenheit 451", "author": "Ray Bradbury", "release_date": "1953-10-15", "page_count": 227}
{"name": "Brave New World", "author": "Aldous Huxley", "release_date": "1932-06-01", "page_count": 268}
{"name": "Foundation", "author": "Isaac Asimov", "release_date": "1951-06-01", "page_count": 224}
{"name": "The Giver", "author": "Lois Lowry", "release_date": "1993-04-26", "page_count": 208}
{"name": "Slaughterhouse-Five", "author": "Kurt Vonnegut", "release_date": "1969-06-01", "page_count": 275}
{"name": "The Hitchhiker's Guide to the Galaxy", "author": "Douglas Adams", "release_date": "1979-10-12", "page_count": 180}
{"name": "Snow Crash", "author": "Neal Stephenson", "release_date": "1992-06-01", "page_count": 470}
{"name": "Neuromancer", "author": "William Gibson", "release_date": "1984-07-01", "page_count": 271}
{"name": "The Handmaid's Tale", "author": "Margaret Atwood", "release_date": "1985-06-01", "page_count": 311}
{"name": "Starship Troopers", "author": "Robert A. Heinlein", "release_date": "1959-12-01", "page_count": 335}
{"name": "The Left Hand of Darkness", "author": "Ursula K. Le Guin", "release_date": "1969-06-01", "page_count": 304}
{"name": "The Moon is a Harsh Mistress", "author": "Robert A. Heinlein", "release_date": "1966-04-01", "page_count": 288}
コンソール-結果
{
"num_lines_analyzed" : 24,
"num_messages_analyzed" : 24,
"sample_start" : "{\"name\": \"Leviathan Wakes\", \"author\": \"James S.A. Corey\", \"release_date\": \"2011-06-02\", \"page_count\": 561}\n{\"name\": \"Hyperion\", \"author\": \"Dan Simmons\", \"release_date\": \"1989-05-26\", \"page_count\": 482}\n",
"charset" : "UTF-8",
"has_byte_order_marker" : false,
"format" : "ndjson",
"ecs_compatibility" : "disabled",
"timestamp_field" : "release_date",
"joda_timestamp_formats" : [
"ISO8601"
],
"java_timestamp_formats" : [
"ISO8601"
],
"need_client_timezone" : true,
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"author" : {
"type" : "keyword"
},
"name" : {
"type" : "keyword"
},
"page_count" : {
"type" : "long"
},
"release_date" : {
"type" : "date",
"format" : "iso8601"
}
}
},
"ingest_pipeline" : {
"description" : "Ingest pipeline created by text structure finder",
"processors" : [
{
"date" : {
"field" : "release_date",
"timezone" : "{{ event.timezone }}",
"formats" : [
"ISO8601"
]
}
}
]
},
"field_stats" : {
"author" : {
"count" : 24,
"cardinality" : 20,
"top_hits" : [
{
"value" : "Frank Herbert",
"count" : 4
},
{
"value" : "Robert A. Heinlein",
"count" : 2
},
{
"value" : "Alastair Reynolds",
"count" : 1
},
{
"value" : "Aldous Huxley",
"count" : 1
},
{
"value" : "Dan Simmons",
"count" : 1
},
{
"value" : "Douglas Adams",
"count" : 1
},
{
"value" : "George Orwell",
"count" : 1
},
{
"value" : "Iain M. Banks",
"count" : 1
},
{
"value" : "Isaac Asimov",
"count" : 1
},
{
"value" : "James S.A. Corey",
"count" : 1
}
]
},
"name" : {
"count" : 24,
"cardinality" : 24,
"top_hits" : [
{
"value" : "1984",
"count" : 1
},
{
"value" : "A Fire Upon the Deep",
"count" : 1
},
{
"value" : "Brave New World",
"count" : 1
},
{
"value" : "Children of Dune",
"count" : 1
},
{
"value" : "Consider Phlebas",
"count" : 1
},
{
"value" : "Dune",
"count" : 1
},
{
"value" : "Dune Messiah",
"count" : 1
},
{
"value" : "Ender's Game",
"count" : 1
},
{
"value" : "Fahrenheit 451",
"count" : 1
},
{
"value" : "Foundation",
"count" : 1
}
]
},
"page_count" : {
"count" : 24,
"cardinality" : 24,
"min_value" : 180,
"max_value" : 768,
"mean_value" : 387.0833333333333,
"median_value" : 329.5,
"top_hits" : [
{
"value" : 180,
"count" : 1
},
{
"value" : 208,
"count" : 1
},
{
"value" : 224,
"count" : 1
},
{
"value" : 227,
"count" : 1
},
{
"value" : 268,
"count" : 1
},
{
"value" : 271,
"count" : 1
},
{
"value" : 275,
"count" : 1
},
{
"value" : 288,
"count" : 1
},
{
"value" : 304,
"count" : 1
},
{
"value" : 311,
"count" : 1
}
]
},
"release_date" : {
"count" : 24,
"cardinality" : 20,
"earliest" : "1932-06-01",
"latest" : "2011-06-02",
"top_hits" : [
{
"value" : "1985-06-01",
"count" : 3
},
{
"value" : "1969-06-01",
"count" : 2
},
{
"value" : "1992-06-01",
"count" : 2
},
{
"value" : "1932-06-01",
"count" : 1
},
{
"value" : "1951-06-01",
"count" : 1
},
{
"value" : "1953-10-15",
"count" : 1
},
{
"value" : "1959-12-01",
"count" : 1
},
{
"value" : "1965-06-01",
"count" : 1
},
{
"value" : "1966-04-01",
"count" : 1
},
{
"value" : "1969-10-15",
"count" : 1
}
]
}
}
}
num_lines_analyzed は、分析されたテキストの行数を示します。 |
|
num_messages_analyzed は、行に含まれる異なるメッセージの数を示します。NDJSONの場合、この値はnum_lines_analyzed と同じです。他のテキスト形式では、メッセージが複数行にまたがることがあります。 |
|
sample_start は、テキストの最初の2つのメッセージをそのまま再現します。これは、解析エラーや誤って間違ったテキストをアップロードした場合の診断に役立ちます。 |
|
charset は、テキストを解析するために使用された文字エンコーディングを示します。 |
|
UTF文字エンコーディングの場合、has_byte_order_marker は、テキストがバイトオーダーマーカーで始まるかどうかを示します。 |
|
format は、ndjson 、xml 、delimited 、またはsemi_structured_text のいずれかです。 |
|
ecs_compatibility はdisabled またはv1 のいずれかで、デフォルトはdisabled です。 |
|
timestamp_field は、各ドキュメントの主要なタイムスタンプと見なされるフィールドの名前です。 |
|
joda_timestamp_formats は、Logstashにタイムスタンプを解析する方法を伝えるために使用されます。 |
|
java_timestamp_formats は、時間フィールドで認識されるJava時間形式です。Elasticsearchのマッピングと取り込みパイプラインはこの形式を使用します。 |
|
タイムスタンプ形式が検出され、タイムゾーンが含まれていない場合、need_client_timezone はtrue になります。テキストを解析するサーバーは、クライアントによって正しいタイムゾーンを指定される必要があります。 |
|
mappings は、データを取り込むことができるインデックスのための適切なマッピングを含みます。この場合、release_date フィールドは、keyword 型として与えられています。これは、date 型に変換するには特定の情報が不十分と見なされます。 |
|
field_stats は、各フィールドの最も一般的な値と、数値page_count フィールドの基本的な数値統計を含みます。この情報は、データが他のElastic Stack機能で使用される前にクリーンアップまたは変換する必要があることを示す手がかりを提供するかもしれません。 |
NYCイエローキャブの例データの構造を見つける
次の例は、ニューヨーク市のイエローキャブのトリップデータの構造を見つける方法を示しています。最初のcurl
コマンドはデータをダウンロードし、その最初の20000行がfind_structure
エンドポイントにパイプされます。エンドポイントのlines_to_sample
クエリパラメータは、head
コマンドで指定されたものと一致するように20000に設定されています。
Js
curl -s "s3.amazonaws.com/nyc-tlc/trip+data/yellow_tripdata_2018-06.csv" | head -20000 | curl -s -H "Content-Type: application/json" -XPOST "localhost:9200/_text_structure/find_structure?pretty&lines_to_sample=20000" -T -
Content-Type: application/json
ヘッダーは、データがJSONでない場合でも設定する必要があります。(代わりに、Content-Type
をElasticsearchがサポートする他の形式に設定できますが、設定する必要があります。)
リクエストにエラーが発生しなければ、次の結果が得られます:
Js
{
"num_lines_analyzed" : 20000,
"num_messages_analyzed" : 19998,
"sample_start" : "VendorID,tpep_pickup_datetime,tpep_dropoff_datetime,passenger_count,trip_distance,RatecodeID,store_and_fwd_flag,PULocationID,DOLocationID,payment_type,fare_amount,extra,mta_tax,tip_amount,tolls_amount,improvement_surcharge,total_amount\n\n1,2018-06-01 00:15:40,2018-06-01 00:16:46,1,.00,1,N,145,145,2,3,0.5,0.5,0,0,0.3,4.3\n",
"charset" : "UTF-8",
"has_byte_order_marker" : false,
"format" : "delimited",
"multiline_start_pattern" : "^.*?,\"?\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}",
"exclude_lines_pattern" : "^\"?VendorID\"?,\"?tpep_pickup_datetime\"?,\"?tpep_dropoff_datetime\"?,\"?passenger_count\"?,\"?trip_distance\"?,\"?RatecodeID\"?,\"?store_and_fwd_flag\"?,\"?PULocationID\"?,\"?DOLocationID\"?,\"?payment_type\"?,\"?fare_amount\"?,\"?extra\"?,\"?mta_tax\"?,\"?tip_amount\"?,\"?tolls_amount\"?,\"?improvement_surcharge\"?,\"?total_amount\"?",
"column_names" : [
"VendorID",
"tpep_pickup_datetime",
"tpep_dropoff_datetime",
"passenger_count",
"trip_distance",
"RatecodeID",
"store_and_fwd_flag",
"PULocationID",
"DOLocationID",
"payment_type",
"fare_amount",
"extra",
"mta_tax",
"tip_amount",
"tolls_amount",
"improvement_surcharge",
"total_amount"
],
"has_header_row" : true,
"delimiter" : ",",
"quote" : "\"",
"timestamp_field" : "tpep_pickup_datetime",
"joda_timestamp_formats" : [
"YYYY-MM-dd HH:mm:ss"
],
"java_timestamp_formats" : [
"yyyy-MM-dd HH:mm:ss"
],
"need_client_timezone" : true,
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"DOLocationID" : {
"type" : "long"
},
"PULocationID" : {
"type" : "long"
},
"RatecodeID" : {
"type" : "long"
},
"VendorID" : {
"type" : "long"
},
"extra" : {
"type" : "double"
},
"fare_amount" : {
"type" : "double"
},
"improvement_surcharge" : {
"type" : "double"
},
"mta_tax" : {
"type" : "double"
},
"passenger_count" : {
"type" : "long"
},
"payment_type" : {
"type" : "long"
},
"store_and_fwd_flag" : {
"type" : "keyword"
},
"tip_amount" : {
"type" : "double"
},
"tolls_amount" : {
"type" : "double"
},
"total_amount" : {
"type" : "double"
},
"tpep_dropoff_datetime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss"
},
"tpep_pickup_datetime" : {
"type" : "date",
"format" : "yyyy-MM-dd HH:mm:ss"
},
"trip_distance" : {
"type" : "double"
}
}
},
"ingest_pipeline" : {
"description" : "Ingest pipeline created by text structure finder",
"processors" : [
{
"csv" : {
"field" : "message",
"target_fields" : [
"VendorID",
"tpep_pickup_datetime",
"tpep_dropoff_datetime",
"passenger_count",
"trip_distance",
"RatecodeID",
"store_and_fwd_flag",
"PULocationID",
"DOLocationID",
"payment_type",
"fare_amount",
"extra",
"mta_tax",
"tip_amount",
"tolls_amount",
"improvement_surcharge",
"total_amount"
]
}
},
{
"date" : {
"field" : "tpep_pickup_datetime",
"timezone" : "{{ event.timezone }}",
"formats" : [
"yyyy-MM-dd HH:mm:ss"
]
}
},
{
"convert" : {
"field" : "DOLocationID",
"type" : "long"
}
},
{
"convert" : {
"field" : "PULocationID",
"type" : "long"
}
},
{
"convert" : {
"field" : "RatecodeID",
"type" : "long"
}
},
{
"convert" : {
"field" : "VendorID",
"type" : "long"
}
},
{
"convert" : {
"field" : "extra",
"type" : "double"
}
},
{
"convert" : {
"field" : "fare_amount",
"type" : "double"
}
},
{
"convert" : {
"field" : "improvement_surcharge",
"type" : "double"
}
},
{
"convert" : {
"field" : "mta_tax",
"type" : "double"
}
},
{
"convert" : {
"field" : "passenger_count",
"type" : "long"
}
},
{
"convert" : {
"field" : "payment_type",
"type" : "long"
}
},
{
"convert" : {
"field" : "tip_amount",
"type" : "double"
}
},
{
"convert" : {
"field" : "tolls_amount",
"type" : "double"
}
},
{
"convert" : {
"field" : "total_amount",
"type" : "double"
}
},
{
"convert" : {
"field" : "trip_distance",
"type" : "double"
}
},
{
"remove" : {
"field" : "message"
}
}
]
},
"field_stats" : {
"DOLocationID" : {
"count" : 19998,
"cardinality" : 240,
"min_value" : 1,
"max_value" : 265,
"mean_value" : 150.26532653265312,
"median_value" : 148,
"top_hits" : [
{
"value" : 79,
"count" : 760
},
{
"value" : 48,
"count" : 683
},
{
"value" : 68,
"count" : 529
},
{
"value" : 170,
"count" : 506
},
{
"value" : 107,
"count" : 468
},
{
"value" : 249,
"count" : 457
},
{
"value" : 230,
"count" : 441
},
{
"value" : 186,
"count" : 432
},
{
"value" : 141,
"count" : 409
},
{
"value" : 263,
"count" : 386
}
]
},
"PULocationID" : {
"count" : 19998,
"cardinality" : 154,
"min_value" : 1,
"max_value" : 265,
"mean_value" : 153.4042404240424,
"median_value" : 148,
"top_hits" : [
{
"value" : 79,
"count" : 1067
},
{
"value" : 230,
"count" : 949
},
{
"value" : 148,
"count" : 940
},
{
"value" : 132,
"count" : 897
},
{
"value" : 48,
"count" : 853
},
{
"value" : 161,
"count" : 820
},
{
"value" : 234,
"count" : 750
},
{
"value" : 249,
"count" : 722
},
{
"value" : 164,
"count" : 663
},
{
"value" : 114,
"count" : 646
}
]
},
"RatecodeID" : {
"count" : 19998,
"cardinality" : 5,
"min_value" : 1,
"max_value" : 5,
"mean_value" : 1.0656565656565653,
"median_value" : 1,
"top_hits" : [
{
"value" : 1,
"count" : 19311
},
{
"value" : 2,
"count" : 468
},
{
"value" : 5,
"count" : 195
},
{
"value" : 4,
"count" : 17
},
{
"value" : 3,
"count" : 7
}
]
},
"VendorID" : {
"count" : 19998,
"cardinality" : 2,
"min_value" : 1,
"max_value" : 2,
"mean_value" : 1.59005900590059,
"median_value" : 2,
"top_hits" : [
{
"value" : 2,
"count" : 11800
},
{
"value" : 1,
"count" : 8198
}
]
},
"extra" : {
"count" : 19998,
"cardinality" : 3,
"min_value" : -0.5,
"max_value" : 0.5,
"mean_value" : 0.4815981598159816,
"median_value" : 0.5,
"top_hits" : [
{
"value" : 0.5,
"count" : 19281
},
{
"value" : 0,
"count" : 698
},
{
"value" : -0.5,
"count" : 19
}
]
},
"fare_amount" : {
"count" : 19998,
"cardinality" : 208,
"min_value" : -100,
"max_value" : 300,
"mean_value" : 13.937719771977209,
"median_value" : 9.5,
"top_hits" : [
{
"value" : 6,
"count" : 1004
},
{
"value" : 6.5,
"count" : 935
},
{
"value" : 5.5,
"count" : 909
},
{
"value" : 7,
"count" : 903
},
{
"value" : 5,
"count" : 889
},
{
"value" : 7.5,
"count" : 854
},
{
"value" : 4.5,
"count" : 802
},
{
"value" : 8.5,
"count" : 790
},
{
"value" : 8,
"count" : 789
},
{
"value" : 9,
"count" : 711
}
]
},
"improvement_surcharge" : {
"count" : 19998,
"cardinality" : 3,
"min_value" : -0.3,
"max_value" : 0.3,
"mean_value" : 0.29915991599159913,
"median_value" : 0.3,
"top_hits" : [
{
"value" : 0.3,
"count" : 19964
},
{
"value" : -0.3,
"count" : 22
},
{
"value" : 0,
"count" : 12
}
]
},
"mta_tax" : {
"count" : 19998,
"cardinality" : 3,
"min_value" : -0.5,
"max_value" : 0.5,
"mean_value" : 0.4962246224622462,
"median_value" : 0.5,
"top_hits" : [
{
"value" : 0.5,
"count" : 19868
},
{
"value" : 0,
"count" : 109
},
{
"value" : -0.5,
"count" : 21
}
]
},
"passenger_count" : {
"count" : 19998,
"cardinality" : 7,
"min_value" : 0,
"max_value" : 6,
"mean_value" : 1.6201620162016201,
"median_value" : 1,
"top_hits" : [
{
"value" : 1,
"count" : 14219
},
{
"value" : 2,
"count" : 2886
},
{
"value" : 5,
"count" : 1047
},
{
"value" : 3,
"count" : 804
},
{
"value" : 6,
"count" : 523
},
{
"value" : 4,
"count" : 406
},
{
"value" : 0,
"count" : 113
}
]
},
"payment_type" : {
"count" : 19998,
"cardinality" : 4,
"min_value" : 1,
"max_value" : 4,
"mean_value" : 1.315631563156316,
"median_value" : 1,
"top_hits" : [
{
"value" : 1,
"count" : 13936
},
{
"value" : 2,
"count" : 5857
},
{
"value" : 3,
"count" : 160
},
{
"value" : 4,
"count" : 45
}
]
},
"store_and_fwd_flag" : {
"count" : 19998,
"cardinality" : 2,
"top_hits" : [
{
"value" : "N",
"count" : 19910
},
{
"value" : "Y",
"count" : 88
}
]
},
"tip_amount" : {
"count" : 19998,
"cardinality" : 717,
"min_value" : 0,
"max_value" : 128,
"mean_value" : 2.010959095909593,
"median_value" : 1.45,
"top_hits" : [
{
"value" : 0,
"count" : 6917
},
{
"value" : 1,
"count" : 1178
},
{
"value" : 2,
"count" : 624
},
{
"value" : 3,
"count" : 248
},
{
"value" : 1.56,
"count" : 206
},
{
"value" : 1.46,
"count" : 205
},
{
"value" : 1.76,
"count" : 196
},
{
"value" : 1.45,
"count" : 195
},
{
"value" : 1.36,
"count" : 191
},
{
"value" : 1.5,
"count" : 187
}
]
},
"tolls_amount" : {
"count" : 19998,
"cardinality" : 26,
"min_value" : 0,
"max_value" : 35,
"mean_value" : 0.2729697969796978,
"median_value" : 0,
"top_hits" : [
{
"value" : 0,
"count" : 19107
},
{
"value" : 5.76,
"count" : 791
},
{
"value" : 10.5,
"count" : 36
},
{
"value" : 2.64,
"count" : 21
},
{
"value" : 11.52,
"count" : 8
},
{
"value" : 5.54,
"count" : 4
},
{
"value" : 8.5,
"count" : 4
},
{
"value" : 17.28,
"count" : 4
},
{
"value" : 2,
"count" : 2
},
{
"value" : 2.16,
"count" : 2
}
]
},
"total_amount" : {
"count" : 19998,
"cardinality" : 1267,
"min_value" : -100.3,
"max_value" : 389.12,
"mean_value" : 17.499898989898995,
"median_value" : 12.35,
"top_hits" : [
{
"value" : 7.3,
"count" : 478
},
{
"value" : 8.3,
"count" : 443
},
{
"value" : 8.8,
"count" : 420
},
{
"value" : 6.8,
"count" : 406
},
{
"value" : 7.8,
"count" : 405
},
{
"value" : 6.3,
"count" : 371
},
{
"value" : 9.8,
"count" : 368
},
{
"value" : 5.8,
"count" : 362
},
{
"value" : 9.3,
"count" : 332
},
{
"value" : 10.3,
"count" : 332
}
]
},
"tpep_dropoff_datetime" : {
"count" : 19998,
"cardinality" : 9066,
"earliest" : "2018-05-31 06:18:15",
"latest" : "2018-06-02 02:25:44",
"top_hits" : [
{
"value" : "2018-06-01 01:12:12",
"count" : 10
},
{
"value" : "2018-06-01 00:32:15",
"count" : 9
},
{
"value" : "2018-06-01 00:44:27",
"count" : 9
},
{
"value" : "2018-06-01 00:46:42",
"count" : 9
},
{
"value" : "2018-06-01 01:03:22",
"count" : 9
},
{
"value" : "2018-06-01 01:05:13",
"count" : 9
},
{
"value" : "2018-06-01 00:11:20",
"count" : 8
},
{
"value" : "2018-06-01 00:16:03",
"count" : 8
},
{
"value" : "2018-06-01 00:19:47",
"count" : 8
},
{
"value" : "2018-06-01 00:25:17",
"count" : 8
}
]
},
"tpep_pickup_datetime" : {
"count" : 19998,
"cardinality" : 8760,
"earliest" : "2018-05-31 06:08:31",
"latest" : "2018-06-02 01:21:21",
"top_hits" : [
{
"value" : "2018-06-01 00:01:23",
"count" : 12
},
{
"value" : "2018-06-01 00:04:31",
"count" : 10
},
{
"value" : "2018-06-01 00:05:38",
"count" : 10
},
{
"value" : "2018-06-01 00:09:50",
"count" : 10
},
{
"value" : "2018-06-01 00:12:01",
"count" : 10
},
{
"value" : "2018-06-01 00:14:17",
"count" : 10
},
{
"value" : "2018-06-01 00:00:34",
"count" : 9
},
{
"value" : "2018-06-01 00:00:40",
"count" : 9
},
{
"value" : "2018-06-01 00:02:53",
"count" : 9
},
{
"value" : "2018-06-01 00:05:40",
"count" : 9
}
]
},
"trip_distance" : {
"count" : 19998,
"cardinality" : 1687,
"min_value" : 0,
"max_value" : 64.63,
"mean_value" : 3.6521062106210715,
"median_value" : 2.16,
"top_hits" : [
{
"value" : 0.9,
"count" : 335
},
{
"value" : 0.8,
"count" : 320
},
{
"value" : 1.1,
"count" : 316
},
{
"value" : 0.7,
"count" : 304
},
{
"value" : 1.2,
"count" : 303
},
{
"value" : 1,
"count" : 296
},
{
"value" : 1.3,
"count" : 280
},
{
"value" : 1.5,
"count" : 268
},
{
"value" : 1.6,
"count" : 268
},
{
"value" : 0.6,
"count" : 256
}
]
}
}
}
num_messages_analyzed はnum_lines_analyzed より2行少ないです。なぜなら、データレコードのみがメッセージとしてカウントされるからです。最初の行には列名が含まれており、このサンプルでは2行目は空白です。 |
|
最初の例とは異なり、この場合format はdelimited として特定されています。 |
|
format がdelimited であるため、出力のcolumn_names フィールドには、サンプルに表示される順序で列名がリストされています。 |
|
has_header_row は、このサンプルの列名がサンプルの最初の行にあったことを示しています。(もしそうでなければ、column_names クエリパラメータで指定するのが良いアイデアです。) |
|
このサンプルのdelimiter はカンマで、CSV形式のテキストです。 |
|
quote 文字はデフォルトの二重引用符です。(構造ファインダーは他の引用文字を推測しようとしないため、他の文字で引用された区切りテキストがある場合は、quote クエリパラメータを使用して指定する必要があります。) |
|
timestamp_field はtpep_pickup_datetime として選択されました。tpep_dropoff_datetime も同様に機能しますが、tpep_pickup_datetime が列の順序で最初に来るため選択されました。tpep_dropoff_datetime を好む場合は、timestamp_field クエリパラメータを使用して強制的に選択できます。 |
|
joda_timestamp_formats は、Logstashにタイムスタンプを解析する方法を伝えるために使用されます。 |
|
java_timestamp_formats は、時間フィールドで認識されるJava時間形式です。Elasticsearchのマッピングと取り込みパイプラインはこの形式を使用します。 |
|
このサンプルのタイムスタンプ形式はタイムゾーンを指定していないため、Elasticsearchに保存するためにUTCタイムスタンプに正確に変換するには、関連するタイムゾーンを提供する必要があります。need_client_timezone は、タイムゾーンを含むタイムスタンプ形式に対してfalse になります。 |
タイムアウトパラメータの設定
大量のデータを分析しようとすると、分析に時間がかかります。リクエストに対してElasticsearchクラスターが実行する処理の量を制限したい場合は、timeout
クエリパラメータを使用します。タイムアウトが切れると分析は中止され、エラーが返されます。たとえば、前の例の20000行を200000行に置き換え、分析に1秒のタイムアウトを設定できます:
Js
curl -s "s3.amazonaws.com/nyc-tlc/trip+data/yellow_tripdata_2018-06.csv" | head -200000 | curl -s -H "Content-Type: application/json" -XPOST "localhost:9200/_text_structure/find_structure?pretty&lines_to_sample=200000&timeout=1s" -T -
非常に高速なコンピュータを使用していない限り、タイムアウトエラーが発生します:
Js
{
"error" : {
"root_cause" : [
{
"type" : "timeout_exception",
"reason" : "Aborting structure analysis during [delimited record parsing] as it has taken longer than the timeout of [1s]"
}
],
"type" : "timeout_exception",
"reason" : "Aborting structure analysis during [delimited record parsing] as it has taken longer than the timeout of [1s]"
},
"status" : 500
}
上記の例を自分で試すと、curl
コマンドの全体的な実行時間が1秒よりかなり長いことに気付くでしょう。これは、200000行のCSVをインターネットからダウンロードするのに時間がかかり、タイムアウトはこのエンドポイントがデータの処理を開始した時点から測定されるためです。
Elasticsearchログファイルの分析
これは、Elasticsearchログファイルを分析する例です:
Js
curl -s -H "Content-Type: application/json" -XPOST
"localhost:9200/_text_structure/find_structure?pretty&ecs_compatibility=disabled" -T "$ES_HOME/logs/elasticsearch.log"
リクエストにエラーが発生しなければ、結果は次のようになります:
Js
{
"num_lines_analyzed" : 53,
"num_messages_analyzed" : 53,
"sample_start" : "[2018-09-27T14:39:28,518][INFO ][o.e.e.NodeEnvironment ] [node-0] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [165.4gb], net total_space [464.7gb], types [hfs]\n[2018-09-27T14:39:28,521][INFO ][o.e.e.NodeEnvironment ] [node-0] heap size [494.9mb], compressed ordinary object pointers [true]\n",
"charset" : "UTF-8",
"has_byte_order_marker" : false,
"format" : "semi_structured_text",
"multiline_start_pattern" : "^\\[\\b\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}",
"grok_pattern" : "\\[%{TIMESTAMP_ISO8601:timestamp}\\]\\[%{LOGLEVEL:loglevel}.*",
"ecs_compatibility" : "disabled",
"timestamp_field" : "timestamp",
"joda_timestamp_formats" : [
"ISO8601"
],
"java_timestamp_formats" : [
"ISO8601"
],
"need_client_timezone" : true,
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"loglevel" : {
"type" : "keyword"
},
"message" : {
"type" : "text"
}
}
},
"ingest_pipeline" : {
"description" : "Ingest pipeline created by text structure finder",
"processors" : [
{
"grok" : {
"field" : "message",
"patterns" : [
"\\[%{TIMESTAMP_ISO8601:timestamp}\\]\\[%{LOGLEVEL:loglevel}.*"
]
}
},
{
"date" : {
"field" : "timestamp",
"timezone" : "{{ event.timezone }}",
"formats" : [
"ISO8601"
]
}
},
{
"remove" : {
"field" : "timestamp"
}
}
]
},
"field_stats" : {
"loglevel" : {
"count" : 53,
"cardinality" : 3,
"top_hits" : [
{
"value" : "INFO",
"count" : 51
},
{
"value" : "DEBUG",
"count" : 1
},
{
"value" : "WARN",
"count" : 1
}
]
},
"timestamp" : {
"count" : 53,
"cardinality" : 28,
"earliest" : "2018-09-27T14:39:28,518",
"latest" : "2018-09-27T14:39:37,012",
"top_hits" : [
{
"value" : "2018-09-27T14:39:29,859",
"count" : 10
},
{
"value" : "2018-09-27T14:39:29,860",
"count" : 9
},
{
"value" : "2018-09-27T14:39:29,858",
"count" : 6
},
{
"value" : "2018-09-27T14:39:28,523",
"count" : 3
},
{
"value" : "2018-09-27T14:39:34,234",
"count" : 2
},
{
"value" : "2018-09-27T14:39:28,518",
"count" : 1
},
{
"value" : "2018-09-27T14:39:28,521",
"count" : 1
},
{
"value" : "2018-09-27T14:39:28,522",
"count" : 1
},
{
"value" : "2018-09-27T14:39:29,861",
"count" : 1
},
{
"value" : "2018-09-27T14:39:32,786",
"count" : 1
}
]
}
}
}
今回format はsemi_structured_text として特定されました。 |
|
multiline_start_pattern は、各マルチラインログメッセージの最初の行にタイムスタンプが表示されることに基づいて設定されています。 |
|
非常にシンプルなgrok_pattern が作成され、タイムスタンプと、分析されたメッセージに表示される認識可能なフィールドが抽出されます。この場合、タイムスタンプを超えて認識された唯一のフィールドはログレベルでした。 |
|
使用されたECS Grokパターンの互換性モードは、disabled (リクエストで指定されていない場合のデフォルト)またはv1 のいずれかです。 |
grok_patternをクエリパラメータとして指定する
構造ファインダーが自動的に生成したシンプルなgrok_pattern
よりも多くのフィールドを認識する場合、より高度なgrok_pattern
をクエリパラメータとして指定してリクエストを再送信できます。構造ファインダーは、追加フィールドのfield_stats
を計算します。
Elasticsearchログの場合、より完全なGrokパターンは\[%{TIMESTAMP_ISO8601:timestamp}\]\[%{LOGLEVEL:loglevel} *\]\[%{JAVACLASS:class} *\] \[%{HOSTNAME:node}\] %{JAVALOGMESSAGE:message}
です。同じテキストを再度分析し、このgrok_pattern
をクエリパラメータとして送信できます(適切にURLエスケープされていること):
Js
curl -s -H "Content-Type: application/json" -XPOST "localhost:9200/_text_structure/find_structure?pretty&format=semi_structured_text&grok_pattern=%5C%5B%25%7BTIMESTAMP_ISO8601:timestamp%7D%5C%5D%5C%5B%25%7BLOGLEVEL:loglevel%7D%20*%5C%5D%5C%5B%25%7BJAVACLASS:class%7D%20*%5C%5D%20%5C%5B%25%7BHOSTNAME:node%7D%5C%5D%20%25%7BJAVALOGMESSAGE:message%7D" -T "$ES_HOME/logs/elasticsearch.log"
リクエストにエラーが発生しなければ、結果は次のようになります:
Js
{
"num_lines_analyzed" : 53,
"num_messages_analyzed" : 53,
"sample_start" : "[2018-09-27T14:39:28,518][INFO ][o.e.e.NodeEnvironment ] [node-0] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [165.4gb], net total_space [464.7gb], types [hfs]\n[2018-09-27T14:39:28,521][INFO ][o.e.e.NodeEnvironment ] [node-0] heap size [494.9mb], compressed ordinary object pointers [true]\n",
"charset" : "UTF-8",
"has_byte_order_marker" : false,
"format" : "semi_structured_text",
"multiline_start_pattern" : "^\\[\\b\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}",
"grok_pattern" : "\\[%{TIMESTAMP_ISO8601:timestamp}\\]\\[%{LOGLEVEL:loglevel} *\\]\\[%{JAVACLASS:class} *\\] \\[%{HOSTNAME:node}\\] %{JAVALOGMESSAGE:message}",
"ecs_compatibility" : "disabled",
"timestamp_field" : "timestamp",
"joda_timestamp_formats" : [
"ISO8601"
],
"java_timestamp_formats" : [
"ISO8601"
],
"need_client_timezone" : true,
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"class" : {
"type" : "keyword"
},
"loglevel" : {
"type" : "keyword"
},
"message" : {
"type" : "text"
},
"node" : {
"type" : "keyword"
}
}
},
"ingest_pipeline" : {
"description" : "Ingest pipeline created by text structure finder",
"processors" : [
{
"grok" : {
"field" : "message",
"patterns" : [
"\\[%{TIMESTAMP_ISO8601:timestamp}\\]\\[%{LOGLEVEL:loglevel} *\\]\\[%{JAVACLASS:class} *\\] \\[%{HOSTNAME:node}\\] %{JAVALOGMESSAGE:message}"
]
}
},
{
"date" : {
"field" : "timestamp",
"timezone" : "{{ event.timezone }}",
"formats" : [
"ISO8601"
]
}
},
{
"remove" : {
"field" : "timestamp"
}
}
]
},
"field_stats" : {
"class" : {
"count" : 53,
"cardinality" : 14,
"top_hits" : [
{
"value" : "o.e.p.PluginsService",
"count" : 26
},
{
"value" : "o.e.c.m.MetadataIndexTemplateService",
"count" : 8
},
{
"value" : "o.e.n.Node",
"count" : 7
},
{
"value" : "o.e.e.NodeEnvironment",
"count" : 2
},
{
"value" : "o.e.a.ActionModule",
"count" : 1
},
{
"value" : "o.e.c.s.ClusterApplierService",
"count" : 1
},
{
"value" : "o.e.c.s.MasterService",
"count" : 1
},
{
"value" : "o.e.d.DiscoveryModule",
"count" : 1
},
{
"value" : "o.e.g.GatewayService",
"count" : 1
},
{
"value" : "o.e.l.LicenseService",
"count" : 1
}
]
},
"loglevel" : {
"count" : 53,
"cardinality" : 3,
"top_hits" : [
{
"value" : "INFO",
"count" : 51
},
{
"value" : "DEBUG",
"count" : 1
},
{
"value" : "WARN",
"count" : 1
}
]
},
"message" : {
"count" : 53,
"cardinality" : 53,
"top_hits" : [
{
"value" : "Using REST wrapper from plugin org.elasticsearch.xpack.security.Security",
"count" : 1
},
{
"value" : "adding template [.monitoring-alerts] for index patterns [.monitoring-alerts-6]",
"count" : 1
},
{
"value" : "adding template [.monitoring-beats] for index patterns [.monitoring-beats-6-*]",
"count" : 1
},
{
"value" : "adding template [.monitoring-es] for index patterns [.monitoring-es-6-*]",
"count" : 1
},
{
"value" : "adding template [.monitoring-kibana] for index patterns [.monitoring-kibana-6-*]",
"count" : 1
},
{
"value" : "adding template [.monitoring-logstash] for index patterns [.monitoring-logstash-6-*]",
"count" : 1
},
{
"value" : "adding template [.triggered_watches] for index patterns [.triggered_watches*]",
"count" : 1
},
{
"value" : "adding template [.watch-history-9] for index patterns [.watcher-history-9*]",
"count" : 1
},
{
"value" : "adding template [.watches] for index patterns [.watches*]",
"count" : 1
},
{
"value" : "starting ...",
"count" : 1
}
]
},
"node" : {
"count" : 53,
"cardinality" : 1,
"top_hits" : [
{
"value" : "node-0",
"count" : 53
}
]
},
"timestamp" : {
"count" : 53,
"cardinality" : 28,
"earliest" : "2018-09-27T14:39:28,518",
"latest" : "2018-09-27T14:39:37,012",
"top_hits" : [
{
"value" : "2018-09-27T14:39:29,859",
"count" : 10
},
{
"value" : "2018-09-27T14:39:29,860",
"count" : 9
},
{
"value" : "2018-09-27T14:39:29,858",
"count" : 6
},
{
"value" : "2018-09-27T14:39:28,523",
"count" : 3
},
{
"value" : "2018-09-27T14:39:34,234",
"count" : 2
},
{
"value" : "2018-09-27T14:39:28,518",
"count" : 1
},
{
"value" : "2018-09-27T14:39:28,521",
"count" : 1
},
{
"value" : "2018-09-27T14:39:28,522",
"count" : 1
},
{
"value" : "2018-09-27T14:39:29,861",
"count" : 1
},
{
"value" : "2018-09-27T14:39:32,786",
"count" : 1
}
]
}
}
}
出力のgrok_pattern は、クエリパラメータで提供されたオーバーライドされたものになっています。 |
|
使用されたECS Grokパターンの互換性モードは、disabled (リクエストで指定されていない場合のデフォルト)またはv1 のいずれかです。 |
|
返されたfield_stats には、オーバーライドされたgrok_pattern からのフィールドのエントリが含まれています。 |
URLエスケープは難しいので、インタラクティブに作業している場合はUIを使用するのが最適です!