字串運算子

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel

Kusto 查詢語言 (KQL) 提供各種查詢運算符來搜尋字串數據類型。 下列文章說明如何編製字串字詞的索引、列出字串查詢運算元,並提供優化效能的秘訣。

瞭解字串字詞

Kusto 會編制所有資料行的索引,包括 類型 string的數據行。 根據實際數據,會針對這類數據行建置多個索引。 這些索引不會直接公開,但會用於具有string其名稱一部分之運算符has的查詢,例如 has!has、、 hasprefix!hasprefix。 這些運算子的語意取決於數據行編碼的方式。 這些運算符會比對字詞,而不是執行「一般」子字串比對。

什麼是字詞?

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

例如,在下列string中,字詞為KustoKustoExplorerQueryRun和下列子字串:ad67d136、、、c1db4f9f88efd94f3b6b0b5a

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

Kusto 會建置字詞索引,其中包含三個字元以上的所有字詞,而且此索引是由字串運算符,例如 has!has等等使用。 如果查詢尋找小於三個字元的字詞,或使用 contains 運算符,則查詢會還原為掃描數據行中的值。 掃描速度比查閱字詞索引中的字詞慢得多。

字串上的運算符

本文使用下列縮寫:

  • RHS = 表達式右側
  • LHS = 表達式的左側

後綴為 _cs 區分大小寫的運算符。

Operator 描述 區分大小寫 範例 (yields true
== 等於 Yes "aBc" == "aBc"
!= 不等於 Yes "abc" != "ABC"
=~ 等於 No "abc" =~ "ABC"
!~ 不等於 No "aBc" !~ "xyz"
contains RHS 會以 LHS 的子序列發生 No "FabriKam" contains "BRik"
!contains RHS 不會發生在 LHS 中 No "Fabrikam" !contains "xyz"
contains_cs RHS 會以 LHS 的子序列發生 Yes "FabriKam" contains_cs "Kam"
!contains_cs RHS 不會發生在 LHS 中 Yes "Fabrikam" !contains_cs "Kam"
endswith RHS 是 LHS 的結尾子序列 No "Fabrikam" endswith "Kam"
!endswith RHS 不是 LHS 的結尾子序列 No "Fabrikam" !endswith "brik"
endswith_cs RHS 是 LHS 的結尾子序列 Yes "Fabrikam" endswith_cs "kam"
!endswith_cs RHS 不是 LHS 的結尾子序列 Yes "Fabrikam" !endswith_cs "brik"
has 右手邊 (RHS) 是左側的整個詞彙 (LHS) No "North America" has "america"
!has RHS 在 LHS 中不是完整詞彙 No "North America" !has "amer"
has_all has 相同,但適用於所有元素 No "North and South America" has_all("south", "north")
has_any has 相同,但適用於任何專案 No "North America" has_any("south", "north")
has_cs RHS 是 LHS 中的完整詞彙 Yes "North America" has_cs "America"
!has_cs RHS 在 LHS 中不是完整詞彙 Yes "North America" !has_cs "amer"
hasprefix RHS 是 LHS 中的字詞前置詞 No "North America" hasprefix "ame"
!hasprefix RHS 不是 LHS 中的字詞前置詞 No "North America" !hasprefix "mer"
hasprefix_cs RHS 是 LHS 中的字詞前置詞 Yes "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS 不是 LHS 中的字詞前置詞 Yes "North America" !hasprefix_cs "CA"
hassuffix RHS 是 LHS 中的字詞後綴 No "North America" hassuffix "ica"
!hassuffix RHS 不是 LHS 中的字詞後綴 No "North America" !hassuffix "americ"
hassuffix_cs RHS 是 LHS 中的字詞後綴 Yes "North America" hassuffix_cs "ica"
!hassuffix_cs RHS 不是 LHS 中的字詞後綴 Yes "North America" !hassuffix_cs "icA"
in 等於任何專案 Yes "abc" in ("123", "345", "abc")
!in 不等於任何專案 Yes "bca" !in ("123", "345", "abc")
in~ 等於任何專案 No "Abc" in~ ("123", "345", "abc")
!in~ 不等於任何專案 No "bCa" !in~ ("123", "345", "ABC")
matches regex LHS 包含 RHS 的相符專案 Yes "Fabrikam" matches regex "b.*k"
startswith RHS 是 LHS 的初始子序列 No "Fabrikam" startswith "fab"
!startswith RHS 不是 LHS 的初始子序列 No "Fabrikam" !startswith "kam"
startswith_cs RHS 是 LHS 的初始子序列 Yes "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS 不是 LHS 的初始子序列 Yes "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 位址或其前置詞上提供索引加速搜尋。

Operator 描述 範例 (yields 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."]))