データベースのチューニング:クエリ

Document created by RSA Information Design and Development on Apr 19, 2018
Version 1Show Document
  • View in full screen mode
 

このトピックでは、データベース クエリの構文について説明します。データベースでクエリを実行する主要なメカニズムは、各コア サービスの /sdk フォルダにおける query の呼び出し、 values の呼び出し、 msearch の呼び出しの3つです。

query の呼び出しでは、メタ データベースからメタ アイテムが返されます。インデックスを使用すると処理が高速化されます。

values の呼び出しでは、特定の条件でソートされた一意のメタ値のグループが返されます。countなどの集計関数でソートした一意の値のサブセットを返すのに最適です。

msearch の呼び出しでは、テキストの検索語がその入力として取得され、検索語に一致するセッションが返されます。この呼び出しでは、インデックス、メタ、rawパケット、rawログ内を検索できます。

query 構文

query メッセージの構文は次のとおりです。

 query-params = size-param, space, query-param, {space, start-meta-param}, {space, end-meta-param}; size-param = "size=", ? integer between 0 and 1,677,721 ? ; query-param = "query=", query-string ; start-meta-param = "id1=", metaid ; end-meta-param = "id2=", metaid ; metaid = ? any meta ID from the meta database ? ; 

id1id2size パラメータは、データベースから大量の結果を返すためのページング メカニズムを構成します。このメカニズムで最も恩恵を受けるのは、NetWitnessコア データベースに直接対応したアプリケーションを記述する開発者です。通常、結果は古いデータから順に返されます(メタIDの大きいものが新しいデータです)。新しいデータから順に結果が返されるようにするには、IDを逆にします(たとえば id1id2 より大きくします)。このようにすると、構文を完全に評価してからでないと逆順の処理を開始できないため、パフォーマンスが若干低下します。

サイズ設定をオフのままにしておくか、またはゼロに設定すると、すべての結果がページングされずに返されます。RESTfulインタフェースでこの処理を実行すると、チャンク エンコーディングによりフル レスポンスが返されます。ネイティブ プロトコルの場合、複数のメッセージにわたる結果が返されます。

query パラメータは query コマンド文字列で、NetWitness固有の構文を使用します。

 query-string = select-clause {, where-clause} {, group-by-clause {, order-by-clause } } ; select-clause = "select ", ( "*" | meta-or-aggregate {, meta-or-aggregate} ) ; where-clause = " where ", { where-criteria } ; meta-or-aggregate = meta | aggregate_func, "(", meta-key, ")" ; aggregate_func = "sum" | "count" | "min" | "max" | "avg" | "distinct" | "first" | "last" | "len" | "countdistinct" ; group-by-clause = " group by ", meta-key-list meta-key-list = meta-key {, meta-key-list} order-by-clause = " order by ", order-by-column order-by-column = meta-or-aggregate { "asc" | "desc" } {, order-by-column} 

select 句を使用すると、 * を指定してwhere句と一致するすべてのセッションのすべてのメタデータを返すか、メタ フィールド名のセットと集計関数を指定して、セッションごとにメタのサブセットを選択できます。

select 句に名称変更されたメタ キー名が含まれていても構いません。 select 句の中の名称変更されたキーの結果として結果セットに表示されるすべてのフィールドには、 select 句で使用されている名前と一致するメタ キー名が返されます。たとえば、 port_src キーを使用して tcp.srcport を名称変更した場合、 select port_src を含むクエリは、基盤となるメタのタイプが port_src の場合でも、 tcp.srcport フィールドのみを返します。

集計関数は、クエリ結果セットに対して次のような効果をもたらします。

                                             
関数 結果
sum すべてのメタ値を加算します。使用できるのは数字のみです
count 返されたメタ フィールドのカウントです
min 最小値です
max 最大値です
avg 数値の平均です
distinct 一意の値の一覧が返されます
countdistinct 一意の値の数が返されます。 countdistinct は、distinct関数によって返されるメタの数に相当します。
first 最初の値が返されます
last 最後の値が返されます
len 実際の値を返さずに、すべてのフィールド値をUInt32の長さに変換します。この長さは、実際の値を格納するためのバイト数で、メタ データベースに格納される構造の長さではありません。たとえば、「NetWitness」の場合、長さは10が返されます。IPv4フィールド( ip.src など)の場合は、すべて4バイトが返されます。

where

where 句ではフィルタ条件を定義し、インデックスを使用してコレクションからセッションを選択できます。

構文:

 where-criteria = criteria-or-group, { space, logical-op, space, criteria-or-group } ; criteria-or-group = criteria | group ; criteria = meta-key, ( unary-op | binary-op meta-value-ranges ) ; group = ["~"], "(" where-clause ")" ; logical-op = "&&" | "||" ; unary-op = "exists" | "!exists" ; binary-op = "=" | "!=" | "<" | ">" | ">=" | "<=" | "begins" | "contains" | "ends" | "regex" ; meta-value-ranges = meta-value-range, { ",", meta-value-range } ; meta-value-range = (meta-value | "l" ), [ "-", ( meta-value | "u" ) ] ; meta-value = number | quoted-value | ip-address | mac-address | relative-time ; quoted-value = ( '"' text '"' ) | ( '"' date-time '"' ) ; relative-time = "rtp(" , time-boundary , "," , positive-integer , time-unit, ")" ; time-boundary = "earliest" | "latest" ; positive-integer = ? any non-negative integral number ? time-unit = "s" | "m" | "h" ; 

ルール条件を指定すると、句のメタ値の meta-value 部分が、 meta-key で指定するメタの型と一致します。たとえば、キーが ip.src の場合、 meta-value はIPv4アドレスになります。

meta-key 名を使用するクエリは、 meta-key 名と、そのキーに指定されているすべての「変更名称」の両方の名前に対応するメタ アイテムを照合します。キーの名称変更の詳細については、「 インデックスのカスタマイズ 」トピックの「キーの名称変更」を参照してください。

クエリの演算子

次の表で、各演算子の機能について説明します。

                                                         
演算子 機能
= メタ値を含むセッションと完全に一致します。値の範囲が選択されている場合は、その範囲の値はすべて一致と見なされます。
!= = 演算子で記述した場合と反対で、指定した句に一致しないすべてのセッションと一致します。
< 数値の場合、演算子の右側の数値よりも小さい数値のメタを含むセッションと一致します。演算子の右側の数値が範囲で指定されている場合、その範囲の最初の値が比較対象値と見なされます。複数の範囲が指定されている場合は、動作が定義されません。テキストのメタ値の場合、辞書データの比較が実行されます。
<= 動作は < と同じですが、値の等しいメタを含むセッションも一致と見なされます。
> < 演算子と似ていますが、右側の数値よりも大きい数値を持つセッションと一致します。演算子の右側の数値が範囲で指定されている場合、その範囲の最後の値が比較対象値と見なされます。
>= 動作は > と同じですが、値の等しいメタを含むセッションも一致と見なされます。
begins 右側と同じ文字で始まるテキストのメタ値を含むセッションと一致します。
ends 右側と同じ文字で終わるテキストのメタ値を含むセッションと一致します。
contains 右側に指定したサブストリングを含むテキストのメタ値を含むセッションと一致します。
regex 右側に指定した正規表現と一致するテキストのメタ値を含むセッションと一致します。正規表現の解析はboost::regexにより処理されます。
exists 指定するメタ キーを持つメタ値を含むセッションと一致します。
!exists 指定するメタ キーを持つメタ値を含まないセッションと一致します。
length 特定のレングスのテキスト メタ値を含んだセッションと一致します。右辺の式は非負数にする必要があります。

テキスト値

テキスト値を引用符で囲んで使用します。時刻として解析できる場合を除き(以下を参照)、引用符で囲まれた値はテキストとして解釈されます。

IPアドレス

IPアドレスは、標準のIPv4アドレスおよびIPv6アドレスのテキストで表すことができます。また、クエリで CIDR 表記を使用して、アドレスの範囲を表すこともできます。CIDR表記を使用すると、同等の値の範囲まで拡大できます。

MACアドレス

MACアドレス は、次の標準的なMACアドレス表記を使用して指定できます。 aa:bb:cc:dd:ee:ff

日時の表現

NetWitness Suiteでは、日付がUNIXのエポック時刻形式で表されます。この表示は、1970/01/01 UTCを起点とする秒数です。クエリでは、時刻をこの秒数または文字列で表すことができます。日付と時刻を文字列で表すと、 "YYYY-mmm-DD HH:MM:SS" となります。3文字で表されているのは月の部分です。この部分を2桁(01~12)で表すこともできます。

時刻の値は引用符で囲む必要があります。

クエリで表す時刻は、すべてUTCです。

相対時点

相対時点は、where句で、コレクションで認識される最も古いまたは最新の時間メタを基準に決められた分オフセットした値を参照します。

相対時点の式の構文は rtp(boundary, duration) です。

boundaryは earliest または latest です。

durationは、時間、分、秒のいずれかで表します。たとえば、 24h60m60s などです。

相対時点は、最も古い時間と最新の時間のメタ範囲の取得元になるコレクションがあるSDK操作のみで使用できます。

相対時点は、インデックス作成済みのメタ タイプに対してのみ機能します。デフォルトのインデックス作成済みのメタ タイプは timeevent.time です。

例:

 Last 90m of collection time: time = rtp(latest, 90m) - u First 2 days of event time: event.time = l - rtp(earliest, 48h) 

特殊な範囲の値

範囲は通常、* smallest * - * largest *という構文で表しますが、範囲の式には特殊なプレースホルダーの値を使用することもできます。範囲の開始値としてすべてのメタ値の下限を表すために l の文字を、上限を表すために u の文字を使用することができます。これらの上限と下限は、インデックス済みのすべてのメタ値のインデックスから見つかった、最大および最小のメタ値を探すことで決定されます。

l タグまたは u タグを使用する場合は、引用符で囲まないでください。

たとえば、 time = "2014-may-20 11:57:00" - u という式は、2014/05/20 11:57:00から、コレクションで見つかった最新の時刻までのすべてと一致します。

この式は、テキスト文字列を使用した範囲の式と混同しやすいので注意が必要です。 - を含んでいるテキスト値は必ず引用符で囲んでください。またハイフンの範囲を表すために使用する場合は、引用符で囲んだテキストの外に記述してください。

group by 句(10.5以降)

クエリAPIには、query呼び出しの結果から集計グループを生成する機能があります。これは、クエリで group by 句を使用して行います。 group by を指定すると、クエリの結果セットはグループに分けられます。結果の各グループは、group by句で指定されたメタ値によって一意に識別されます。

たとえば、クエリ select count(ip.dst) について考えます。このクエリは、データベースにあるすべてのip.dstメタの数を返します。 group by ただし、 select count(ip.dst) group by ip.src のように★句を追加した場合、クエリは、一意のip.srcごとに見つかったip.dstメタの数を返します。

NetWitness Suiteバージョン10.5より、 group by 句で最大6個のメタ フィールドを利用できるようになりました。

group by 句は、 values 呼び出しと同じ機能を一部共有しており、クエリ時間は長くなりますが、大幅に高度なグループ分けを提供します。グループ分けされたクエリの結果を生成するときには、 where 句に一致するすべてのセッションのメタ データベースからメタが読み取られます。一方で、values呼び出しでは、インデックスのみを読み取ることで集計を生成できます。

クエリによって返される各グループの内容は、 select 句によって定義されます。 select 句には、任意の集計関数または選択したメタ フィールドを指定できます。複数の集計が選択された場合、集計関数の結果はグループごとに定義されます。集計以外のフィールドが選択された場合、メタ フィールドはグループごとにバッチで返されます。

group by クエリの結果セットは次のルールでエンコードされます。

  1. グループに関連づけられたすべてのメタ アイテムは、同じグループ番号で提供されます。
  2. グループに返される最初のメタ アイテムがグループ キーを識別します。たとえば、 group by 句で group by ip.src を指定した場合、各グループの最初のメタ アイテムは ip.src になります。
  3. 通常の集計以外のメタ データが group key の後に返されますが、このメタにはグループ キー メタと同じグループ番号が付けられます。
  4. 各グループの集計結果メタ フィールドが次に返されます。
  5. グループ内のすべてのフィールドが一緒に返されます。別のグループの結果はインターリーブされません。

group by メタ アイテムのいずれかが where 句で一致するいずれかのセッションから欠落している場合、そのメタ フィールドはそのグループのためにNULLとして処理されます。そのグループの結果が返されるとき、データベースにはNULLの概念がないため、グループ キーのNULL値部分はグループの結果から取り除かれます。

group by クエリのセマンティックは、返されるメタ フィールドの点で、SQLのようなデータベースと異なります。SQLデータベースでは、 group by 列が結果セットで返されるようにする場合は、 select 句でその列を明示的に選択する必要があります。NetWitnessコア データベースは、常にグループ列を最初に暗黙的に返します。

group by 句を含んだクエリは、 size パラメータが指定されている場合は結果セットのパラメータに従います。ただし、グループ化の性質により、固定サイズの結果セットが要求された場合は、グループをページングし、再構成するために呼び出し元に追加の負担がかかります。このため、 group by 呼び出しを行う場合は、明示的な結果サイズを指定しないことをお勧めします。明示的なサイズを指定しないことで、結果セット全体が部分的な結果として提供されます。

次の表に、データベースが従う、group byクエリのI/Oまたはメモリへの影響を制限する構成パラメータを示します。

             
パラメータ 機能
/sdk/config/max.query.groups これは、集計を計算するためにメモリで保持できるグループの数に対する制限です。このパラメータにより、クエリのメモリ全体の使用量を制限できます。
/sdk/config/max.where.clause.sessions これは、クエリで処理できるwhere句からのセッションの数に対する制限です。このパラメータにより、クエリを解決するためにメタおよびセッション データベースから読み取る必要があるセッションの数を制限できます。

order by 句(10.5以降)

order by 句は、 group by 句を使用するクエリに追加できます。 order by 句を指定すると、グループ化された結果のセットがソートされた順で返されます。

order by は、昇順または降順でソートするときに基準となるアイテムのセットで構成されます。ソートは、結果セットで返される任意のデータ フィールドに対して実行できます。これには、 select 句によって指定されたメタ、 select 句によって指定された集計関数の結果、 group by メタ フィールドが含まれます。

order by 句は、多数の列をソートできます。クエリで指定できる order by 列の数に制限はありませんが、各 order by 列に存在する実際上の制限は、 select 句または group by 句によって返されるものを指している必要があります。複数列のソートは、辞書順に行われます。つまり、最初の列の値が2つのグループで同じ場合は、そのグループは2番目の列を基準にソートされます。2番目の列で値が同じ場合は、3番目の列を基準にソートされます。このとき、指定された order by 列の数は関係ありません。

NetWitnessコア データベースは、クエリによって返される結果のグループそれぞれが、選択内容に対して多くの値を持つことができる点が特徴です。たとえば、メタ タイプに一致するすべてのメタ アイテムを選択し、それをグループに分けることができます。また、 distinct() 関数を使用して、個別のメタ値のグループを返すことができます。 order by 句が、複数の値を持つグループのフィールドのいずれかを参照している場合、ソート順は次のように適用されます。

  1. 各グループ内で、複数の一致する値を持つフィールドは、順序づけ句によって順序づけられます。
  2. すべてのグループは、各グループ内で見つかった順序づけられたフィールドの最初の出現を比較することでソートされます。

メタ フィールドを個別のレコードに整理するためにグループが必要なので、 order by 句は group by 句を使用するクエリでのみ使用できます。グループ化が適用されていない場合と同じように任意のクエリをソートする場合は、 group by sessionid を使用します。これにより、結果は、個別のセッションまたはイベントのグループで返されます。

group by 句は、本来はグループ キーの昇順で返されますが、 order by 句を使用して別の順序でグループを返すことができます。

order by 列で asc または desc を指定しない場合、デフォルトの順序は昇順です。

例:

 select countdistinct(ip.dst) GROUP BY ip.src ORDER BY countdistinct(ip.dst) select countdistinct(ip.dst) GROUP BY ip.src ORDER BY countdistinct(ip.dst) desc select countdistinct(ip.dst),sum(size) GROUP BY ip.src ORDER BY sum(size) desc, countdistinct(ip.dst) select sum(size) GROUP BY ip.src, ip.dst ORDER BY ip.dst desc select user.dst,time GROUP BY sessionid ORDER BY user.dst select * GROUP BY sessionid ORDER BY time 

values の呼び出し

インデックスは、インデックスに格納されている特定のメタ値にアクセスできる下位レベルのレベルの values 関数を提供します。開発者はこの関数を使用して、一意のメタ値のグループに対してより高度な演算を実行できます。

values の呼び出しパラメータの構文:

 values-params = field-name-param, space, where-param, space, size-param, {space, flags-param} {space, start-meta-param}, {space, end-meta-param}, {space, threshold-param}, {space, aggregate-func-param}, {space, aggregate-field-param}, {space, min-param}, {space, max-param} ; field-name-param = "fieldName=", meta-key ; where-param = "where=", where-clause ; size-param = "size=", ? integer between 1 and 1,677,721 ? ; start-meta-param = ? same as query message ? end-meta-param = ? same as query message ? flags-param = "flags=", {values-flag, {"," values-flag} } ; values-flag = "sessions" | "size" | "packets" | "sort-total" | "sort-value" | "order-ascending" | "order-descending" ; threshold-flag = "threshold=", ? non-negative integer ? ; aggregate-func-param = "aggregateFunction=", { aggregate-func-flag } ; aggregate-func-flag = "count" | "sum" ; aggregate-field-param = "aggregateFieldName=", meta-key ; min-param = "min=", meta-value ; max-param = "max=", meta-value ; 

values の呼び出しでは、所定のメタ キーに対して一意のメタ値のセットを返す関数を実行できます。一意の値ごとに values を呼び出すと、カウントを集計できます。合計の生成に使用する関数は、flagsパラメータにより制御します。

パラメータ

以下の表に、各パラメータの機能を示します。

                                         
パラメータ 機能
fieldName 一意の値を取得するためのメタ キー名です。たとえば fieldNameip.src の場合、この関数を実行すると、コレクションにある一意のソースIP値が返されます。 fieldName が変更名称の参照が設定されたキーを参照すると、その結果は、特定のメタ キー名と、その参照のすべてのメタ キーのフィールド値を組み合わせたセットとして定義されます。
where where 句は、一意の値を取得するためのセッションのセットをフィルタします。たとえば、 fieldNameip.src で、 where 句が ip.src = 192.168.0.0/16 の場合、 192.168.0.0 から 192.168.255.255 の範囲の値のみが返されます。 where 句の構文については、「 where句 」を参照してください。
size 返される一意の値のセットのサイズです。データベース内の一意の値の限定的なサブセットを返すように、この関数を最適化することもできます。
id1 , id2 これらのオプションのパラメータにより、一意の値の検索範囲を、メタ データベースとインデックスの特定の部分に限定することができます。大規模なコレクションの検索を高速で実行するには、メタ データベースの特定の範囲に限定するように、 id1id2 のパラメータを設定することが重要です。
flags flagsは、値のソート方法や集計方法を制御します。flagsについては、次の「valuesのフラグ」セクションで説明します。
threshold threshold パラメータを設定すると、 values を呼び出したときに、いったん閾値に達した時点で、値ごとに関連づけられる合計値の収集をショートカットできます。thresholdを指定することで、呼び出し側でデータベースから取得するのに必要なインデックスとメタ アイテムの量を減らすことができます。 threshold パラメータを省略するか、またはゼロに設定すると、このような最適化が行われません。
aggregateFunction セッション、パケット、サイズをカウントするデフォルトの動作を、 aggregateFieldName で定義する数値フィールドのカウントまたは合計に変更する場合に使用するオプションのパラメータです。これらのうち、どちらかのパラメータを指定した場合は、もう一方も指定する必要があります。 sum または count のいずれかを渡して、どちらの動作を実行するか指定します。
aggregateFieldName aggregateFunction を実行するメタ フィールドです。 aggregate フラグを設定する場合は、 aggregateFunctionaggregateFieldName の両方のパラメータを指定する必要があります。集計関数の1つを使って values の呼び出しを実行すると、セッション、パケット、サイズのセッションの合計を収集する values の呼び出しに比べて、動作が大幅に低下する場合があります。その理由は、 where 句と一致するセッションをメタ データベースから個別に取得しなければならないためです。このような処理により、クエリの大部分がメタDBボリュームのI/Oに依存することになります。集計関数を使用した values の呼び出しを実行するのにかかる時間は、 where 句と一致するセッションの数に比例します。
min , max 呼び出しにより返される最大値と最小値です。これらのパラメータを使用すると、膨大な量の値を反復処理(またはページング)し、1回の呼び出しで返される値よりも多くの値を返します。主に、フラグ sort-value,sort-ascending とともに使用され、その戻り値である最大値は以降の呼び出しで min パラメータ値として使用されます。これらの値は排他的です。 min="rsa" を指定していて、 rsa が有効な値の場合、 rsa は返されませんが、代わりに、その次に高い値が返されます。

values のフラグ

flags パラメータは、valuesの呼び出しの演算方法を制御します。flagsパラメータには3つのグループがあり、次の表に示すように、それぞれが各種演算方式に対応しています。

                 
フラグ 説明
sessions , size , packetsvalues を呼び出すと、これらのフラグのいずれかを指定して、値ごとの合計の計算方法を決定できます。フラグが sessions の場合、 values の呼び出しにより、それぞれの値を含むセッション数が返されます。フラグが size の場合、 values の呼び出しにより、それぞれの一意の値を含むセッションの合計サイズが返されます。また、それぞれの一意の値の合計サイズがレポートされます。フラグが packets の場合、valuesの呼び出しにより、それぞれの一意の値を含むセッションのパケット数が返されます。また、それぞれの一意の値の合計パケット数がレポートされます。
sort-total , sort-value これらのフラグは、結果のソート方法を制御します。フラグが sort-total の場合、収集した合計の順に結果セットがソートされます。フラグが sort-value の場合、値のソート順で結果が返されます。
order-ascending , order-descending これらのフラグは結果セットのソート順序を制御します。たとえば、合計を基準に降順でソートすると、合計が最も大きい値が最初に返されます。

values の呼び出し例

values の呼び出しは、NetWitness Suiteの[ナビゲート]ビューで幅広く使用されます。デフォルトのビューでは、次のような呼び出しが実行されます。

 /sdk/values id1=198564099173 id2=1542925695937 size=20 flags=sessions,sort-total,order-descending threshold=100000 fieldName=ip.src where="time=\"2014-May-20 13:12:00\"-\"2014-May-21 13:11:59\"" 

この例では、[ナビゲート]ビューで ip.src の一意の値が要求されています。また、一定期間内における ip.src の一意の値が要求されています。さらに、それぞれの ip.src と一致するセッション数が要求され、結果は、セッション数の合計を降順でソートした場合の、上位20件の ip.src 値となります。最後に、クエリ エンジンに最適化のヒントを与えるために、[ナビゲート]ビューにメタIDの範囲が表示されます。

msearch の呼び出し

インデックスにより、すべてのメタ タイプに対してテキスト検索を実行する、下位レベルのレベルの msearch 機能が提供されます。このタイプの検索では、既知のメタ タイプという点からユーザによるクエリの定義は必要ありません。代わりに、データベースのすべての部分を検索して照合します。 msearch は[イベント]ビューのテキスト検索で使用されます。使用できる検索フォームおよび例については、「 調査およびマルウェア解析ガイド 」のトピック「[イベント]ビューのフィルタおよび検索結果」トピックを参照してください。

msearch パラメータ:

 msearch-params = search-param, {space, where-param}, {space, limit-param}, {space, flags-param}; search-param = "search=", ? free-form search string ? ;where-param = "where=", ? optional where clause ? ; limit-param = "limit=", ? optional session scan limit ? ;flags = "flags=", {msearch-flag, {"," msearch-flag} }; msearch-flag = "sp" | "sm" | "si" | "ci" | "regex" ; 

msearch アルゴリズムは、次のような仕組みです。

  1. 3つのセットの共通部分を検索することによって、インデックスから一連のセッションが識別されます。
    • (セット1)データベース内にあるすべてのセッション
    • (セット2) where 句パラメータと一致するセッション
    • (セット3) si フラグが指定されている場合、検索文字列パラメータと一致する値をインデックス付けしたセッション。
  2. 検索で sm パラメータを指定した場合は、ステップ1で識別された一連のセッションからすべてのメタ アイテムを読み取ってスキャンが実行され、検索文字列パラメータと一致するかどうか確認されます。検索を実行した位置に最も近いサービスからメタ アイテムが読み取られます。たとえば、Brokerで検索を実行した場合、Brokerに最も近いConcentratorからメタ アイテムが読み取られますが、Archiverで検索を実行した場合は、Archiver自体からメタ アイテムが読み取られます。
  3. 検索で sp パラメータを指定した場合は、ステップ1で識別された一連のセッションからすべてのrawパケットまたはrawログのエントリーを読み取ってスキャンが実行され、検索文字列パラメータと一致するかどうか確認されます。検索を実行した位置に最も近いサービスからパケットが読み取られます。たとえば、Concentratorで検索を実行した場合、Decoderからパケット データが読み取られますが、Archiverで検索を実行した場合は、Archiver自体からパケット データが読み取られます。
  4. 一致が検出されると、 limit パラメータの限度まで、ステップ2とステップ3で一致するものが返されます。limitには、メタおよびパケット データをスキャンする最大セッション数を指定します。limitを指定しない場合は、ステップ1で特定されたセッション セット全体がスキャンされます。

msearch のフラグ

                         
フラグ 説明
sp rawパケット データをスキャンする
sm メタ データをすべてスキャンする
si メタをスキャンする前にすべての検索パラメータに対してインデックス ルックアップを実行する
ci 大文字小文字を区別しない検索を実行する。返される結果の大文字小文字は維持されます。
regex 正規表現として検索パラメータを処理する。正規表現は1つのみ指定できますが、正規表現によってはその表現が複雑になる場合があります。

msearch インデックス検索モード

si フラグを使用して指定したインデックス検索モードを使用すると、他のどのモードよりも大幅に速く結果が返されます。このモードの主な制限は、値でインデックスづけされたメタ値と一致するテキスト条件が一致するもののみを返す点です。

  • si パラメータは必ず sm フラグと組み合わせます。 si パラメータは、検索ではインデックス付けされたメタのみが照合されることを意味します。
  • si パラメータはregex検索とともに使用できますが、テキストのインデックス値のみが一致します。IPアドレスと数字はregexには一致しません。

msearch ヒント

  • 検索の時間範囲を指定する場合は常に where 句を使用する。
  • IPアドレス範囲を検索する場合は where 句でその範囲を指定する。
  • インデックス検索モードを使用しない場合は limit パラメータを使用する。使用しない場合、メタおよびパケットのデータベースによる、非常に大量のデータ読み取りが発生します。

ストアド プロシージャ

queryvalues の呼び出しには、さらに下位レベルのレベルの検索機能があります。より高度な用途向けに、サーバ側のストアド プロシージャがあります。

クエリ構文での引用符の使用

クエリ パーサは、クエリ ステートメントで一重引用符と二重引用符両方の使用を許可します。一重引用符または二重引用符で囲まれた値は、テキスト メタとして処理されます。

クエリ パーサは、ステートメントに入力されたどのような内容も解釈しようとします。クエリParserが受け入れる内容に関してはあまり厳密ではありません。

例:

reference.id=4752

この句は、 値4,752を持つ reference.id メタ値を含んだセッションを識別します。

reference.id='4752' または reference.id="4752"

この句は、 文字列4752 を持つ reference.id メタ値を含んだセッションを識別します。

ただし、クエリ エンジンは数値と、数値のように見える文字列を暗黙的に比較し、値がセマンティック上同じである場合は同等と見なします。このため、どちらの構文でも機能します。

ただし、パフォーマンス効率を最大にするには、クエリ構文がパーサによって生成されるデータ タイプと一致するようにクエリを構築することをお勧めします。

たとえば、パーサが reference.id を数値データ タイプ( uint32uint64 など)として作成している場合、数値構文を使用します。

パーサが reference.id をテキスト データ タイプとして作成している場合、文字列構文を使用します。

Previous Topic:ロールオーバー
You are here
Table of Contents > クエリ

Attachments

    Outcomes