All Products
Search
Document Center

PolarDB:Indeks teks penuh IMCI

Last Updated:Mar 27, 2026

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 ALTER untuk mengubah kolom guna menambahkan atau memodifikasi indeks:

    ALTER TABLE table_name MODIFY column_name Data_Type COMMENT "imci_fts(type=VALUE [,KEY=VALUE])";
    Penting

    Memodifikasi COMMENT dapat memicu pembangunan ulang inverted index. Kami menyarankan agar operasi ini dilakukan pada tabel besar selama jam sepi.

  • Gunakan ALTER untuk 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

    type value

    Deskripsi

    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 = atau IN.

  • 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 akurat

      • 1: mode penuh

      • 2: mode mesin pencari

    • ik (type=3):

      • 0 (Default): mode cerdas

      • 1: mode granularitas tertinggi

    • json (type=4):
      0 (Default): mode array

    type=2, 3, 4

    score

    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 kueri MATCH ... AGAINST.

    All

    seg_size

    0

    Menentukan ukuran segmen inverted index:

    • 0: Menggunakan nilai variabel sistem imci_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 sistem imci_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 sistem imci_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.

  1. 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';
  2. (Opsional) Modifikasi indeks teks penuh. Gunakan pernyataan ALTER TABLE untuk menambahkan indeks teks penuh ke kolom title dan tentukan tokenizer jieba dalam mode akurat.

    ALTER TABLE t1 MODIFY title VARCHAR(32) COMMENT "imci_fts(type=2,mode=0)";
  3. (Opsional) Verifikasi efek tokenisasi. Sebelum memilih tokenizer, Anda dapat menggunakan fungsi dbms_imci.fts_tokenize untuk 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.

  1. 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 EXPLAIN untuk melihat rencana eksekusi. Operator FtsTableScan menunjukkan 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 Fallback menunjukkan bahwa untuk data inkremental yang belum diindeks, sistem secara otomatis melakukan pemindaian tambahan menggunakan predikat LIKE untuk memastikan hasil lengkap.

  2. Percepat kueri LIKE. Untuk memastikan kompatibilitas dengan kode aplikasi yang ada, IMCI dapat secara otomatis mengonversi kueri LIKE tertentu menjadi kueri MATCH...AGAINST untuk 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 kueri LIKE.

  3. Konversi MATCH ke LIKE. Jika indeks teks penuh tidak tersedia, IMCI dapat mengonversi kueri MATCH menjadi kueri LIKE untuk 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.

  1. 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]';
  2. Hapus indeks teks penuh. Jika Anda tidak lagi memerlukan indeks teks penuh pada suatu kolom, Anda dapat menghapusnya dengan memodifikasi COMMENT kolom 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.

  • ON (Default): Diaktifkan. Mendukung tipe data STRING, JSON, dan lainnya.

  • OFF: Dinonaktifkan.

imci_enable_fts_query

Global / Session

Menentukan apakah akan mengizinkan penggunaan inverted index pada node kolom.

  • ON: Diaktifkan.

  • OFF (Default): Dinonaktifkan.

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.

  • ON (Default): Diaktifkan.

  • OFF: Dinonaktifkan.

imci_convert_like_to_match

Global / Session

Menentukan apakah akan mengonversi kueri LIKE menjadi kueri MATCH untuk menggunakan inverted index guna percepatan.

  • ON: Diaktifkan.

  • OFF (Default): Dinonaktifkan.

  • ONLY_MATCH: Mengaktifkan pencocokan dan mengabaikan ekspresi like.

imci_enable_query_fts_like

Global / Session

Menentukan apakah akan mengonversi kueri MATCH menjadi kueri LIKE.

  • ON: Diaktifkan.

  • OFF (Default): Dinonaktifkan.

imci_enable_match_expr_fallback

Global / Session

Menentukan apakah akan mengaktifkan kueri fallback pada data inkremental yang belum diindeks.

  • ON (Default): Diaktifkan.

  • OFF: Dinonaktifkan.

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:

  • MySQL 8.0.1, dengan versi minor 8.0.1.1.54 atau lebih baru.

  • MySQL 8.0.2, dengan versi minor 8.0.2.2.34 atau lebih baru.

imci_fts_user_dict_table

Global

Mengonfigurasi kamus kustom untuk indeks teks penuh. Format: database_name/table_name.

Catatan

Parameter ini hanya tersedia dalam versi berikut:

  • MySQL 8.0.1, dengan versi minor 8.0.1.1.54 atau lebih baru.

  • MySQL 8.0.2, dengan versi minor 8.0.2.2.34 atau lebih baru.

imci_fts_user_dict_update

Global

Menentukan apakah akan memuat ulang kamus kustom yang ditentukan oleh imci_fts_user_dict_table.

  • ON: Diaktifkan.

  • OFF (Default): Dinonaktifkan.

Catatan

Parameter ini hanya tersedia dalam versi berikut:

  • MySQL 8.0.1, dengan versi minor 8.0.1.1.54 atau lebih baru.

  • MySQL 8.0.2, dengan versi minor 8.0.2.2.34 atau lebih baru.

Penting

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

  1. Pertama, buat tabel dengan struktur dan nama kolom yang sama seperti tabel my_fts_dict.

    • type: Jenis tokenizer. Hanya mendukung tokenizer jieba (type 2) dan ik (type 3).

    • word: Kata entitas.

    • is_added: Menentukan apakah akan menambahkan (nilai 1) atau menghapus (nilai 2) 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';
  2. Kamus kustom harus berupa tabel InnoDB. Anda dapat melakukan operasi baca dan tulis seperti pada tabel biasa.

    1. Tambahkan kata:

      INSERT INTO my_fts_dict VALUES(2, "PolarDB", 1)
    2. 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 parameter imci_fts_user_dict_update ke ON.

    SET GLOBAL imci_fts_user_dict_update = ON;
    Catatan

    Kamus 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 token default (type=0), yang memisahkan teks berdasarkan spasi dan tanda baca.

  • Untuk pencarian presisi dalam bahasa Tionghoa, gunakan mode default tokenizer jieba (type=2) atau ik (type=3).

  • Untuk mencari konten dalam bidang JSON, gunakan tokenizer json (type=4) dan tentukan path JSON yang akan diindeks dengan parameter expr.

  • 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?

  1. Pastikan Anda telah menjalankan perintah SET imci_enable_fts_query = ON;. Ini adalah alasan paling umum.

  2. Periksa output EXPLAIN untuk memastikan rencana eksekusi mencakup operator FtsTableScan. 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...AGAINST adalah 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 memprioritaskan MATCH...AGAINST untuk aplikasi baru.