Operator string

Bahasa Kueri Kusto (KQL) menawarkan berbagai operator kueri untuk mencari jenis data string. Artikel berikut menjelaskan cara istilah string diindeks, mencantumkan operator kueri string, dan memberikan tips untuk mengoptimalkan performa.

Memahami istilah string

Kusto mengindeks semua kolom, termasuk kolom jenis string. Beberapa indeks dibuat untuk kolom tersebut, tergantung pada data aktual. Indeks ini tidak langsung diekspos, tetapi digunakan dalam kueri dengan operator string yang memiliki has sebagai bagian dari nama mereka, seperti has, !has, hasprefix, !hasprefix. Semantik operator ini ditentukan oleh cara kolom dikodekan. Alih-alih melakukan pertandingan substring "polos", operator ini cocok dengan persyaratan.

Apa itu istilah?

Secara default, setiap string nilai dipecah menjadi urutan maksimal karakter alfanumerik, dan masing-masing urutan tersebut dibuat menjadi istilah.

Misalnya, dalam string berikut, istilahnya adalah Kusto, KustoExplorerQueryRun, dan substring berikut: ad67d136, c1db, 4f9f, 88ef, d94f3b6b0b5a.

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

Kusto membuat indeks istilah yang terdiri dari semua istilah yang berupa tiga karakter atau lebih, dan indeks ini digunakan oleh operator string seperti has, !has, dan sebagainya. Jika kueri mencari istilah yang lebih kecil dari tiga karakter, atau menggunakan operator contains, kueri akan kembali memindai nilai di kolom. Pemindaian jauh lebih lambat daripada mencari istilah dalam indeks istilah.

Catatan

Dalam EngineV2, istilah terdiri dari empat karakter atau lebih.

Operator pada string

Singkatan berikut digunakan dalam artikel ini:

  • RHS = sisi kanan ekspresi
  • LHS = sisi kiri ekspresi

Operator dengan akhiran _cs peka huruf besar/kecil.

Operator Deskripsi Peka Huruf Besar/Kecil Contoh (menangguhkan true)
== Sama Ya "aBc" == "aBc"
!= Tidak sama Ya "abc" != "ABC"
=~ Sama Tidak "abc" =~ "ABC"
!~ Tidak sama Tidak "aBc" !~ "xyz"
contains RHS muncul sebagai subsequence LHS Tidak "FabriKam" contains "BRik"
!contains RHS tidak muncul dalam LHS Tidak "Fabrikam" !contains "xyz"
contains_cs RHS muncul sebagai subsequence LHS Ya "FabriKam" contains_cs "Kam"
!contains_cs RHS tidak muncul dalam LHS Ya "Fabrikam" !contains_cs "Kam"
endswith RHS adalah subsequence penutup LHS Tidak "Fabrikam" endswith "Kam"
!endswith RHS bukan subsequence penutup LHS Tidak "Fabrikam" !endswith "brik"
endswith_cs RHS adalah subsequence penutup LHS Ya "Fabrikam" endswith_cs "kam"
!endswith_cs RHS bukan subsequence penutup LHS Ya "Fabrikam" !endswith_cs "brik"
has Sisi kanan (RHS) adalah istilah keseluruhan di sisi kiri (LHS) Tidak "North America" has "america"
!has RHS bukan istilah lengkap di LHS Tidak "North America" !has "amer"
has_all Sama seperti has tetapi bekerja pada semua elemen Tidak "North and South America" has_all("south", "north")
has_any Sama seperti has tetapi bekerja pada salah satu elemen Tidak "North America" has_any("south", "north")
has_cs RHS adalah istilah lengkap di LHS Ya "North America" has_cs "America"
!has_cs RHS bukan istilah lengkap di LHS Ya "North America" !has_cs "amer"
hasprefix RHS adalah prefiks istilah di LHS Tidak "North America" hasprefix "ame"
!hasprefix RHS bukan prefiks istilah di LHS Tidak "North America" !hasprefix "mer"
hasprefix_cs RHS adalah prefiks istilah di LHS Ya "North America" hasprefix_cs "Ame"
!hasprefix_cs RHS bukan prefiks istilah di LHS Ya "North America" !hasprefix_cs "CA"
hassuffix RHS adalah akhiran istilah di LHS Tidak "North America" hassuffix "ica"
!hassuffix RHS bukan akhiran istilah di LHS Tidak "North America" !hassuffix "americ"
hassuffix_cs RHS adalah akhiran istilah di LHS Ya "North America" hassuffix_cs "ica"
!hassuffix_cs RHS bukan akhiran istilah di LHS Ya "North America" !hassuffix_cs "icA"
in Sama dengan salah satu elemen Ya "abc" in ("123", "345", "abc")
!in Tidak sama dengan satu pun elemen Ya "bca" !in ("123", "345", "abc")
in~ Sama dengan salah satu elemen Tidak "Abc" in~ ("123", "345", "abc")
!in~ Tidak sama dengan satu pun elemen Tidak "bCa" !in~ ("123", "345", "ABC")
matches regex LHS berisi kecocokan untuk RHS Ya "Fabrikam" matches regex "b.*k"
startswith RHS adalah subsequence awal LHS Tidak "Fabrikam" startswith "fab"
!startswith RHS bukan subsequence awal LHS Tidak "Fabrikam" !startswith "kam"
startswith_cs RHS adalah subsequence awal LHS Ya "Fabrikam" startswith_cs "Fab"
!startswith_cs RHS bukan subsequence awal LHS Ya "Fabrikam" !startswith_cs "fab"

Tips performa

Untuk performa yang lebih baik, ketika ada dua operator yang melakukan tugas yang sama, gunakan yang peka huruf besar/kecil. Contohnya:

  • Gunakan ==, bukan =~
  • Gunakan in, bukan in~
  • Gunakan hassuffix_cs, bukan hassuffix

Untuk hasil yang lebih cepat, jika Anda menguji keberadaan simbol atau kata alfanumerik yang terikat oleh karakter non-alfanumerik, atau awal atau akhir bidang, gunakan has atau in. has bekerja lebih cepat dari contains, startswith, atau endswith.

Untuk mencari alamat IPv4 atau awalannya, gunakan salah satu operator khusus pada alamat IPv4, yang dioptimalkan untuk tujuan ini.

Untuk informasi selengkapnya, lihat Praktik terbaik kueri.

Misalnya, kueri pertama ini akan berjalan lebih cepat:

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

Operator pada alamat IPv4

Grup operator berikut menyediakan percepatan pencarian indeks pada alamat IPv4 atau awalannya.

Operator Deskripsi Contoh (menangguhkan true)
has_ipv4 LHS berisi alamat IPv4 yang diwakili oleh RHS has_ipv4("Source address is 10.1.2.3:1234", "10.1.2.3")
has_ipv4_prefix LHS berisi alamat IPv4 yang cocok dengan awalan yang diwakili oleh RHS has_ipv4_prefix("Source address is 10.1.2.3:1234", "10.1.2.")
has_any_ipv4 LHS berisi salah satu alamat IPv4 yang disediakan oleh 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 berisi alamat IPv4 yang cocok dengan salah satu awalan yang disediakan oleh RHS has_any_ipv4_prefix("Source address is 10.1.2.3:1234", dynamic(["10.1.2.", "127.0.0."]))