EQL search API
検索結果をイベントクエリ言語 (EQL)クエリに対して返します。
EQLは、データストリームまたはインデックス内の各ドキュメントがイベントに対応していると仮定します。
Python
resp = client.eql.search(
index="my-data-stream",
query="\n process where process.name == \"regsvr32.exe\"\n ",
)
print(resp)
Ruby
response = client.eql.search(
index: 'my-data-stream',
body: {
query: "\n process where process.name == \"regsvr32.exe\"\n "
}
)
puts response
Js
const response = await client.eql.search({
index: "my-data-stream",
query: '\n process where process.name == "regsvr32.exe"\n ',
});
console.log(response);
Console
GET /my-data-stream/_eql/search
{
"query": """
process where process.name == "regsvr32.exe"
"""
}
Request
GET /<target>/_eql/search
POST /<target>/_eql/search
Prerequisites
- Elasticsearchのセキュリティ機能が有効になっている場合、ターゲットデータストリーム、インデックス、またはエイリアスに対して
read
インデックス権限を持っている必要があります。 - 必須フィールドを参照してください。
- [プレビュー] この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。 クロスクラスタ検索の場合、ローカルおよびリモートクラスタは、7.17.7(含む)以前または8.5.1(含む)以前のバージョンを使用している場合、同じElasticsearchバージョンを使用する必要があります。セキュリティについては、リモートクラスタを参照してください。
Limitations
EQLの制限を参照してください。
Path parameters
<target>
- (必須、文字列) リクエストを制限するために使用されるデータストリーム、インデックス、またはエイリアスのカンマ区切りリスト。 ワイルドカード(
*
)をサポートします。すべてのデータストリームとインデックスを検索するには、*
または_all
を使用します。
[プレビュー] この機能は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。 リモートクラスタを検索するには、<cluster>:<target>
構文を使用します。クラスタ間でEQL検索を実行するを参照してください。
Query parameters
allow_no_indices
- (オプション、Boolean)
このパラメータの動作は、他のmulti-target APIsで使用されるallow_no_indices
パラメータとは異なります。false
の場合、リクエストは、ワイルドカードパターン、エイリアス、または_all
値が欠落または閉じたインデックスのみをターゲットにする場合にエラーを返します。この動作は、リクエストが他のオープンインデックスをターゲットにしている場合でも適用されます。たとえば、foo*,bar*
をターゲットにするリクエストは、foo
で始まるインデックスがあるが、bar
で始まるインデックスがない場合にエラーを返します。true
の場合、欠落または閉じたインデックスのみをターゲットにするリクエストがエラーを返します。たとえば、foo*,bar*
をターゲットにするリクエストは、foo
で始まるインデックスがあるが、bar
で始まるインデックスがない場合にエラーを返しません。ただし、bar*
のみをターゲットにするリクエストは、依然としてエラーを返します。
デフォルトはtrue
です。 ccs_minimize_roundtrips
- (オプション、Boolean)
true
の場合、クロスクラスタ検索(CCS)リクエストを実行する際に、ローカルとリモートクラスタ間のネットワークラウンドトリップが最小限に抑えられます。
このオプションは、1つのリモートクラスタに完全に含まれるデータをターゲットにするリクエストに対して有効です。データが複数のクラスタに分散している場合、この設定は無視されます。
デフォルトはtrue
です。 expand_wildcards
- (オプション、文字列) ワイルドカードパターンが一致できるインデックスのタイプ。リクエストがデータストリームをターゲットにできる場合、この引数はワイルドカード式が隠しデータストリームに一致するかどうかを決定します。カンマ区切りの値をサポートします。
open,hidden
のような。 有効な値は:all
- すべてのデータストリームまたはインデックスに一致します。隠しのものも含まれます。
open
- オープンで非隠しのインデックスに一致します。非隠しデータストリームにも一致します。
closed
- クローズドで非隠しのインデックスに一致します。非隠しデータストリームにも一致します。データストリームはクローズできません。
hidden
- 隠しデータストリームと隠しインデックスに一致します。
open
、closed
、またはその両方と組み合わせる必要があります。 none
- ワイルドカードパターンは受け付けられません。
デフォルトはopen
です。
filter_path
- (オプション、文字列) APIレスポンスのフィルタのカンマ区切りリスト。レスポンスフィルタリングを参照してください。
ignore_unavailable
- (オプション、Boolean)
false
の場合、リクエストが欠落または閉じたインデックスをターゲットにする場合、エラーを返します。デフォルトはtrue
です。 keep_alive
- (オプション、時間値) 検索とその結果がクラスタに保存される期間。デフォルトは
5d
(5日)です。
この期間が終了すると、検索とその結果は削除されます。検索がまだ進行中であっても。keep_on_completion
パラメータがfalse
の場合、Elasticsearchは、非同期検索のうち、wait_for_completion_timeout
パラメータで設定された期間内に完了しないもののみを保存します。この値に関係なく。
この値は、keep_alive
リクエストボディパラメータを使用して指定することもできます。両方のパラメータが指定されている場合、クエリパラメータのみが使用されます。 keep_on_completion
- (オプション、Boolean)
true
の場合、検索とその結果はクラスタに保存されます。false
の場合、リクエストがwait_for_completion_timeout
パラメータで設定された期間内に完了しない場合にのみ、検索とその結果がクラスタに保存されます。デフォルトはfalse
です。
この値は、keep_on_completion
リクエストボディパラメータを使用して指定することもできます。両方のパラメータが指定されている場合、クエリパラメータのみが使用されます。 wait_for_completion_timeout
- (オプション、時間値) リクエストが完了するまで待機するタイムアウトの期間。デフォルトはタイムアウトなし、つまりリクエストは完全な検索結果を待機します。
このパラメータが指定され、リクエストがこの期間内に完了した場合、完全な検索結果が返されます。
この期間内にリクエストが完了しない場合、検索は非同期検索になります。
この値は、wait_for_completion_timeout
リクエストボディパラメータを使用して指定することもできます。両方のパラメータが指定されている場合、クエリパラメータのみが使用されます。
Request body
event_category_field
- (必須*、文字列) イベント分類を含むフィールド、
process
、file
、またはnetwork
など。
デフォルトは、Elastic Common Schema (ECS)で定義されているevent.category
です。データストリームまたはインデックスにevent.category
フィールドが含まれていない場合、この値は必須です。
イベントカテゴリフィールドは、keyword
ファミリーのフィールドタイプとしてマッピングされている必要があります。 fetch_size
- (オプション、整数) シーケンスクエリのために一度に検索する最大イベント数。デフォルトは
1000
です。
この値は2
より大きくなければなりませんが、index.max_result_window
設定の値を超えることはできません。デフォルトは10000
です。
内部的に、シーケンスクエリは、マッチを検索するためにイベントのセットを取得し、ページネートします。このパラメータは、それらのセットのサイズを制御します。このパラメータは、検索されるイベントの総数や返される一致イベントの数を制限するものではありません。
大きなfetch_size
値は、検索速度を向上させることが多いですが、より多くのメモリを使用します。 fields
- (オプション、文字列とオブジェクトの配列) フィールドパターンの配列。リクエストは、レスポンスの
hits.fields
プロパティ内でこれらのパターンに一致するフィールド名の値を返します。
配列内のアイテムは、文字列またはオブジェクトとして指定できます。fields
オプションを参照してください。- `````field
- (必須、文字列) 返すフィールド。ワイルドカード(
*
)をサポートします。 format
- (オプション、文字列) 日付および地理空間フィールドのフォーマット。他のフィールドデータタイプはこのパラメータをサポートしていません。
date
およびdate_nanos
フィールドは、日付フォーマットを受け入れます。geo_point
およびgeo_shape
フィールドは次のものを受け入れます:geojson
(デフォルト)- GeoJSON
wkt
- Well Known Text
mvt(<spec>)
- バイナリMapboxベクタタイル。APIは、タイルをbase64エンコードされた文字列として返します。
<spec>
は、<zoom>/<x>/<y>
の形式で、2つのオプションのサフィックス@<extent>
および/または:<buffer>
を持ちます。たとえば、2/0/1
または2/0/1@4096:5
。mvt
パラメータ <zoom>
- (必須、整数) タイルのズームレベル。
0
-29
を受け入れます。 <x>
- (必須、整数) タイルのX座標。
<y>
- (必須、整数) タイルのY座標。
<extent>
- (オプション、整数) タイルの一辺のサイズ(ピクセル単位)。ベクタタイルは、等しい辺を持つ正方形です。デフォルトは
4096
です。 <buffer>
- (オプション、整数) タイルの外側のクリッピングバッファのサイズ(ピクセル単位)。これにより、レンダラーはタイルの範囲を超えて拡張するジオメトリからのアウトラインアーティファクトを回避できます。デフォルトは
5
です。
filter
- (オプション、Query DSLオブジェクト) EQLクエリが実行されるイベントをフィルタリングするために使用されるクエリ、Query DSLで記述されています。
keep_alive
(オプション、時間値) 検索とその結果がクラスタに保存される期間。デフォルトは
5d
(5日)です。
この期間が終了すると、検索とその結果は削除されます。検索がまだ進行中であっても。keep_on_completion
パラメータがfalse
の場合、Elasticsearchは、非同期検索のうち、wait_for_completion_timeout
パラメータで設定された期間内に完了しないもののみを保存します。この値に関係なく。
この値は、keep_alive
クエリパラメータを使用して指定することもできます。両方のパラメータが指定されている場合、クエリパラメータのみが使用されます。keep_on_completion
(オプション、Boolean)
true
の場合、検索とその結果はクラスタに保存されます。false
の場合、リクエストがwait_for_completion_timeout
パラメータで設定された期間内に完了しない場合にのみ、検索とその結果がクラスタに保存されます。デフォルトはfalse
です。
この値は、keep_on_completion
クエリパラメータを使用して指定することもできます。両方のパラメータが指定されている場合、クエリパラメータのみが使用されます。query
- (必須、文字列) 実行したいEQLクエリ。
result_position
- (オプション、列挙型) 返す一致イベントまたはシーケンスのセット。
- `````tail
- (デフォルト) 最も最近の一致を返します。Unix tailコマンドに似ています。
head
- 最も古い一致を返します。Unix headコマンドに似ています。
このパラメータは、返されるヒットのセットを変更する可能性があります。ただし、レスポンス内のヒットのソート順序は変更されません。
runtime_mappings
- (オプション、オブジェクトのオブジェクト) 検索リクエスト内の1つ以上のランタイムフィールドを定義します。これらのフィールドは、同じ名前のマッピングされたフィールドよりも優先されます。
- `````<field-name>
- (必須、オブジェクト) ランタイムフィールドの設定。キーはフィールド名です。
- `````type
- (必須、文字列) フィールドタイプ、次のいずれかである必要があります:
boolean
composite
date
double
geo_point
ip
keyword
long
lookup
script
- (オプション、文字列) クエリ時に実行されるPainlessスクリプト。スクリプトは、元の
_source
およびマッピングされたフィールドとその値を含むドキュメントの全コンテキストにアクセスできます。
このスクリプトは、計算された値を返すためにemit
を含める必要があります。たとえば:
Js
"script": "emit(doc['@timestamp'].value.dayOfWeekEnum.toString())"
size
(オプション、整数または浮動小数点) 基本クエリの場合、一致するイベントの最大数を返します。
シーケンスクエリの場合、一致するシーケンスの最大数を返します。
デフォルトは10
です。この値は0
より大きくなければなりません。
パイプを使用して、この値を超えることはできません。head
またはtail
のように。tiebreaker_field
(オプション、文字列) 同じタイムスタンプを持つヒットを昇順にソートするために使用されるフィールド。ソートのタイブレイカーを指定するを参照してください。
timestamp_field
(必須*、文字列) イベントのタイムスタンプを含むフィールド。
デフォルトは、Elastic Common Schema (ECS)で定義されている@timestamp
です。データストリームまたはインデックスに@timestamp
フィールドが含まれていない場合、この値は必須です。
APIレスポンス内のイベントは、このフィールドの値に基づいて、Unix epochからのミリ秒に変換され、昇順にソートされます。
タイムスタンプフィールドは、date
としてマッピングされる必要があります。date_nanos
フィールドタイプはサポートされていません。wait_for_completion_timeout
- (オプション、時間値) リクエストが完了するまで待機するタイムアウトの期間。デフォルトはタイムアウトなし、つまりリクエストは完全な検索結果を待機します。
このパラメータが指定され、リクエストがこの期間内に完了した場合、完全な検索結果が返されます。
この期間内にリクエストが完了しない場合、検索は非同期検索になります。
この値は、wait_for_completion_timeout
クエリパラメータを使用して指定することもできます。両方のパラメータが指定されている場合、クエリパラメータのみが使用されます。
Response body
id
- (文字列) 検索の識別子。
この検索IDは、次のいずれかの条件が満たされた場合にのみ提供されます:- 検索リクエストが
wait_for_completion_timeout
パラメータのタイムアウト期間中に完全な結果を返さず、非同期検索になります。 - 検索リクエストの
keep_on_completion
パラメータがtrue
です。
このIDを使用して、非同期EQL検索APIを使用して検索の現在のステータスと利用可能な結果を取得するか、非同期EQLステータスAPIを使用して現在のステータスのみを取得できます。
- 検索リクエストが
is_partial
- (Boolean)
true
の場合、レスポンスには完全な検索結果が含まれていません。 is_running
- (Boolean)
true
の場合、検索リクエストはまだ実行中です。
このパラメータとis_partial
パラメータがtrue
の場合、検索は進行中の非同期検索です。keep_alive
期間が経過しない場合、検索が完了すると完全な検索結果が利用可能になります。is_partial
がtrue
で、is_running
がfalse
の場合、検索は失敗により部分的な結果を返しました。いくつかのシャードが結果を返すか、検索を調整するノードが失敗しました。 took
- (整数) Elasticsearchがリクエストを実行するのにかかったミリ秒。
この値は、リクエストが調整ノードで受信されてから、調整ノードがレスポンスを送信する準備ができるまでの経過時間を測定することによって計算されます。
かかった時間には次が含まれます:- 調整ノードとデータノード間の通信時間
- リクエストが
search
スレッドプールで実行待ちの時間 - 実際の実行時間
かかった時間には含まれません: - Elasticsearchにリクエストを送信するのに必要な時間
- JSONレスポンスをシリアライズするのに必要な時間
- クライアントにレスポンスを送信するのに必要な時間
timed_out
- (Boolean)
true
の場合、リクエストは完了前にタイムアウトしました。 hits
- (オブジェクト) 一致するイベントとシーケンスを含みます。また、関連するメタデータも含まれます。
- `````total
- (オブジェクト) 一致するイベントまたはシーケンスの数に関するメタデータ。
- `````value
sequences
- (オブジェクトの配列) クエリに一致するイベントシーケンスを含みます。各オブジェクトは一致するシーケンスを表します。このパラメータは、シーケンスを含むEQLクエリに対してのみ返されます。
- `````join_keys
- (値の配列) シーケンス内の一致を制約するために使用される共有フィールド値。これらは、EQLクエリ構文内の
by
キーワードを使用して定義されます。 events
- (オブジェクトの配列) クエリに一致するイベントを含みます。各オブジェクトは一致するイベントを表します。
events
オブジェクトのプロパティ _index
- (文字列) イベントを含むインデックスの名前。
_id
- (文字列) イベントの一意の識別子。このIDはインデックス内でのみ一意です。
_source
- (オブジェクト) インデックス時にイベントに渡された元のJSONボディ。
events
- (オブジェクトの配列) クエリに一致するイベントを含みます。各オブジェクトは一致するイベントを表します。
- `````_index
- (文字列) イベントを含むインデックスの名前。
_id
- (文字列) イベントの一意の識別子。このIDはインデックス内でのみ一意です。
_source
- (オブジェクト) インデックス時にイベントに渡された元のJSONボディ。
Examples
Basic query example
次のEQL検索リクエストは、次の条件を満たすprocess
のevent.category
を持つイベントを検索します:
cmd.exe
のprocess.name
2013
以外のprocess.pid
Python
resp = client.eql.search(
index="my-data-stream",
query="\n process where (process.name == \"cmd.exe\" and process.pid != 2013)\n ",
)
print(resp)
Ruby
response = client.eql.search(
index: 'my-data-stream',
body: {
query: "\n process where (process.name == \"cmd.exe\" and process.pid != 2013)\n "
}
)
puts response
Js
const response = await client.eql.search({
index: "my-data-stream",
query:
'\n process where (process.name == "cmd.exe" and process.pid != 2013)\n ',
});
console.log(response);
Console
GET /my-data-stream/_eql/search
{
"query": """
process where (process.name == "cmd.exe" and process.pid != 2013)
"""
}
APIは次のレスポンスを返します。hits.events
プロパティ内の一致するイベントは、タイムスタンプに基づいて、Unix epochからのミリ秒に変換され、昇順にソートされます。
2つ以上のイベントが同じタイムスタンプを共有する場合、tiebreaker_field
フィールドが使用されて、イベントが昇順にソートされます。
Console-Result
{
"is_partial": false,
"is_running": false,
"took": 6,
"timed_out": false,
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"events": [
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "babI3XMBI9IjHuIqU0S_",
"_source": {
"@timestamp": "2099-12-06T11:04:05.000Z",
"event": {
"category": "process",
"id": "edwCRnyD",
"sequence": 1
},
"process": {
"pid": 2012,
"name": "cmd.exe",
"executable": "C:\\Windows\\System32\\cmd.exe"
}
}
},
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "b6bI3XMBI9IjHuIqU0S_",
"_source": {
"@timestamp": "2099-12-07T11:06:07.000Z",
"event": {
"category": "process",
"id": "cMyt5SZ2",
"sequence": 3
},
"process": {
"pid": 2012,
"name": "cmd.exe",
"executable": "C:\\Windows\\System32\\cmd.exe"
}
}
}
]
}
}
Sequence query example
次のEQL検索リクエストは、次の条件を満たすイベントのシーケンスに一致します:
- 1. 次のイベントで開始します:
file
のevent.category
cmd.exe
のfile.name
2013
以外のprocess.pid
- 2. 次のイベントに続きます:
process
のevent.category
regsvr32
を含むprocess.executable
これらのイベントは、同じprocess.pid
値を共有する必要があります。
Python
resp = client.eql.search(
index="my-data-stream",
query="\n sequence by process.pid\n [ file where file.name == \"cmd.exe\" and process.pid != 2013 ]\n [ process where stringContains(process.executable, \"regsvr32\") ]\n ",
)
print(resp)
Ruby
response = client.eql.search(
index: 'my-data-stream',
body: {
query: "\n sequence by process.pid\n [ file where file.name == \"cmd.exe\" and process.pid != 2013 ]\n [ process where stringContains(process.executable, \"regsvr32\") ]\n "
}
)
puts response
Js
const response = await client.eql.search({
index: "my-data-stream",
query:
'\n sequence by process.pid\n [ file where file.name == "cmd.exe" and process.pid != 2013 ]\n [ process where stringContains(process.executable, "regsvr32") ]\n ',
});
console.log(response);
Console
GET /my-data-stream/_eql/search
{
"query": """
sequence by process.pid
[ file where file.name == "cmd.exe" and process.pid != 2013 ]
[ process where stringContains(process.executable, "regsvr32") ]
"""
}
APIは次のレスポンスを返します。一致するシーケンスはhits.sequences
プロパティに含まれています。hits.sequences.join_keys
プロパティには、各一致イベントの共有process.pid
値が含まれています。
Console-Result
{
"is_partial": false,
"is_running": false,
"took": 6,
"timed_out": false,
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"sequences": [
{
"join_keys": [
2012
],
"events": [
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "AtOJ4UjUBAAx3XR5kcCM",
"_source": {
"@timestamp": "2099-12-06T11:04:07.000Z",
"event": {
"category": "file",
"id": "dGCHwoeS",
"sequence": 2
},
"file": {
"accessed": "2099-12-07T11:07:08.000Z",
"name": "cmd.exe",
"path": "C:\\Windows\\System32\\cmd.exe",
"type": "file",
"size": 16384
},
"process": {
"pid": 2012,
"name": "cmd.exe",
"executable": "C:\\Windows\\System32\\cmd.exe"
}
}
},
{
"_index": ".ds-my-data-stream-2099.12.07-000001",
"_id": "OQmfCaduce8zoHT93o4H",
"_source": {
"@timestamp": "2099-12-07T11:07:09.000Z",
"event": {
"category": "process",
"id": "aR3NWVOs",
"sequence": 4
},
"process": {
"pid": 2012,
"name": "regsvr32.exe",
"command_line": "regsvr32.exe /s /u /i:https://...RegSvr32.sct scrobj.dll",
"executable": "C:\\Windows\\System32\\regsvr32.exe"
}
}
}
]
}
]
}
}