Řetězcové operátory

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 se indexují termíny řetězců, uvádí operátory řetězcových dotazů a nabízí tipy pro optimalizaci výkonu.

Principy termínů řetězců

Kusto indexuje všechny sloupce, včetně sloupců typu string. Pro tyto sloupce se vytváří více indexů v závislosti na skutečných datech. Tyto indexy nejsou přímo zveřejněné, ale používají se v dotazech s string operátory, které mají has jako součást názvu, například has, !has, hasprefix, . !hasprefix Sémantika těchto operátorů je určena způsobem kódování sloupce. Místo prosté shody podřetězece se tyto operátory shodují s termíny.

Co je termín?

Ve výchozím nastavení je každá string hodnota rozdělena do maximálních sekvencí alfanumerických znaků a každá z těchto sekvencí je tvořena termínem.

Například v následujícím stringvýrazu jsou Kustovýrazy , KustoExplorerQueryRuna následující podřetětě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é mají tři nebo více znaků, a tento index používají řetězcové operátory, jako hasjsou , !hasa tak dále. Pokud dotaz hledá termín, který je menší než tři znaky, nebo pokud 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ů.

Poznámka

Ve EngineV2 se termín skládá ze čtyř nebo více znaků.

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

U operátorů s příponou _cs se rozlišují malá a velká písmena.

Operátor Popis Case-Sensitive 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. Ne "FabriKam" contains "BRik"
!contains RHS se v LHS nevyskytuje Ne "Fabrikam" !contains "xyz"
contains_cs RHS se vyskytuje jako dílčí sekvence LHS. Ano "FabriKam" contains_cs "Kam"
!contains_cs RHS se v LHS nevyskytuje Ano "Fabrikam" !contains_cs "Kam"
endswith RHS je uzavírací podsekvence LHS. Ne "Fabrikam" endswith "Kam"
!endswith RHS není uzavírací podsekvence LHS Ne "Fabrikam" !endswith "brik"
endswith_cs RHS je uzavírací podsekvence LHS. Ano "Fabrikam" endswith_cs "kam"
!endswith_cs RHS není uzavírací podsekvence LHS Ano "Fabrikam" !endswith_cs "brik"
has Pravá strana (RHS) je celý výraz z levé strany (LHS). Ne "North America" has "america"
!has RHS není úplný termín v LHS Ne "North America" !has "amer"
has_all Stejné jako has , ale funguje u všech prvků. Ne "North and South America" has_all("south", "north")
has_any Stejné jako has , ale funguje u libovolného prvku. Ne "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. Ne "North America" hasprefix "ame"
!hasprefix RHS není předpona termínu v LHS Ne "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. Ne "North America" hassuffix "ica"
!hassuffix RHS není přípona termínu v LHS Ne "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ů. Ne "Abc" in~ ("123", "345", "abc")
!in~ Nerovná se žádnému z prvků. Ne "bCa" !in~ ("123", "345", "ABC")
matches regex LHS obsahuje shodu pro RHS Ano "Fabrikam" matches regex "b.*k"
startswith RHS je počáteční podsekvence LHS. Ne "Fabrikam" startswith "fab"
!startswith RHS není počáteční podsekvence LHS Ne "Fabrikam" !startswith "kam"
startswith_cs RHS je počáteční podsekvence LHS. Ano "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS není počáteční podsekvence LHS Ano "Fabrikam" !startswith_cs "fab"

Tipy pro zvýšení výkonu

Pokud chcete zlepšit výkon, pokud existují dva operátory, které dělají stejnou úlohu, použijte operátor rozlišující malá a velká písmena. Příklad:

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

Pokud testujete přítomnost symbolu nebo alfanumerického slova svázaného nealfanumerickými znaky nebo začátku nebo konce pole, pro zajištění rychlejších výsledků 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ů pro adresy IPv4, které jsou pro tento účel optimalizované.

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

Například první z těchto dotazů se spustí rychleji:

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

Operátory na IPv4 adresách

Následující skupina operátorů poskytuje indexované vyhledávání iPv4 adres nebo jejich předpon.

Operátor Popis Příklad (výnosy true)
has_ipv4 LHS obsahuje IPv4 adresu 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, které poskytuje 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 službou RHS. has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))