Řetězcové operátory

Kusto 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 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 vystavené, ale používají se v dotazech s string operátory, které mají has jako součást jejich názvu, například has, , !hashasprefix!hasprefix. Sémantika těchto operátorů je diktována způsobem kódování sloupce. Místo shody podřetězece "prostého" odpovídají těmto operátorům termíny.

Co je termín?

Ve výchozím nastavení se každá string hodnota rozdělí na maximální sekvence alfanumerických znaků ASCII a každá z těchto sekvencí se vytvoří jako termín. Například v následujícím stringpříkladu jsou Kustotermíny , KustoExplorerQueryRuna následující podřetěžky: ad67d136, , 88efc1db4f9f. d94f3b6b0b5a.

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

Kusto vytvoří index termínů sestávající 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 jsou , has!hasatd. 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ů.

Poznámka

V ModuluV2 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

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

Poznámka

Operátory nerozlišující malá a velká písmena se v současné době podporují jenom pro text ASCII. Pro porovnání jiných než ASCII použijte funkci tolower().

Operátor Popis Case-Sensitive Příklad (výnosy true)
== Je rovno Yes "aBc" == "aBc"
!= Nerovná se Yes "abc" != "ABC"
=~ Je rovno No "abc" =~ "ABC"
!~ Nerovná se No "aBc" !~ "xyz"
contains RHS se vyskytuje jako podsekvence LHS No "FabriKam" contains "BRik"
!contains V LHS nedochází k RHS No "Fabrikam" !contains "xyz"
contains_cs RHS se vyskytuje jako podsekvence LHS Yes "FabriKam" contains_cs "Kam"
!contains_cs V LHS nedochází k RHS Yes "Fabrikam" !contains_cs "Kam"
endswith RHS je koncová podsekvence LHS No "Fabrikam" endswith "Kam"
!endswith RHS není závěrečnou podsekvencí služby LHS No "Fabrikam" !endswith "brik"
endswith_cs RHS je koncová podsekvence LHS Yes "Fabrikam" endswith_cs "kam"
!endswith_cs RHS není závěrečnou podsekvencí služby LHS Yes "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ů No "North and South America" has_all("south", "north")
has_any Totéž 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 Yes "North America" has_cs "America"
!has_cs RHS není úplný termín v LHS Yes "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 Yes "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS není předpona termínu v LHS Yes "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 Yes "North America" hassuffix_cs "ica"
!hassuffix_cs RHS není přípona termínu v LHS Yes "North America" !hassuffix_cs "icA"
in Rovná se jednomu z prvků. Yes "abc" in ("123", "345", "abc")
!in Nerovná se žádnému z prvků. Yes "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 Yes "Fabrikam" matches regex "b.*k"
startswith RHS je počáteční podsekvence služby LHS. No "Fabrikam" startswith "fab"
!startswith RHS není počáteční podsekvence služby LHS. No "Fabrikam" !startswith "kam"
startswith_cs RHS je počáteční podsekvence služby LHS. Yes "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS není počáteční podsekvence služby LHS. Yes "Fabrikam" !startswith_cs "fab"

Tipy pro zvýšení výkonu

Pokud existují dva operátory, které provádějí stejnou úlohu, použijte pro zvýšení výkonu velká a malá písmena. Příklad:

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

Pokud chcete dosáhnout rychlejších výsledků, pokud testujete přítomnost symbolu nebo alfanumerického slova vázaného ne alfanumerický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 běžet rychleji:

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 zrychlené 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 adres IPv4 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, které poskytuje RHS. has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))