Topik ini menjelaskan cara membuat dan menggunakan indeks teks penuh pada In-Memory Column Index (IMCI) di PolarDB for MySQL. Dengan mengonfigurasi inverted index dalam COMMENT tingkat kolom, Anda dapat melakukan pencarian fuzzy dengan latensi milidetik menggunakan sintaks MATCH...AGAINST atau kueri LIKE yang dioptimalkan secara otomatis. Fitur ini didasarkan pada mekanisme inverted index dan pencocokan kata kunci IMCI. Untuk informasi lebih lanjut mengenai prinsip dasarnya, lihat Cara kerja pencarian teks penuh IMCI.
Prasyarat
Kluster Anda harus memenuhi salah satu persyaratan versi berikut:
MySQL 8.0.1, dengan versi minor 8.0.1.1.52 atau lebih baru.
MySQL 8.0.2, dengan versi minor 8.0.2.2.32 atau lebih baru.
Sintaks
Di PolarDB IMCI, Anda dapat membuat, mengubah, atau menghapus inverted index dengan menentukan comment kolom saat membuat tabel atau dengan mengubah comment kolom menggunakan DDL.
Format sintaks
Definisikan indeks teks penuh saat membuat tabel:
CREATE TABLE table_name ( column_name Data_Type COMMENT "imci_fts(type=VALUE [,KEY=VALUE])" ) COMMENT 'columnar=1';Gunakan
ALTERuntuk mengubah kolom guna menambahkan atau memodifikasi indeks:ALTER TABLE table_name MODIFY column_name Data_Type COMMENT "imci_fts(type=VALUE [,KEY=VALUE])";PentingMemodifikasi
COMMENTdapat memicu pembangunan ulang inverted index. Kami menyarankan agar operasi ini dilakukan pada tabel besar selama jam sepi.Gunakan
ALTERuntuk mengubah kolom guna menghapus indeks:ALTER TABLE table_name MODIFY column_name Data_Type COMMENT 'imci_fts(enable=0)';
Parameter
Untuk membuat tabel kolom IMCI, Anda harus menetapkan 'columnar=1' dalam COMMENT tingkat tabel. Indeks teks penuh dikonfigurasi menggunakan COMMENT suatu kolom dengan format imci_fts(TYPE=VALUE[, KEY=VALUE]...). Dalam format ini, TYPE wajib diisi, KEY opsional, dan beberapa KEY dipisahkan dengan koma.
Jenis tokenizer (parameter
type):Tokenizer
typevalueDeskripsi
token
0 (Default)
Memisahkan teks berdasarkan spasi, tanda baca, dan karakter non-alfanumerik lainnya. Cocok untuk teks bahasa Inggris atau teks terformat.
ngram
1
Memisahkan teks menjadi token dengan panjang tetap, dikontrol oleh parameter
len. Cocok untuk pencocokan kabur dalam bahasa apa pun.jieba
2
Tokenizer bahasa Tionghoa berbasis kamus yang cocok untuk pencarian semantik dalam bahasa Tionghoa.
ik
3
Tokenizer bahasa Tionghoa lain yang umum digunakan.
json
4
Mengekstraksi konten dari bidang JSON untuk diindeks menggunakan ekspresi JSONPath, yang memerlukan parameter
expr.whole
5
Memperlakukan seluruh nilai kolom sebagai satu kata kunci. Ini terutama digunakan untuk mempercepat pencarian kesetaraan yang menggunakan
=atauIN.Parameter konfigurasi (pasangan
KEY-VALUE):Parameter (KEY)
Default
Deskripsi
Jenis tokenizer yang berlaku (
type)enable
1
1(Default): Membuat inverted index.0: Menghapus inverted index.
All
type
0
Menentukan jenis tokenizer. Untuk informasi lebih lanjut, lihat tabel sebelumnya.
All
len
-
Panjang token untuk tokenizer
ngram. Nilainya harus berada dalam rentang[2, 256).type=1(ngram)mode
0
Mode tokenizer:
jieba (
type=2):0(Default): mode akurat1: mode penuh2: mode mesin pencari
ik (
type=3):0(Default): mode cerdas1: mode granularitas tertinggi
json (
type=4):0(Default): mode array
type=2, 3, 4score
0
Menentukan apakah akan mendukung peringkat skor relevansi:
0(Default): Menonaktifkan pembuatan statistik seperti term frequency (TF) dan document frequency (DF). Peringkat diabaikan.1: Mengaktifkan pembuatan statistik. Ini mendukung peringkat skor relevansi untuk kueriMATCH ... AGAINST.
All
seg_size
0
Menentukan ukuran segmen inverted index:
0: Menggunakan nilai variabel sistemimci_fts_build_segment_size.Nilai lain: Menentukan ukuran segmen kustom.
All
pack_cnt_min
0
Jumlah minimum paket yang digunakan saat membangun segmen inverted index:
0: Menggunakan nilai variabel sistemimci_fts_build_packcnt_min.Nilai lain: Menentukan nilai kustom.
All
pack_cnt_max
0
Jumlah maksimum paket yang digunakan saat membangun segmen inverted index:
0: Menggunakan nilai variabel sistemimci_fts_build_packcnt_max.Nilai lain: Menentukan nilai kustom.
All
stop_word
0
Menentukan apakah akan mengaktifkan penyaringan stop word:
0(Default): Dinonaktifkan.1: Diaktifkan.
All
case_sensitive
0
Menentukan apakah indeks peka terhadap huruf besar/kecil:
0(Default): Tidak peka huruf besar/kecil.1: Peka huruf besar/kecil.
All
Contoh penggunaan
Langkah 1: Buat indeks teks penuh
Buat indeks teks penuh pada kolom yang ingin Anda cari dan pilih tokenizer berdasarkan kebutuhan bisnis Anda.
Buat tabel uji dengan In-Memory Column Index (IMCI).
CREATE TABLE t1 ( id INT PRIMARY KEY, title VARCHAR(32) COMMENT "imci_fts(type=2)" )CHARSET utf8mb4 COMMENT 'columnar=1';(Opsional) Modifikasi indeks teks penuh. Gunakan pernyataan
ALTER TABLEuntuk menambahkan indeks teks penuh ke kolomtitledan tentukan tokenizerjiebadalam mode akurat.ALTER TABLE t1 MODIFY title VARCHAR(32) COMMENT "imci_fts(type=2,mode=0)";(Opsional) Verifikasi efek tokenisasi. Sebelum memilih tokenizer, Anda dapat menggunakan fungsi
dbms_imci.fts_tokenizeuntuk melihat pratinjau bagaimana tokenizer berbeda memproses teks Anda.-- Tokenizer token default CALL dbms_imci.fts_tokenize("I am PolarDB"); -- Hasil: ["i", "am", "polardb"] -- Tokenizer ngram CALL dbms_imci.fts_tokenize("I am PolarDB", "type=1"); -- Hasil: ["i ", " a", "am", "m ", " p", "po", "ol", "ar", "rd", "db"] -- Tokenizer jieba CALL dbms_imci.fts_tokenize("I am PolarDB", "type=2"); -- Hasil: ["PolarDB"] -- Tokenizer jieba, mode penuh CALL dbms_imci.fts_tokenize("I am PolarDB", "type=2,mode=1"); -- Hasil: ["polardb"]
Langkah 2: Jalankan pencarian teks penuh
Setelah Anda membuat indeks, IMCI membangunnya di latar belakang. Setelah pembangunan selesai, Anda dapat menjalankan kueri teks menggunakan sintaks MATCH...AGAINST atau pernyataan LIKE yang dioptimalkan.
Gunakan kueri
MATCH...AGAINST:-- Masukkan data sampel INSERT INTO t1 VALUES (16, 'polarDB full-text index function title'), (17, 'database title performance optimization'); -- Kueri catatan di mana kolom title berisi "title" SELECT * FROM t1 WHERE MATCH(title) AGAINST("title");Jalankan perintah
EXPLAINuntuk melihat rencana eksekusi. OperatorFtsTableScanmenunjukkan bahwa kueri menggunakan indeks teks penuh.EXPLAIN SELECT * FROM t1 WHERE MATCH(title) AGAINST("title") AND id > 10; +----+------------------------+------+-----------------------------------------------------------------+ | ID | Operator | Name | Extra Info | +----+------------------------+------+-----------------------------------------------------------------+ | 1 | Select Statement | | IMCI Execution Plan (max_dop = 32, max_query_mem = 41230008320) | | 2 | └─Compute Scalar | | | | 3 | └─FILTER | | Cond:(t1.id > 10) | | 4 | └─FtsTableScan | t1 | Term:("title") Fallback:(t1.title LIKE "%title%") | +----+------------------------+------+-----------------------------------------------------------------+Bidang
Fallbackmenunjukkan bahwa untuk data inkremental yang belum diindeks, sistem secara otomatis melakukan pemindaian tambahan menggunakan predikatLIKEuntuk memastikan hasil lengkap.Percepat kueri
LIKE. Untuk memastikan kompatibilitas dengan kode aplikasi yang ada, IMCI dapat secara otomatis mengonversi kueriLIKEtertentu menjadi kueriMATCH...AGAINSTuntuk percepatan.SET imci_convert_like_to_match = on; EXPLAIN SELECT * FROM t1 WHERE title LIKE "%title%"; +----+------------------------+------+-----------------------------------------------------------------+ | ID | Operator | Name | Extra Info | +----+------------------------+------+-----------------------------------------------------------------+ | 1 | Select Statement | | IMCI Execution Plan (max_dop = 32, max_query_mem = 41230008320) | | 2 | └─Compute Scalar | | | | 3 | └─FILTER | | Cond:(t1.title LIKE "%title%") | | 4 | └─FtsTableScan | t1 | Term:("title") Fallback:(t1.title LIKE "%title%") | +----+------------------------+------+-----------------------------------------------------------------+Rencana eksekusi juga menunjukkan operator
FtsTableScan, yang menunjukkan bahwa IMCI berhasil mempercepat kueriLIKE.Konversi
MATCHkeLIKE. Jika indeks teks penuh tidak tersedia, IMCI dapat mengonversi kueriMATCHmenjadi kueriLIKEuntuk memastikan kueri tetap dapat dijalankan dan memanfaatkan indeks yang ada jika memungkinkan. Rencana eksekusi menunjukkan pemindaian tabel penuh.SET imci_enable_query_fts_like = on; EXPLAIN SELECT * FROM t1 WHERE MATCH(title) AGAINST("title"); +----+----------------------+------+-----------------------------------------------------------------+ | ID | Operator | Name | Extra Info | +----+----------------------+------+-----------------------------------------------------------------+ | 1 | Select Statement | | IMCI Execution Plan (max_dop = 32, max_query_mem = 41230008320) | | 2 | └─Compute Scalar | | | | 3 | └─Table Scan | t1 | Cond:(title LIKE "%title%") | +----+----------------------+------+-----------------------------------------------------------------+
Langkah 3: Kelola dan pantau indeks
Kueri status pembangunan dan metadata indeks. Anda juga dapat menghapus indeks ketika tidak lagi diperlukan.
Monitor progres dan status pembangunan indeks:
-- Lihat semua inverted index SHOW imci indexes fulltext; SELECT * FROM information_schema.imci_fts_indexes; -- Lihat inverted index tertentu SHOW imci indexes fulltext FOR [db_name].[table_name]; SELECT * FROM information_schema.imci_fts_indexes WHERE schema_name='[db_name]' AND table_name='[table_name]'; -- Lihat metadata inverted index tertentu SELECT * FROM information_schema.imci_fts_index_metas WHERE schema_name='[db_name]' AND table_name='[table_name]' AND column_name='[column_name]'; -- Lihat data segmen inverted index tertentu SELECT * FROM information_schema.imci_fts_index_segs WHERE schema_name='[db_name]' AND table_name='[table_name]' AND column_name='[column_name]'; -- Lihat data paket inverted index tertentu SELECT * FROM information_schema.imci_fts_index_packs WHERE schema_name='[db_name]' AND table_name='[table_name]' AND column_name='[column_name]';Hapus indeks teks penuh. Jika Anda tidak lagi memerlukan indeks teks penuh pada suatu kolom, Anda dapat menghapusnya dengan memodifikasi
COMMENTkolom tersebut.ALTER TABLE t1 MODIFY title VARCHAR(255) COMMENT 'imci_fts(enable=0)';
Langkah 4: Parameter konfigurasi inti
Parameter | Tingkat | Deskripsi |
imci_enable_fts | Global | Menentukan apakah akan mengizinkan pembuatan inverted index pada node kolom.
|
imci_enable_fts_query | Global / Session | Menentukan apakah akan mengizinkan penggunaan inverted index pada node kolom.
|
imci_fts_build_pack_cnt_min | Global | Mengontrol jumlah minimum paket untuk setiap segmen inverted index selama proses pembangunan. Nilai valid: 0 hingga 8192. Nilai default: 8. Nilai 0 menunjukkan bahwa pembangunan ditangguhkan sementara. |
imci_fts_build_pack_cnt_max | Global | Mengontrol jumlah maksimum paket untuk setiap segmen inverted index selama proses pembangunan. Nilai valid: 0 hingga 8192. Nilai default: 128. |
imci_fts_build_segment_size | Global | Mengontrol ukuran setiap segmen inverted index selama proses pembangunan. Nilai valid: 0 hingga 4294967295. Nilai default: 536870912 (512 MB). Satuan: byte. |
imci_fts_lru_cache_capacity | Global | Kapasitas cache untuk kamus inverted index. Rentang nilai: 10% hingga 50% dari memori kelas node. Default: 10% dari memori kelas node. |
imci_enable_fts_pruner | Global / Session | Menentukan apakah akan mengaktifkan optimasi pra-penyaringan inverted index.
|
imci_convert_like_to_match | Global / Session | Menentukan apakah akan mengonversi kueri
|
imci_enable_query_fts_like | Global / Session | Menentukan apakah akan mengonversi kueri
|
imci_enable_match_expr_fallback | Global / Session | Menentukan apakah akan mengaktifkan kueri fallback pada data inkremental yang belum diindeks.
|
imci_fts_build_fts_cnt | Global | Konkurensi untuk membangun inverted index. Nilai valid: 0 hingga 512. Nilai default: 4. Catatan Parameter ini hanya tersedia dalam versi berikut:
|
imci_fts_user_dict_table | Global | Mengonfigurasi kamus kustom untuk indeks teks penuh. Format: Catatan Parameter ini hanya tersedia dalam versi berikut:
|
imci_fts_user_dict_update | Global | Menentukan apakah akan memuat ulang kamus kustom yang ditentukan oleh
Catatan Parameter ini hanya tersedia dalam versi berikut:
|
Anda tidak dapat memodifikasi parameter dengan tingkat Global langsung dari command line; Anda hanya dapat mengaturnya di Konsol. Saat menjalankan perintah di client, client secara default memperlakukan operasi tersebut sebagai operasi tingkat Session.
Kamus kustom
Fitur indeks teks penuh IMCI mendukung kamus kustom menggunakan tabel kustom, yang membantu Anda mencapai hasil tokenisasi yang lebih sesuai dengan skenario bisnis Anda.
Buat tabel kamus kustom
Pertama, buat tabel dengan struktur dan nama kolom yang sama seperti tabel
my_fts_dict.type: Jenis tokenizer. Hanya mendukung tokenizer jieba (type2) dan ik (type3).word: Kata entitas.is_added: Menentukan apakah akan menambahkan (nilai1) atau menghapus (nilai2) kata dari kamus kustom.
CREATE TABLE my_fts_dict ( `type` INT UNSIGNED NOT NULL COMMENT '2 for jieba, 3 for ik', `word` VARCHAR(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'dict word', `is_added` INT UNSIGNED NOT NULL DEFAULT 1 COMMENT '1 for add, 2 for delete' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='imci fts user dict';Kamus kustom harus berupa tabel InnoDB. Anda dapat melakukan operasi baca dan tulis seperti pada tabel biasa.
Tambahkan kata:
INSERT INTO my_fts_dict VALUES(2, "PolarDB", 1)Hapus kata:
INSERT INTO my_fts_dict(type, word, is_added) VALUES(2, "PolarDB", 2); or DELETE FROM my_fts_dict WHERE type=2 AND word = "PolarDB";
Konfigurasi kamus kustom
Setelah membuat tabel kamus kustom, Anda dapat mengatur nilai opsi
imci_fts_user_dict_table. Misalnya,test/my_fts_dict'.SET GLOBAL imci_fts_user_dict_table = 'test/my_fts_dict';Jika Anda telah mengatur parameter
imci_fts_user_dict_table, Anda dapat memicu pemuatan ulang kamus dengan mengatur parameterimci_fts_user_dict_updatekeON.SET GLOBAL imci_fts_user_dict_update = ON;CatatanKamus kustom baru hanya berlaku untuk inverted index yang dibangun setelah pembaruan. Untuk menerapkan perubahan pada inverted index yang sudah ada, Anda harus membangun ulang indeks tersebut.
FAQ
Q1: Bagaimana cara memilih tokenizer yang tepat?
Untuk teks bahasa Inggris atau teks terformat, gunakan tokenizer
tokendefault (type=0), yang memisahkan teks berdasarkan spasi dan tanda baca.Untuk pencarian presisi dalam bahasa Tionghoa, gunakan mode default tokenizer
jieba(type=2) atauik(type=3).Untuk mencari konten dalam bidang JSON, gunakan tokenizer
json(type=4) dan tentukan path JSON yang akan diindeks dengan parameterexpr.Anda dapat menggunakan fungsi dbms_imci.fts_tokenize untuk melihat pratinjau bagaimana tokenizer berbeda memproses teks Anda.
Q2: Mengapa kueri saya tidak menggunakan indeks teks penuh?
Pastikan Anda telah menjalankan perintah
SET imci_enable_fts_query = ON;. Ini adalah alasan paling umum.Periksa output
EXPLAINuntuk memastikan rencana eksekusi mencakup operatorFtsTableScan. Jika tidak ada, pola kueri mungkin tidak cocok dengan indeks, atau pengoptimal mungkin menentukan bahwa pemindaian tabel penuh lebih hemat biaya.
Q3: Apa perbedaan antara kueri LIKE dan kueri MATCH...AGAINST?
Kueri
LIKE '%keyword%'melakukan pemindaian tabel penuh dan berkinerja buruk jika tidak tersedia indeks teks penuh. Bahkan ketika dipercepat oleh IMCI, fungsionalitasnya terbatas.MATCH...AGAINSTadalah sintaks yang dirancang khusus untuk pencarian teks penuh. Ini menawarkan kinerja tinggi dan mendukung fitur lanjutan seperti kueri boolean kompleks dan peringkat skor relevansi. Kami merekomendasikan untuk memprioritaskanMATCH...AGAINSTuntuk aplikasi baru.