全部产品
Search
文档中心

Lindorm:Mengelola indeks pencarian

更新时间:Feb 28, 2026

Topik ini menjelaskan cara mengelola indeks pencarian.

Prasyarat

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.

  1. 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));
  2. 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');
  3. 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.

  1. Buat indeks pencarian.

    CREATE INDEX IF NOT EXISTS idx USING SEARCH ON search_table (
      name,
      age,
      gender,
      address(type=text, analyzer=ik),
      email,
      city
    ) WITH (numShards=4);
    Catatan
    • Dalam contoh ini, numShards diatur ke 4. Artinya indeks idx memiliki 4 shard. 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 address ditokenisasi 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 SYNC ke pernyataan tersebut.

    • Untuk error umum dan solusinya saat menjalankan pernyataan CREATE INDEX, lihat FAQ.

  2. 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         |                   |
    +---------------+--------------+------------+-------------+------------+---------------+------------------------------------+-----------+-------------------+
    Catatan
    • Indeks pencarian yang masih dalam proses pembangunan menunjukkan status BUILDING. Setelah pembangunan selesai, statusnya berubah menjadi ACTIVE. 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.

  3. 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 |
    +---------+--------+-----+--------+--------------+------------------+------+
  4. Hapus indeks pencarian.

    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 menjadi DISABLED. Untuk mengaktifkannya kembali, jalankan ALTER INDEX IF EXISTS idx ON search_table REBUILD;.

    DROP INDEX IF EXISTS idx ON search_table;

Gunakan kolom dinamis

  1. Aktifkan kolom dinamis.

    ALTER TABLE search_table SET 'DYNAMIC_COLUMNS' = 'true';
  2. 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);
  3. Menulis data ke kolom dinamis. Anda dapat menulis data ke kolom password hanya 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');
  4. Kueri kolom dinamis. Anda dapat mengkueri kolom password hanya 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.

  1. Buat tabel lebar dan definisikan kolom wildcard. Dalam contoh ini, kolom wildcard info_* dan address_* 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_*');
  2. 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));
  3. Tulis data ke kolom wildcard. Kolom info_gender, info_email, dan info_city sesuai dengan kolom wildcard info_*. Kolom address_detail sesuai dengan kolom wildcard address_*. 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');
  4. 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           |
    +---------+--------+-----+----------------+-----------+------------------+-------------+
    Catatan

    Untuk 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.

Catatan

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;

FAQ

Mengapa muncul error “The Lindorm Search cluster address is null” saat saya membuat indeks?

Penyebab: Fitur search index belum diaktifkan.

Solusi: Aktifkan fitur search index, lalu jalankan kembali pernyataan CREATE INDEX.

Bagaimana cara mengatasi error “Only one search index is allowed to be created”?

Penyebab: Setiap tabel hanya mendukung satu indeks pencarian. Indeks pencarian sudah ada untuk tabel ini.

Solusi: Jika Anda tidak lagi memerlukan indeks yang ada, hapus menggunakan pernyataan DROP INDEX, lalu buat yang baru.

Bagaimana cara melihat progres build penuh indeks pencarian?

Masuk ke Konsol LTS. Di panel navigasi sebelah kiri, pilih Lindorm Search > Full Sync.