Topik ini menjelaskan cara mengelola indeks pencarian.
Prasyarat
Anda telah mengaktifkan search index.
CatatanFitur search index bergantung pada LindormSearch dan Lindorm Tunnel Service (LTS). Untuk mengaktifkan fitur ini, Anda juga harus mengaktifkan LindormSearch dan LTS.
Batasan
Indeks pencarian memiliki batasan penggunaan. Untuk menghindari dampak pada beban kerja produksi Anda, tinjau Batasan sebelum menggunakannya.
Persiapan Data
Sebelum menggunakan indeks pencarian, buat tabel dan tulis data uji ke dalamnya.
Jalankan pernyataan berikut untuk membuat tabel bernama
search_table.CREATE DATABASE searchindex_db; USE searchindex_db; CREATE TABLE IF NOT EXISTS search_table (user_id BIGINT, name VARCHAR, age SMALLINT, gender VARCHAR, address VARCHAR, email VARCHAR, city VARCHAR, PRIMARY KEY (user_id));Jalankan pernyataan berikut untuk menulis empat baris data ke dalam tabel.
UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (1, 'Zhang', 18, 'M', 'Chaoyang District, Beijing', 'a***@example.net', 'Beijing'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (6, 'Li', 32, 'M', 'Yuhang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (20, 'Wang', 28, 'M', 'Binjiang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,gender,address,email,city) VALUES (28, 'Chen', 36, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen');Jalankan pernyataan berikut untuk mengkueri data dalam tabel.
SELECT * FROM search_table LIMIT 10;Hasil berikut dikembalikan:
+---------+--------+-----+--------+--------------+------------------+------+ | user_id | name | age | gender | address | email | city | +---------+--------+-----+--------+--------------+------------------+------+ | 1 | Zhang | 18 | M | Chaoyang District, Beijing | a***@example.net | Beijing | | 6 | Li | 32 | M | Yuhang District, Hangzhou | a***@example.net | Hangzhou | | 20 | Wang | 28 | M | Binjiang District, Hangzhou | a***@example.net | Hangzhou | | 28 | Chen | 36 | F | Nanshan District, Shenzhen | a***@example.net | Shenzhen | +---------+--------+-----+--------+--------------+------------------+------+
Mengelola indeks pencarian
Buat indeks pencarian berdasarkan data uji untuk memenuhi persyaratan berikut:
Cari cepat kolom apa pun dalam tabel.
Lakukan kueri tokenized pada kolom
address.Lakukan kueri fuzzy pada kolom
email.
CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table ( name, age, gender, address(type=text, analyzer=ik), email, city ) WITH (numShards=4);CatatanDalam contoh ini, numShards diatur ke
4. Artinya indeksidxmemiliki4shard. Jika Anda tidak menentukan numShards, nilai default-nya adalah dua kali jumlah node LindormSearch. Sebelum membuat indeks pencarian untuk produksi, rencanakan jumlah shard terlebih dahulu. Hal ini mencegah overload pada shard individual dan membantu menjaga stabilitas sistem. Untuk informasi lebih lanjut tentang desain shard dan praktik terbaik pengindeksan, lihat deskripsi parameter numShards.Dalam pernyataan tersebut, bidang
addressditokenisasi menggunakan alat analisis IK.Secara default, Lindorm membangun indeks pencarian secara asinkron di latar belakang. Semakin banyak data historis yang dimiliki tabel, semakin lama proses pembangunan berlangsung. Untuk membangun indeks secara sinkron, tambahkan kata kunci
SYNCke pernyataan tersebut.Untuk error umum dan solusinya saat menjalankan pernyataan CREATE INDEX, lihat FAQ.
Kueri informasi indeks pencarian untuk tabel tersebut.
SHOW INDEX FROM search_table;Hasil berikut dikembalikan:
+---------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+ | TABLE_SCHEMA | DATA_TABLE | INDEX_NAME | INDEX_STATE | INDEX_TYPE | INDEX_COVERED | INDEX_COLUMN | INDEX_TTL | INDEX_DESCRIPTION | +---------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+ | searchindex_db| search_table | idx | BUILDING | SEARCH | NA | address,city,age,gender,name,email | 0 | | +---------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+CatatanIndeks pencarian yang masih dalam proses pembangunan menunjukkan status
BUILDING. Setelah pembangunan selesai, statusnya berubah menjadiACTIVE. Untuk detail tentang bidang yang dikembalikan, lihat SHOW INDEX.Anda dapat memeriksa progres pembangunan indeks di Konsol LTS. Untuk petunjuknya, lihat Cara melihat progres build penuh indeks pencarian.
Kueri data. Untuk contoh kueri lainnya, lihat Kueri data tabel lebar menggunakan indeks pencarian.
SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND city='Hangzhou';Hasil berikut dikembalikan:
+---------+--------+-----+--------+--------------+------------------+------+ | user_id | name | age | gender | address | email | city | +---------+--------+-----+--------+--------------+------------------+------+ | 20 | Wang | 28 | M | Binjiang District, Hangzhou | a***@example.net | Hangzhou | +---------+--------+-----+--------+--------------+------------------+------+- Penting
Untuk versi LindormTable sebelum 2.7.7, nonaktifkan terlebih dahulu indeks dengan menjalankan
ALTER INDEX IF EXISTS idx ON search_table DISABLED;. Setelah dinonaktifkan, status indeks menjadiDISABLED. Untuk mengaktifkannya kembali, jalankanALTER INDEX IF EXISTS idx ON search_table REBUILD;.DROP INDEX IF EXISTS idx ON search_table;
Gunakan kolom dinamis
ALTER TABLE search_table SET 'DYNAMIC_COLUMNS' = 'true';Tambahkan kolom dinamis. Kolom dinamis harus ditambahkan secara eksplisit ke indeks pencarian. Dalam contoh ini, kolom dinamis adalah kolom
password, yang tidak ditentukan saat tabel dibuat.Buat indeks pencarian baru dan sertakan kolom dinamis.
CREATE INDEX idx USING SEARCH ON search_table(user_id,name,age,gender,password);Jika Anda sudah memiliki indeks pencarian, gunakan pernyataan ALTER INDEX untuk menambahkan kolom dinamis.
ALTER INDEX idx ON search_table ADD COLUMNS(password);
Menulis data ke kolom dinamis. Anda dapat menulis data ke kolom
passwordhanya dalam format HexString.UPSERT INTO search_table (user_id,name,age,gender,address,email,city,password) VALUES (30, 'Wang', 38, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen', 'ef0011');Kueri kolom dinamis. Anda dapat mengkueri kolom
passwordhanya jika data disimpan dalam format HexString.SELECT * FROM search_table WHERE password='ef0011' LIMIT 1;Hasil berikut dikembalikan:
+---------+--------+-----+--------+--------------+------------------+------+----------+ | user_id | name | age | gender | address | email | city | password | +---------+--------+-----+--------+--------------+------------------+------+----------+ | 30 | Wang | 38 | F | Nanshan District, Shenzhen | a***@example.net | Shenzhen | 0xef0011 | +---------+--------+-----+--------+--------------+------------------+------+----------+
Gunakan kolom wildcard
Kolom wildcard adalah kolom khusus yang namanya mengandung karakter wildcard. Setelah Anda mendefinisikan kolom wildcard, Anda dapat menulis data ke kolom mana pun yang sesuai dengan aturan wildcard tanpa perlu mendefinisikan setiap kolom terlebih dahulu. Kolom wildcard berguna ketika Anda perlu menulis data ke banyak kolom yang namanya mengikuti pola tertentu. Untuk informasi lebih lanjut, lihat Kolom wildcard.
Buat tabel lebar dan definisikan kolom wildcard. Dalam contoh ini, kolom wildcard
info_*danaddress_*didefinisikan.CREATE TABLE search_table (user_id BIGINT, name VARCHAR, age SMALLINT, `info_*` VARCHAR, `address_*` VARCHAR, PRIMARY KEY (user_id)) WITH (wildcard_column='info_*,address_*');Tambahkan kolom wildcard ke indeks pencarian. Kolom wildcard
address_*dikonfigurasi sebagai kolom tokenized.CREATE INDEX idx USING SEARCH ON search_table (name,age,`info_*`,`address_*`(type=text, analyzer=ik));Tulis data ke kolom wildcard. Kolom
info_gender,info_email, daninfo_citysesuai dengan kolom wildcardinfo_*. Kolomaddress_detailsesuai dengan kolom wildcardaddress_*. Anda tidak perlu mendefinisikan kolom-kolom ini terlebih dahulu. Saat menulis data, kolom tersebut secara otomatis sesuai dengan kolom wildcard yang bersesuaian dan mewarisi atribut seperti tipe data dan pengaturan tokenisasi.UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (1, 'Zhang', 18, 'M', 'Chaoyang District, Beijing', 'a***@example.net', 'Beijing'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (6, 'Li', 32, 'M', 'Yuhang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (20, 'Wang', 28, 'M', 'Binjiang District, Hangzhou', 'a***@example.net', 'Hangzhou'); UPSERT INTO search_table (user_id,name,age,info_gender,address_detail,info_email,info_city) VALUES (28, 'Chen', 36, 'F', 'Nanshan District, Shenzhen', 'a***@example.net', 'Shenzhen');Kueri kolom wildcard.
SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND info_city='Hangzhou' LIMIT 10;Hasil berikut dikembalikan:
+---------+--------+-----+----------------+-----------+------------------+-------------+ | user_id | name | age | address_detail | info_city | info_email | info_gender | +---------+--------+-----+----------------+-----------+------------------+-------------+ | 20 | Wang | 28 | Binjiang District, Hangzhou | Hangzhou | a***@example.net | M | +---------+--------+-----+----------------+-----------+------------------+-------------+CatatanUntuk memverifikasi apakah kueri menggunakan indeks pencarian, jalankan pernyataan EXPLAIN berikut:
EXPLAIN SELECT * FROM search_table WHERE name='Wang' AND age > 18 AND info_city='Hangzhou' LIMIT 10;.
Konfigurasikan interval refresh data
Indeks pencarian menyediakan konsistensi akhir. Data yang ditulis ke tabel lebar hanya dapat dicari melalui indeks pencarian setelah satu siklus refresh.
LindormSearch melakukan refresh data secara berkala di latar belakang. Secara default, interval refresh adalah 15 detik. Mengurangi interval ini memperpendek waktu antara penulisan data dan saat data tersebut dapat dicari. Namun, hal ini juga meningkatkan beban pada LindormSearch. Sesuaikan pengaturan ini berdasarkan penggunaan resource dan kebutuhan bisnis Anda.
Penyesuaian interval refresh data didukung pada versi LindormTable 2.8.6.1 dan yang lebih baru. Untuk memeriksa atau melakukan upgrade versi Anda saat ini, lihat Panduan Versi LindormTable dan pembaruan versi minor.
Interval refresh data dikendalikan oleh properti indeks SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL.
Untuk indeks pencarian yang sudah ada, gunakan ALTER INDEX untuk menyesuaikan properti tersebut:
ALTER INDEX idx ON search_table SET SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL='1s';Saat membuat indeks pencarian baru, gunakan klausa WITH untuk mengatur properti tersebut:
CREATE INDEX idx USING SEARCH ON search_table (name) WITH (SEARCH_INDEX_VISIBILITY_TRIGGER_INTERVAL='1s');Anda dapat memeriksa interval refresh data saat ini menggunakan SHOW INDEX:
SHOW INDEX FROM search_table;