字串運算子
Kusto 查詢語言 (KQL) 提供各種查詢運算子來搜尋字串資料類型。 下列文章會說明字串字詞編製索引的方式、列出字串查詢運算子,並提供用於將效能最佳化的秘訣。
了解字串字詞
Kusto 會為所有資料行編製索引,包括 string
類型的資料行在內。 視實際資料而定,這類資料行會建置多個索引。 這些索引不會直接公開,而是用於具有 string
運算子,並以 has
作為其名稱一部分的查詢中,例如 has
、!has
、hasprefix
、!hasprefix
。 這些運算子的語義會由資料行的編碼方式來加以規定。 這些運算子會比對字詞,而不會執行「純文字」子字串比對。
何謂字詞?
根據預設,每個 string
值會分成英數位元的最大序列,而且每個序列都會變成字詞。
例如,在下列 string
中,這些字詞是 Kusto
、KustoExplorerQueryRun
和下列子字串:ad67d136
、c1db
、4f9f
、88ef
、d94f3b6b0b5a
。
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
為了更快獲得結果,如果您要測試由非英數字元所繫結的符號或英數字元字組是否存在,或要測試欄位的開頭或結尾,請使用 has
或 in
。
has
的運作速度快過 contains
、startswith
或 endswith
。
若要搜尋 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."])) |
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應