字串運算子

Kusto 查詢語言 (KQL) 提供各種查詢運算子來搜尋字串資料類型。 下列文章會說明字串字詞編製索引的方式、列出字串查詢運算子,並提供用於將效能最佳化的秘訣。

了解字串字詞

Kusto 會為所有資料行編製索引,包括 string 類型的資料行在內。 視實際資料而定,這類資料行會建置多個索引。 這些索引不會直接公開,而是用於具有 string 運算子,並以 has 作為其名稱一部分的查詢中,例如 has!hashasprefix!hasprefix。 這些運算子的語義會由資料行的編碼方式來加以規定。 這些運算子會比對字詞,而不會執行「純文字」子字串比對。

何謂字詞?

根據預設,每個 string 值會分成英數位元的最大序列,而且每個序列都會變成字詞。

例如,在下列 string 中,這些字詞是 KustoKustoExplorerQueryRun 和下列子字串:ad67d136c1db4f9f88efd94f3b6b0b5a

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

Kusto 會建置一個字詞索引,其中包含三個字元以上的所有字詞,而且 has!has 等字串運算子會使用此索引。 如果查詢尋找的字詞小於三個字元,或其使用 contains 運算子,則查詢會回復為掃描資料行中的值。 掃描比查閱字詞索引中的字詞慢很多。

注意

在 EngineV2 中,字詞是由四個或更多個字元所組成。

字串上的運算子

本文使用下列縮寫:

  • 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) 中的完整詞彙 "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"

效能秘訣

為獲得較佳效能,當有兩個運算子可執行相同的工作時,請使用會區分大小寫的運算子。 例如:

  • 使用 ==,而不是 =~
  • 使用 in,而不是 in~
  • 使用 hassuffix_cs,而不是 hassuffix

為了更快獲得結果,如果您要測試由非英數字元所繫結的符號或英數字元字組是否存在,或要測試欄位的開頭或結尾,請使用 hasinhas 的運作速度快過 containsstartswithendswith

若要搜尋 IPv4 位址或其首碼,請在 IPv4 位址上使用其中一個特殊運算子,此運算子已針對此目的優化。

如需詳細資訊,請參閱查詢最佳做法

例如,這些查詢的第一個會執行得更快:

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."]))