Fungsi search() melakukan pencarian teks lengkap pada data log dalam pernyataan analitik SQL. Topik ini mencakup sintaksis, contoh penggunaan, batasan, praktik terbaik, dan FAQ.
Prasyarat
LogStore Jenis Penyimpanan Standar telah dibuat. Untuk informasi selengkapnya, lihat Manage a LogStore.
Data log telah dikumpulkan. Untuk informasi selengkapnya, lihat Data ingestion overview.
index telah dibuat dan mode scan dinonaktifkan.
Contoh
Gabungkan dengan predikat SQL
Gabungkan fungsi search() dengan predikat SQL standar menggunakan operator AND untuk pemfilteran yang lebih tepat.
-- search + operator perbandingan
* | SELECT * FROM log
WHERE search('status: 200') AND request_time > 100
-- search + klausa IN
* | SELECT * FROM log
WHERE search('request_method: GET') AND status IN (200, 301, 302)
-- search + LIKE
* | SELECT * FROM log
WHERE search('status: 200') AND http_user_agent LIKE '%Chrome%'
-- search + BETWEEN
* | SELECT * FROM log
WHERE search('request_method: POST') AND request_time BETWEEN 100 AND 500
-- search + kombinasi kondisi kompleks (OR tidak boleh menyertakan search)
* | SELECT * FROM log
WHERE search('request_method: GET')
AND (status = 200 OR status = 302)
AND request_time > 50Hanya operator AND yang dapat menghubungkan fungsi
search()dengan predikat SQL lainnya.Fungsi
search()tidak boleh muncul di tingkat mana pun dalam ekspresi OR. Misalnya,search('error') OR status = 500tidak diizinkan.Operator OR diperbolehkan untuk kondisi predikat SQL lain yang tidak menyertakan fungsi
search(). Misalnya,search('error') AND (status = 500 OR status = 502)diperbolehkan.
Skenario JOIN multi-tabel
Fungsi search() mendukung skenario JOIN multi-LogStore. Setiap subkueri dalam JOIN menerapkan kondisi filter search()-nya sendiri secara independen tanpa saling mengganggu.
Setiap subkueri hanya boleh berisi satu fungsi search(). JOIN multi-tabel dapat berisi beberapa fungsi search() karena setiap fungsi search() tersebut termasuk dalam subkueri yang berbeda.
Data contoh
Contoh berikut menggunakan tabel orders (LogStore orders) dan tabel users (LogStore users).
Skema tabel orders (LogStore orders):
Field name | Field type | Description |
order_id | long | Order ID |
user_id | long | User ID, terkait dengan tabel users |
status | text | Order status, seperti completed, pending, atau cancelled |
amount | double | Jumlah pesanan |
order_type | text | Order type, seperti normal atau vip |
Skema tabel users (LogStore users):
Field name | Field type | Description |
user_id | long | User ID, primary key |
username | text | Username |
region | text | Wilayah tempat pengguna berada, seperti hangzhou, shanghai, atau beijing |
text | Email pengguna | |
age | long | Usia pengguna |
INNER JOIN
Kueri pesanan yang telah selesai (status = completed) dengan pengguna yang sesuai di wilayah hangzhou.
* | SELECT o.order_id, o.status, o.amount, u.username, u.region
FROM (
SELECT * FROM orders.log
WHERE search('status: completed')
) o
JOIN (
SELECT * FROM users.log
WHERE search('region: hangzhou')
) u
ON o.user_id = u.user_id
ORDER BY o.order_idLEFT JOIN
Kembalikan semua pesanan yang telah selesai dan cocokkan hanya dengan pengguna di wilayah shanghai. Pesanan tanpa pengguna yang cocok akan menampilkan null pada kolom terkait pengguna.
* | SELECT o.order_id, o.status, u.username, u.region
FROM (
SELECT * FROM orders.log
WHERE search('status: completed')
) o
LEFT JOIN (
SELECT * FROM users.log
WHERE search('region: shanghai')
) u
ON o.user_id = u.user_id
ORDER BY o.order_idSelf-join
Pada self-join di LogStore yang sama, terapkan kondisi kueri berbeda pada subkueri dengan alias berbeda.
Contoh berikut menggunakan tabel employees (LogStore employees) dengan skema sebagai berikut:
Field name | Field type | Description |
employee_id | long | Employee ID |
employee_name | text | Nama pegawai |
department | text | Departemen, seperti engineering atau finance |
level | text | Tingkat jabatan, seperti junior atau senior |
manager_id | long | employee_id dari manajer |
Kueri pegawai di departemen engineering beserta manajer tingkat senior mereka:
* | SELECT e.employee_name AS employee, e.department,
m.employee_name AS manager, m.level AS manager_level
FROM (
SELECT * FROM employees.log
WHERE search('department: engineering')
) e
JOIN (
SELECT * FROM employees.log
WHERE search('level: senior')
) m
ON e.manager_id = m.employee_id
ORDER BY e.employee_nameBatasan
Batas | Deskripsi |
Batasan instans tunggal | Setiap subkueri (pernyataan SELECT dasar) hanya boleh berisi satu fungsi |
Batasan operator OR | Fungsi |
Batasan mode scan | Fungsi pencarian tidak didukung dalam mode scan. |
Konflik input sintaksis kueri | Fungsi |
Jenis parameter | Parameter fungsi search harus berupa string literal. Nilai dinamis seperti referensi kolom, variabel, atau ekspresi fungsi tidak didukung. |
Batasan penggunaan kombinasi
Skenario | Didukung | Contoh |
Fungsi search tunggal |
| |
search + AND + kondisi SQL |
| |
search + AND + (c1 OR c2) |
| |
Operator OR digunakan di dalam search |
| |
search di setiap subkueri JOIN multi-tabel | Setiap subkueri beroperasi secara independen, tanpa memengaruhi subkueri lainnya. | |
Beberapa fungsi search dalam subkueri yang sama |
Sebagai gantinya, gunakan | |
search + OR + kondisi SQL |
|
Praktik terbaik
Gabungkan kondisi kueri: Gabungkan semua kondisi pencarian teks lengkap ke dalam satu panggilan fungsi
search(). Jangan gunakan beberapa fungsisearch()dalam subkueri yang sama.Gunakan kueri spesifik bidang: Gunakan format
field: valuealih-alih pencarian teks lengkap umum untuk meningkatkan presisi dan performa kueri.Gunakan tipe numerik: Untuk bidang bertipe long atau double, gunakan kueri rentang (
field in [min max]) alih-alih pencocokan teks.Gunakan jalur subfield untuk bidang JSON: Untuk bidang bertipe JSON, tentukan jalur subfield yang tepat seperti
content.statusuntuk menghindari pencocokan kabur di tingkat bidang induk.Gabungkan predikat SQL secara efektif: Fungsi search ideal untuk pencarian teks lengkap dan pemfilteran pushdown indeks. Predikat SQL cocok untuk perbandingan numerik yang tepat dan pemeriksaan kondisional. Gabungkan keduanya dengan operator AND untuk menyeimbangkan performa dan fleksibilitas.
FAQ
Error: key (xxx) is not config as key value config
Bidang yang dikueri tidak memiliki indeks bidang. Periksa konfigurasi indeks dan pastikan indeks bidang telah dibuat untuk bidang tersebut.
Error: Multiple search() functions in a single query are not supported
Beberapa fungsi search digunakan dalam subkueri yang sama. Gabungkan kondisi kueri ke dalam satu panggilan search. Misalnya, ubah search('error') AND search('timeout') menjadi search('error AND timeout').
Error: The search() function cannot be combined with OR operator
Fungsi search() dihubungkan dengan kondisi lain menggunakan operator OR. Pindahkan logika OR ke dalam fungsi search. Misalnya, ubah search('error') OR status = 500 menjadi search('error OR status: 500').
Error: The search() function is not supported in scan mode
Mode saat ini adalah mode scan, yang tidak mendukung fungsi search(). Alihkan ke mode indeks untuk menggunakan fungsi ini.