文字列演算子

Kusto 照会言語 (KQL) には、文字列データ型を検索するためのさまざまなクエリ演算子が用意されています。 以下の記事では、文字列用語にインデックスを付ける方法、文字列クエリ演算子の一覧、パフォーマンスを最適化するためのヒントを示します。

文字列用語について

Kusto では、string 型の列を含むすべての列にインデックスが付けられます。 実際のデータに応じて、このような列には複数のインデックスが作成されます。 これらのインデックスは直接公開されませんが、has!hashasprefix!hasprefix など、名前に has が含まれる string 演算子によるクエリで使用されます。 これらの演算子のセマンティクスは、列のエンコード方法によって決まります。 これらの演算子を使用すると、"プレーンな" 部分文字列の一致ではなく、"用語" の一致が行われます。

用語とは

既定では、各 string 値は英数字の最大シーケンスに分割され、それらの各シーケンスは 1 つの用語になります。

たとえば、次の string の場合、用語は KustoKustoExplorerQueryRun で、ad67d136c1db4f9f88efd94f3b6b0b5a は部分文字列です。

Kusto: ad67d136-c1db-4f9f-88ef-d94f3b6b0b5a;KustoExplorerQueryRun

Kusto の場合、"3 文字以上" のすべての用語で構成される用語インデックスが構築され、このインデックスは文字列演算子 has!has などで使用されます。 クエリで 3 文字未満の用語が検索される場合、または contains 演算子が使用される場合、クエリは列の値のスキャンに戻ります。 スキャンは、用語インデックスでの用語の検索よりはるかに低速です。

Note

EngineV2 では、用語は 4 文字以上で構成されます。

文字列の演算子

この記事では、次の省略形を使用します。

  • RHS = 式の右辺
  • LHS = 式の左辺

_cs というサフィックスが付いている演算子では、大文字と小文字が区別されます。

演算子 説明 大文字と小文字の区別 例 (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 は、containsstartswith、または endswith より速く動作します。

IPv4 アドレスやそのプレフィックスを検索するには、この目的に合わせて最適化された特殊な IPv4 アドレスの演算子のいずれかを使用します。

詳細については、「クエリのベスト プラクティス」を参照してください。

たとえば、次のクエリは 1 番目の方が速く実行されます。

StormEvents | where State has "North" | count;
StormEvents | where State contains "nor" | count

IPv4 アドレスの演算子

次の演算子グループは、IPv4 アドレスやそのプレフィックスに対するインデックス高速検索を提供します。

演算子 説明 例 (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."]))