文字列演算子
適用対象: ✅Microsoft Fabric✅Azure データ エクスプローラー✅Azure Monitor✅Microsoft Sentinel
Kusto 照会言語 (KQL) には、文字列データ型を検索するためのさまざまなクエリ演算子が用意されています。 以下の記事では、文字列用語にインデックスを付ける方法、文字列クエリ演算子の一覧、パフォーマンスを最適化するためのヒントを示します。
文字列用語について
Kusto では、string
型の列を含むすべての列にインデックスが付けられます。 実際のデータに応じて、このような列には複数のインデックスが作成されます。 これらのインデックスは直接公開されませんが、has
、!has
、hasprefix
、!hasprefix
など、名前に has
が含まれる string
演算子によるクエリで使用されます。 これらの演算子のセマンティクスは、列のエンコード方法によって決まります。 これらの演算子を使用すると、"プレーンな" 部分文字列の一致ではなく、"用語" の一致が行われます。
用語とは
既定では、各 string
値は英数字の最大シーケンスに分割され、それらのシーケンスはそれぞれ用語になります。
たとえば、次の string
の場合、用語は Kusto
と KustoExplorerQueryRun
で、ad67d136
、c1db
、4f9f
、88ef
、d94f3b6b0b5a
は部分文字列です。
Kusto: ad67d136-c1db-4f9f-88ef-d94f3b6b0b5a;KustoExplorerQueryRun
Kusto の場合、"3 文字以上" のすべての用語で構成される用語インデックスが構築され、このインデックスは文字列演算子 has
、!has
などで使用されます。 クエリで 3 文字未満の用語が検索される場合、または contains
演算子が使用される場合、クエリは列の値のスキャンに戻ります。 スキャンは、用語インデックスでの用語の検索よりはるかに低速です。
文字列の演算子
この記事では、次の省略形を使用します。
- RHS = 式の右辺
- LHS = 式の左辺
_cs
というサフィックスが付いている演算子では、大文字と小文字が区別されます。
Operator | 説明 | 大文字と小文字の区別 | 例 (true になる) |
---|---|---|---|
== |
[等しい] | はい | "aBc" == "aBc" |
!= |
等しくない | はい | "abc" != "ABC" |
=~ |
[等しい] | いいえ | "abc" =~ "ABC" |
!~ |
等しくない | いいえ | "aBc" !~ "xyz" |
contains |
RHS が LHS のサブシーケンスとして出現する | いいえ | "FabriKam" contains "BRik" |
!contains |
RHS は LHS では発生しません | いいえ | "Fabrikam" !contains "xyz" |
contains_cs |
RHS が LHS のサブシーケンスとして出現する | はい | "FabriKam" contains_cs "Kam" |
!contains_cs |
RHS は LHS では発生しません | はい | "Fabrikam" !contains_cs "Kam" |
endswith |
RHS は LHS の終了サブシーケンスです | いいえ | "Fabrikam" endswith "Kam" |
!endswith |
RHS は LHS の終了サブシーケンスではありません | いいえ | "Fabrikam" !endswith "brik" |
endswith_cs |
RHS は LHS の終了サブシーケンスです | はい | "Fabrikam" endswith_cs "kam" |
!endswith_cs |
RHS は LHS の終了サブシーケンスではありません | はい | "Fabrikam" !endswith_cs "brik" |
has |
右辺 (RHS) が左辺 (LHS) に 1 つの単語として含まれる | いいえ | "North America" has "america" |
!has |
RHS が LHS に完全な用語として含まれない | いいえ | "North America" !has "amer" |
has_all |
has と同じだが、すべての要素で機能する |
いいえ | "North and South America" has_all("south", "north") |
has_any |
has と同じだが、任意の要素で機能する |
いいえ | "North America" has_any("south", "north") |
has_cs |
RHS は LHS 内の完全な用語である | はい | "North America" has_cs "America" |
!has_cs |
RHS が LHS に完全な用語として含まれない | はい | "North America" !has_cs "amer" |
hasprefix |
RHS は LHS に用語のプレフィックスとして含まれる | いいえ | "North America" hasprefix "ame" |
!hasprefix |
RHS は LHS に用語のプレフィックスとして含まれない | いいえ | "North America" !hasprefix "mer" |
hasprefix_cs |
RHS は LHS に用語のプレフィックスとして含まれる | はい | "North America" hasprefix_cs "Ame" |
!hasprefix_cs |
RHS は LHS に用語のプレフィックスとして含まれない | はい | "North America" !hasprefix_cs "CA" |
hassuffix |
RHS は LHS に用語のサフィックスとして含まれる | いいえ | "North America" hassuffix "ica" |
!hassuffix |
RHS は LHS に用語のサフィックスとして含まれない | いいえ | "North America" !hassuffix "americ" |
hassuffix_cs |
RHS は LHS に用語のサフィックスとして含まれる | はい | "North America" hassuffix_cs "ica" |
!hassuffix_cs |
RHS は LHS に用語のサフィックスとして含まれない | はい | "North America" !hassuffix_cs "icA" |
in |
要素のいずれかに等しい | はい | "abc" in ("123", "345", "abc") |
!in |
要素のいずれとも等しくない | はい | "bca" !in ("123", "345", "abc") |
in~ |
要素のいずれかに等しい | いいえ | "Abc" in~ ("123", "345", "abc") |
!in~ |
要素のいずれとも等しくない | いいえ | "bCa" !in~ ("123", "345", "ABC") |
matches regex |
LHS には RHS との一致が含まれている | はい | "Fabrikam" matches regex "b.*k" |
startswith |
RHS は LHS の初期サブシーケンスです | いいえ | "Fabrikam" startswith "fab" |
!startswith |
RHS は LHS の最初のサブシーケンスではありません | いいえ | "Fabrikam" !startswith "kam" |
startswith_cs |
RHS は LHS の初期サブシーケンスです | はい | "Fabrikam" startswith_cs "Fab" |
!startswith_cs |
RHS は LHS の最初のサブシーケンスではありません | はい | "Fabrikam" !startswith_cs "fab" |
パフォーマンスに関するヒント
パフォーマンスを向上させるには、同じタスクを実行する 2 つの演算子がある場合は、大文字と小文字が区別されるものを使用します。 次に例を示します。
=~
ではなく、==
を使用するin~
ではなく、in
を使用するhassuffix
ではなく、hassuffix_cs
を使用する
より速く結果を得るには、非英数字またはフィールドの開始か終了によって囲まれた記号または英数字の単語の存在をテストする場合は、has
または in
を使用します。
has
は、contains
、startswith
、または endswith
より速く動作します。
IPv4 アドレスやそのプレフィックスを検索するには、この目的に合わせて最適化された特殊な IPv4 アドレスの演算子のいずれかを使用します。
詳細については、「クエリのベスト プラクティス」を参照してください。
たとえば、次のクエリは 1 番目の方が速く実行されます。
StormEvents | where State has "North" | count;
StormEvents | where State contains "nor" | count
IPv4 アドレスの演算子
次の演算子グループは、IPv4 アドレスやそのプレフィックスに対するインデックス高速検索を提供します。
Operator | 説明 | 例 (true になる) |
---|---|---|
has_ipv4 | LHS には、RHS で表される IPv4 アドレスが含まれます | has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3") |
has_ipv4_prefix | LHS には、RHS で表されるプレフィックスと一致する IPv4 アドレスが含まれます | has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.") |
has_any_ipv4 | LHS には、RHS で指定された IPv4 アドレスのいずれかが含まれます | has_any_ipv4("Source address is 10.1.2.3:1234", dynamic(["10.1.2.3", "127.0.0.1"])) |
has_any_ipv4_prefix | LHS には、RHS で指定されたプレフィックスのいずれかと一致する IPv4 アドレスが含まれます | has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."])) |