字串運算子
KQL 提供各種查詢運算子來搜尋字串資料類型。 下列文章說明如何檢索字串術語、列出字串查詢運算子,以及提供最佳化效能的提示。
瞭解字串術語
KQL 會檢索所有直欄,包括 string類型的直欄。 視實際資料而定,會針對這類直欄建置多個索引。 這些索引不會直接公開,但會在查詢中使用其名稱含有 has 的 string 運算子 (例如 has、 !has、 hasprefix、 !hasprefix)。 這些運算子的語意是由直欄編碼的方式來指定。 這些運算子會比對 terms,而不是執行 "plain" 子字串比對。
什麼是術語?
依預設,每一個 string 值會分成 ASCII 英數字元的最大序列,且每一個序列會分成一個術語。 例如,在下列 string中,術語為 KQL、 KQLExplorerQueryRun及下列子字串: ad67d136、 c1db、 4f9f、 88ef、 d94f3b6b0b5a。
KQL: ad67d136-c1db-4f9f-88ef-d94f3b6b0b5a;KustoExplorerQueryRun
KQL 會建置一個術語索引,其中包含 三個字元或以上的所有術語, has、 !has等之類的字串運算子會使用這個索引。 如果查詢尋找的術語小於三個字元,或使用 contains 運算子,則查詢將回復為掃描直欄中的值。 掃描比查閱術語索引中的術語慢得多。
字串上的運算子
下表使用下列縮寫:
- RHS = 表示式的右側
- LHS = 表示式左側
具有 _cs 字尾的運算子會區分大小寫。
目前僅 ASCII 文字支援不區分大小寫的運算子。 對於非 ASCII 比較,請使用 tolower () 函數。
| 運算子 | 說明 | 區分大小寫 | 範例 (生產 true) |
|---|---|---|---|
== |
等於 | True | "aBc" == "aBc" |
!= |
不等於 | True | "abc" != "ABC" |
=~ |
等於 | 否 | "abc" =~ "ABC" |
!~ |
不等於 | 否 | "aBc" !~ "xyz" |
contains |
RHS 作為 LHS 的子序列出現 | 否 | "FabriKam" contains "BRik" |
!contains |
RHS 未出現在 LHS 中 | 否 | "Fabrikam" !contains "xyz" |
contains_cs |
RHS 作為 LHS 的子序列出現 | True | "FabriKam" contains_cs "Kam" |
!contains_cs |
RHS 未出現在 LHS 中 | True | "Fabrikam" !contains_cs "Kam" |
endswith |
RHS 是 LHS 的結束子序列 | 否 | "Fabrikam" endswith "Kam" |
!endswith |
RHS 不是 LHS 的結束子序列 | 否 | "Fabrikam" !endswith "brik" |
endswith_cs |
RHS 是 LHS 的結束子序列 | True | "Fabrikam" endswith_cs "kam" |
!endswith_cs |
RHS 不是 LHS 的結束子序列 | True | "Fabrikam" !endswith_cs "brik" |
has |
右側 (RHS) 是左側 (LHS) 中的完整術語 | 否 | "North America" has "america" |
!has |
在 LHS 中, RHS 不是完整術語 | 否 | "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 中的一個完整術語 | True | "North America" has_cs "America" |
!has_cs |
在 LHS 中, RHS 不是完整術語 | True | "North America" !has_cs "amer" |
hasprefix |
RHS 是 LHS 中的術語字首 | 否 | "North America" hasprefix "ame" |
!hasprefix |
RHS 不是 LHS 中的術語字首 | 否 | "North America" !hasprefix "mer" |
hasprefix_cs |
RHS 是 LHS 中的術語字首 | True | "North America" hasprefix_cs "Ame" |
!hasprefix_cs |
RHS 不是 LHS 中的術語字首 | True | "North America" !hasprefix_cs "CA" |
hassuffix |
RHS 是 LHS 中的術語字尾 | 否 | "North America" hassuffix "ica" |
!hassuffix |
RHS 不是 LHS 中的術語字尾 | 否 | "North America" !hassuffix "americ" |
hassuffix_cs |
RHS 是 LHS 中的術語字尾 | True | "North America" hassuffix_cs "ica" |
!hassuffix_cs |
RHS 不是 LHS 中的術語字尾 | True | "North America" !hassuffix_cs "icA" |
in |
等於其中一個元素 | True | "abc" in ("123", "345", "abc") |
!in |
不等於任何元素 | True | "bca" !in ("123", "345", "abc") |
in~ |
等於任何元素 | 否 | "Abc" in~ ("123", "345", "abc") |
!in~ |
不等於任何元素 | 否 | "bCa" !in~ ("123", "345", "ABC") |
matches regex |
LHS 包含 RHS 的相符項 | True | "Fabrikam" matches regex "b.*k" |
startswith |
RHS 是 LHS 的起始子序列 | 否 | "Fabrikam" startswith "fab" |
!startswith |
RHS 不是 LHS 的起始子序列 | 否 | "Fabrikam" !startswith "kam" |
startswith_cs |
RHS 是 LHS 的起始子序列 | True | "Fabrikam" startswith_cs "Fab" |
!startswith_cs |
RHS 不是 LHS 的起始子序列 | True | "Fabrikam" !startswith_cs "fab" |
包含 has 搜尋已編製索引的 詞彙 (包含三個以上字元,而不是子字串相符項) 的所有運算子。 術語是透過將字串分解成 ASCII 英數字元序列來建立。 請參閱 瞭解字串術語。
效能提示
為了獲得更好的效能,當有兩個操作員執行相同的作業時,請使用區分大小寫的運算子。 例如:
- 使用
==,不使用=~ - 使用
in,不使用in~ - 使用
hassuffix_cs,不使用hassuffix
為了更快的結果,如果您要測試是否存在由非英數字元連結的符號或英數單字,或欄位的開頭或結尾,請使用 has 或 in。 has 的運作速度比 contains、 startswith或 endswith更快。