Sdílet prostřednictvím


Řetězcové operátory

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

dotazovací jazyk Kusto (KQL) nabízí různé operátory dotazů pro vyhledávání datových typů řetězců. Následující článek popisuje, jak jsou řetězcové termíny indexovány, uvádí operátory řetězcových dotazů a poskytuje tipy pro optimalizaci výkonu.

Principy řetězcových termínů

Kusto indexuje všechny sloupce včetně sloupců typu string. Pro tyto sloupce je vytvořeno více indexů v závislosti na skutečných datech. Tyto indexy nejsou přímo vystaveny, ale používají se v dotazech s string operátory, které mají has jako součást jejich názvu, například has, !has, hasprefix!hasprefix. Sémantika těchto operátorů je diktována způsobem, jakým je sloupec kódován. Místo toho, aby se shodovaly "prosté" podřetězece, tyto operátory odpovídají termíny.

Co je termín?

Ve výchozím nastavení se každá string hodnota rozdělí do maximálních sekvencí alfanumerických znaků a každá z těchto sekvencí se vytvoří do termínu.

Například v následujících stringvýrazech jsou Kustovýrazy , KustoExplorerQueryRuna následující podřetěžce: ad67d136, c1db, 4f9f, , 88ef. d94f3b6b0b5a.

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

Kusto vytvoří index termínů, který se skládá ze všech termínů, které jsou tři znaky nebo více, a tento index se používá řetězcovými operátory, jako hasje například , !hasa tak dále. Pokud dotaz hledá termín, který je menší než tři znaky nebo používá contains operátor, dotaz se vrátí ke kontrole hodnot ve sloupci. Prohledávání je mnohem pomalejší než vyhledávání termínu v indexu termínů.

Operátory v řetězcích

V tomto článku se používají následující zkratky:

  • RHS = pravá strana výrazu
  • LHS = levá strana výrazu

Operátory s příponou _cs rozlišují malá a velká písmena.

Operátor Popis Rozlišovat malá a velká písmena Příklad (výnosy true)
== Je rovno Ano "aBc" == "aBc"
!= Nerovná se Ano "abc" != "ABC"
=~ Je rovno No "abc" =~ "ABC"
!~ Nerovná se No "aBc" !~ "xyz"
contains RHS se vyskytuje jako dílčí sekvence LHS No "FabriKam" contains "BRik"
!contains V LHS nedojde k RHS No "Fabrikam" !contains "xyz"
contains_cs RHS se vyskytuje jako dílčí sekvence LHS Ano "FabriKam" contains_cs "Kam"
!contains_cs V LHS nedojde k RHS Ano "Fabrikam" !contains_cs "Kam"
endswith RHS je závěrečnou dílčí sekvencí LHS. No "Fabrikam" endswith "Kam"
!endswith RHS není závěrečnou dílčí sekvencí LHS. No "Fabrikam" !endswith "brik"
endswith_cs RHS je závěrečnou dílčí sekvencí LHS. Ano "Fabrikam" endswith_cs "kam"
!endswith_cs RHS není závěrečnou dílčí sekvencí LHS. Ano "Fabrikam" !endswith_cs "brik"
has Pravá strana (RHS) je celý termín na levé straně (LHS). No "North America" has "america"
!has RHS není úplný termín v LHS No "North America" !has "amer"
has_all Stejné jako has u všech prvků, ale funguje na všech prvech No "North and South America" has_all("south", "north")
has_any Stejné jako has u některého z prvků funguje No "North America" has_any("south", "north")
has_cs RHS je celý termín v LHS Ano "North America" has_cs "America"
!has_cs RHS není úplný termín v LHS Ano "North America" !has_cs "amer"
hasprefix RHS je předpona termínu v LHS. No "North America" hasprefix "ame"
!hasprefix RHS není předpona termínu v LHS No "North America" !hasprefix "mer"
hasprefix_cs RHS je předpona termínu v LHS. Ano "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS není předpona termínu v LHS Ano "North America" !hasprefix_cs "CA"
hassuffix RHS je přípona termínu v LHS. No "North America" hassuffix "ica"
!hassuffix RHS není přípona termínu v LHS No "North America" !hassuffix "americ"
hassuffix_cs RHS je přípona termínu v LHS. Ano "North America" hassuffix_cs "ica"
!hassuffix_cs RHS není přípona termínu v LHS Ano "North America" !hassuffix_cs "icA"
in Rovná se některému z prvků. Ano "abc" in ("123", "345", "abc")
!in Nerovná se žádnému z prvků. Ano "bca" !in ("123", "345", "abc")
in~ Rovná se některému z prvků. No "Abc" in~ ("123", "345", "abc")
!in~ Nerovná se žádnému z prvků. No "bCa" !in~ ("123", "345", "ABC")
matches regex LHS obsahuje shodu pro RHS. Ano "Fabrikam" matches regex "b.*k"
startswith RHS je počáteční dílčí sekvence LHS. No "Fabrikam" startswith "fab"
!startswith RHS není počáteční dílčí sekvencí LHS. No "Fabrikam" !startswith "kam"
startswith_cs RHS je počáteční dílčí sekvence LHS. Ano "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS není počáteční dílčí sekvencí LHS. Ano "Fabrikam" !startswith_cs "fab"

Tipy týkající se výkonu

Pokud existují dva operátory, které provádějí stejnou úlohu, pro zajištění lepšího výkonu použijte jeden operátor s rozlišováním velkých a malých písmen. Příklad:

  • Použít ==, ne =~
  • Použít in, ne in~
  • Použít hassuffix_cs, ne hassuffix

Pokud chcete zrychlit výsledky, testujete přítomnost symbolu nebo alfanumerického slova vázaného nealnumerickými znaky nebo počátečním nebo koncovým polem, použijte has nebo in. has funguje rychleji než contains, startswithnebo endswith.

Pokud chcete vyhledat adresy IPv4 nebo jejich předpony, použijte jeden ze speciálních operátorů na adresách IPv4, které jsou optimalizované pro tento účel.

Další informace najdete v tématu Osvědčené postupy pro dotazy.

Například první z těchto dotazů bude rychlejší:

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

Operátory na adresách IPv4

Následující skupina operátorů poskytuje akcelerované vyhledávání indexů na adresách IPv4 nebo jejich předponách.

Operátor Popis Příklad (výnosy true)
has_ipv4 LHS obsahuje adresu IPv4 reprezentovanou RHS. has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS obsahuje adresu IPv4, která odpovídá předponě reprezentované RHS. has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS obsahuje jednu z IPv4 adres poskytovaných RHS. 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 obsahuje adresu IPv4, která odpovídá jedné z předpon poskytovaných RHS. has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))