全部产品
Search
文档中心

ApsaraDB for SelectDB:Inverted Index

更新时间:Feb 28, 2026

Inverted index adalah teknik pengambilan informasi umum yang memisahkan teks menjadi token untuk menemukan dokumen yang berisi token tersebut secara cepat. ApsaraDB for SelectDB mendukung inverted index, yang dapat digunakan untuk pencarian teks penuh pada kolom string serta kueri kesetaraan atau rentang pada kolom numerik dan tanggal. Inverted index membantu menyaring volume data besar secara cepat untuk menemukan baris yang cocok. Topik ini menjelaskan fitur inverted index ApsaraDB for SelectDB serta cara membuat dan menggunakannya.

Prinsip Indeks

Pada ApsaraDB for SelectDB, setiap baris dalam tabel merepresentasikan satu dokumen, dan setiap kolom merepresentasikan satu bidang dalam dokumen tersebut. Inverted index memungkinkan Anda menemukan baris yang berisi kata kunci tertentu dengan cepat, sehingga meningkatkan efisiensi penyaringan klausa WHERE.

Berbeda dengan indeks biasa, inverted index menyimpan data dalam file terbalik terpisah. File-file ini hanya memiliki hubungan logis dengan file data utama (segment), bukan integrasi fisik. Desain ini berarti pembaruan atau penghapusan inverted index tidak memerlukan penulisan ulang file data utama, sehingga beban pemrosesan turun secara signifikan.

Kasus Penggunaan

  • Mempercepat pencarian teks penuh pada kolom string.

  • Mempercepat penyaringan pada kolom string, numerik, dan datetime menggunakan =, !=, >, >=, <, <=.

Manfaat

  • Dukungan untuk kombinasi logika yang kaya.

    • Mendorong logika OR dan NOT ke lapisan indeks.

    • Mendukung kombinasi arbitrer dari AND, OR, dan NOT di antara beberapa kondisi.

  • Manajemen indeks yang fleksibel dan cepat.

    • Membuat inverted index saat membuat tabel.

    • Menambahkan inverted index ke tabel yang sudah ada.

    • Menghapus inverted index yang ada dari tabel.

Batasan

  • Tipe FLOAT dan DOUBLE tidak didukung karena masalah presisi floating-point. Gunakan DECIMAL sebagai gantinya. DECIMAL mendukung inverted index.

  • Beberapa tipe data kompleks tidak didukung: MAP, STRUCT, JSON, HLL, BITMAP, QUANTILE_STATE, dan AGG_STATE. Untuk JSON, gunakan VARIANT.

  • Anda dapat membuat inverted index pada kolom numerik, tetapi tidak dapat menentukan parser tokenizer seperti english, chinese, atau unicode.

  • Tabel DUPLICATE dan tabel UNIQUE dengan Merge-on-Write yang diaktifkan mendukung inverted index pada kolom apa pun. Namun, tabel AGGREGATE dan tabel UNIQUE tanpa Merge-on-Write hanya mendukung inverted index pada kolom kunci. Kolom non-kunci tidak mendukung inverted index pada model-model ini karena harus membaca seluruh data sebelum melakukan penggabungan, sehingga tidak dapat menggunakan indeks untuk penyaringan awal.

Membuat Indeks

Anda dapat membuat inverted index dengan dua cara: saat pembuatan tabel atau setelahnya pada tabel yang sudah ada.

Membuat indeks saat membuat tabel

Ini adalah operasi sinkron. Indeks siap digunakan segera setelah tabel dibuat.

Penting

Inverted index memiliki batasan berbeda di tiap model data:

  • Model Aggregate: Anda hanya dapat membuat inverted index pada kolom kunci.

  • Model Unique: Anda harus mengaktifkan Merge on Write. Setelah diaktifkan, Anda dapat membuat inverted index pada kolom apa pun.

  • Model Duplicate: Anda dapat membuat inverted index pada kolom apa pun.

Sintaks

CREATE TABLE  [IF NOT EXISTS] [db_name.]<table_name>
(
  <column_definition_list>,
  [<index_definition_list>] 
)
table_properties;

Parameter

Parameter pembuatan tabel

Parameter

Wajib

Deskripsi

db_name

Tidak

Nama database target.

table_name

Ya

Nama tabel target.

column_definition_list

Ya

Daftar definisi kolom. Untuk detail lebih lanjut, lihat CREATE-TABLE.

table_properties

Ya

Properti tabel, seperti model data, partisi, dan bucketing. Untuk detail lebih lanjut, lihat Data Model.

index_definition_list

Tidak

Daftar definisi indeks.

Sintaks index_definition_list

Anda dapat mendefinisikan beberapa indeks saat membuat tabel. Format: index_definition[, index_definition][, index_definition]....

index_definition Definisi

INDEX <index_name>(<column_name>) <index_type> [PROPERTIES("<key>" = "<value>")] [COMMENT '<comment>']

parameter definisi indeks

Parameter wajib

Nama parameter

Deskripsi

index_name

Nama indeks.

column_name

Nama kolom yang diindeks.

index_type

Jenis indeks. Selalu tulis USING INVERTED.

Parameter opsional
PROPERTIES

PROPERTIES menentukan apakah kolom akan ditokenisasi. Properti ini berisi satu atau lebih pasangan kunci-nilai dalam format "<key>" = "<value>", dipisahkan koma. Jika Anda tidak yakin bagaimana string teks akan ditokenisasi, gunakan fungsi TOKENIZE untuk memeriksa. Untuk detail lebih lanjut, lihat Fungsi Tokenisasi.

Kunci

Nilai

parser

Menentukan tokenizer. Secara default, tidak ada tokenizer yang diterapkan. Kolom numerik tidak mendukung properti ini.

  • english: Menokenisasi teks bahasa Inggris. Memisahkan berdasarkan spasi dan tanda baca. Performa tinggi.

  • chinese: Menokenisasi teks bahasa Tionghoa. Performa lebih rendah daripada english.

  • unicode: Menokenisasi teks multibahasa, termasuk campuran Tionghoa dan Inggris. Menangani awalan dan akhiran email, alamat IP, string alfanumerik, serta karakter Tionghoa.

parser_mode

Menentukan granularitas tokenisasi.

Semua tokenizer secara default menggunakan mode coarse-grained. Mode coarse-grained lebih memilih token yang lebih panjang. Misalnya, 'Wuhan City Yangtze River Bridge' menjadi 'Wuhan City' dan 'Yangtze River Bridge'.

Ketika parser=chinese, mode fine-grained juga didukung. Mode fine-grained lebih memilih token yang lebih pendek. Misalnya, 'Wuhan City Yangtze River Bridge' menjadi 'Wuhan', 'Wuhan City', 'Mayor', 'Yangtze River', 'Yangtze River Bridge', dan 'Bridge'.

Jika Anda tidak yakin cara kerja tokenisasi, lihat Fungsi Tokenisasi.

support_phrase

Mengaktifkan akselerasi kueri frasa menggunakan MATCH_PHRASE. Nilai default adalah false.

  • Atur parameter ini ke true untuk mengaktifkan fitur tersebut. Namun, indeks memerlukan ruang penyimpanan tambahan.

  • false: Menonaktifkan kueri frasa. Menghemat ruang penyimpanan. Gunakan MATCH_ALL untuk kueri multi-kata kunci.

char_filter

Memproses string sebelum tokenisasi. Hanya char_replace yang didukung.

char_replace mengganti setiap karakter dalam pattern dengan karakter pengganti yang sesuai.

  • char_filter_pattern: Array karakter yang akan diganti.

  • char_filter_replacement: Array karakter pengganti. Default-nya adalah satu spasi jika tidak ditentukan.

ignore_above

Panjang maksimum untuk indeks string non-tokenisasi (ketika parser tidak diatur).

  • String yang lebih panjang dari ignore_above tidak diindeks. Untuk array, batas ini berlaku untuk setiap elemen.

  • Default: 256 byte.

lower_case

Mengonversi token menjadi huruf kecil untuk pencocokan case-insensitive.

  • true: Mengonversi ke huruf kecil.

  • false: Tidak ada konversi.

stopwords

Menentukan daftar stopword yang memengaruhi tokenisasi.

  • Stopword bawaan mencakup kata-kata umum yang tidak bermakna seperti is, the, dan a. Kata-kata ini diabaikan selama ingestion dan kueri.

  • none: Menggunakan daftar stopword kosong.

dict_compression

Mengaktifkan kompresi kamus ZSTD untuk kamus inverted index.

  • true: Mengaktifkan kompresi.

  • false: (Default) Fitur dinonaktifkan.

  • Rekomendasi: Aktifkan untuk data teks atau log skala besar, atau ketika biaya penyimpanan menjadi pertimbangan. Bekerja paling optimal dengan inverted_index_storage_format = "V3". Mengurangi penggunaan penyimpanan sekitar 20% untuk beban kerja teks dan log skala besar.

Catatan

Hanya didukung pada versi 4.1.0 dan seterusnya.

COMMENT

Nama parameter

Deskripsi

comment

Deskripsi indeks.

Contoh pembuatan tabel dan indeks

-- Membuat inverted index bernama idx_comment pada kolom comment
-- USING INVERTED menetapkan jenis indeks menjadi inverted index
-- PROPERTIES("parser" = "english") menggunakan tokenisasi bahasa Inggris. Juga mendukung "chinese" dan "unicode". Menghilangkan "parser" menonaktifkan tokenisasi.
CREATE TABLE hackernews_1m
(
    `id` BIGINT,
    `deleted` TINYINT,
    `type` String,
    `author` String,
    `timestamp` DateTimeV2,
    `comment` String,
    `dead` TINYINT,
    `parent` BIGINT,
    `poll` BIGINT,
    `children` Array<BIGINT>,
    `url` String,
    `score` INT,
    `title` String,
    `parts` Array<INT>,
    `descendants` INT,
    INDEX idx_comment (`comment`) USING INVERTED PROPERTIES("parser" = "english") COMMENT 'inverted index for comment'
)
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10;

Menambahkan indeks ke tabel yang sudah ada

Ini adalah operasi asinkron. Periksa progres dengan SHOW ALTER TABLE COLUMN;.

Sintaks

ALTER TABLE <table_name> ADD INDEX <index_name>(<column_name>) <index_type> [PROPERTIES("<key>" = "<value>")];

Parameter

Sama seperti saat pembuatan tabel.

Contoh

Tambahkan indeks tanpa tokenisasi.

ALTER TABLE user_tb ADD INDEX index_userId(user_id) USING INVERTED ;

Tambahkan indeks yang menggunakan metode tokenisasi english.

ALTER TABLE user_tb ADD INDEX index_city(city) USING INVERTED PROPERTIES("parser" = "english");

Menampilkan indeks

Memeriksa progres perubahan indeks

Perubahan indeks menggunakan ALTER atau DROP bersifat asinkron. Periksa progres dengan pernyataan ini.

SHOW ALTER TABLE COLUMN;

Menampilkan semua indeks untuk suatu tabel

Sintaks

SHOW INDEXES FROM <table_name>;

Contoh

SHOW INDEXES FROM user_tb;

Menghapus indeks

Penghapusan indeks bersifat asinkron. Untuk memeriksa progres, lihat Menampilkan indeks.

Penting

Menghapus indeks dapat mengurangi performa kueri. Lakukan dengan hati-hati.

Sintaks

-- Sintaks 1
DROP INDEX <index_name> ON <table_name>;
-- Sintaks 2
ALTER TABLE <table_name> DROP INDEX <index_name>;

Contoh

DROP INDEX index_userId ON user_tb;
ALTER TABLE user_tb DROP INDEX index_city;

Menggunakan inverted index

Pencarian teks penuh

Sintaks

SELECT * FROM <table_name> WHERE <column_name> <conditional_logic> '<keywords>';

Parameter

Parameter

Wajib

Deskripsi

table_name

Ya

Nama tabel target.

column_name

Ya

Nama kolom target.

conditional_logic

Ya

Logika pencocokan: Kombinasi bebas kata kunci dan operator logika.

Operator logika: AND, OR, NOT.

Kata kunci pencarian teks penuh:

  • MATCH_ALL: Mencocokkan semua kata kunci.

  • MATCH_ANY: Mencocokkan salah satu kata kunci.

  • MATCH_PHRASE: Mencocokkan frasa persis.

keywords

Ya

Kata kunci target.

Pisahkan beberapa kata kunci dengan spasi.

Contoh: keyword1 keyword2 keyword3.

Contoh

-- Temukan semua baris di log_tb di mana logmsg berisi keyword1.
SELECT * FROM log_tb WHERE logmsg MATCH_ANY 'keyword1';

-- Temukan semua baris di log_tb di mana logmsg berisi keyword1 atau keyword2.
SELECT * FROM log_tb WHERE logmsg MATCH_ANY 'keyword1 keyword2';

-- Temukan semua baris di log_tb di mana logmsg berisi keyword1 dan keyword2.
SELECT * FROM log_tb WHERE logmsg MATCH_ALL 'keyword1 keyword2';

-- Temukan semua baris di log_tb di mana logmsg berisi keyword1 dan keyword2 secara berurutan.
SELECT * FROM log_tb WHERE logmsg MATCH_PHRASE 'keyword1 keyword2';

Kueri kesetaraan dan rentang pada kolom numerik dan tanggal

Sintaks kueri identik dengan SQL standar.

Contoh

-- Kueri kesetaraan, rentang, IN, dan NOT IN
SELECT * FROM user_tb WHERE id = 123;
SELECT * FROM user_tb WHERE ts > '2023-01-01 00:00:00';
SELECT * FROM user_tb WHERE op_type IN ('add', 'delete');

Perbandingan performa kueri

Kami menguji performa kueri menggunakan 1 juta baris dari dataset hackernews, membandingkan kueri dengan dan tanpa inverted index.

Pengaturan lingkungan

Langkah 1: Buat tabel target.

  1. Buat database.

    CREATE DATABASE test_inverted_index;
  2. Beralih ke database baru.

    USE test_inverted_index;
  3. Buat tabel target.

    CREATE TABLE hackernews_1m
    (
        `id` BIGINT,
        `deleted` TINYINT,
        `type` String,
        `author` String,
        `timestamp` DateTimeV2,
        `comment` String,
        `dead` TINYINT,
        `parent` BIGINT,
        `poll` BIGINT,
        `children` Array<BIGINT>,
        `url` String,
        `score` INT,
        `title` String,
        `parts` Array<INT>,
        `descendants` INT,
        INDEX idx_comment (`comment`) USING INVERTED PROPERTIES("parser" = "english") COMMENT 'inverted index for comment'
    )
    DUPLICATE KEY(`id`)
    DISTRIBUTED BY HASH(`id`) BUCKETS 10;
    -- Membuat inverted index bernama idx_comment pada kolom comment
    -- USING INVERTED menetapkan jenis indeks menjadi inverted index
    -- PROPERTIES("parser" = "english") menggunakan tokenisasi bahasa Inggris. Juga mendukung "chinese" dan "unicode". Menghilangkan "parser" menonaktifkan tokenisasi

Langkah 2: Impor data

Impor data ke tabel target.

  1. Unduh file data.

    wget https://qa-build.oss-cn-beijing.aliyuncs.com/regression/index/hacknernews_1m.csv.gz
  2. Impor data menggunakan Stream Load.

    Pada halaman detail instans ApsaraDB for SelectDB, Anda dapat melihat alamat koneksi (host) dan nomor port (port) instans ApsaraDB for SelectDB. Untuk informasi lebih lanjut tentang Stream Load, lihat Stream Load.

    curl --location-trusted -u root: -H "compress_type:gz" -T hacknernews_1m.csv.gz  http://<host>:<port>/api/test_inverted_index/hackernews_1m/_stream_load
    {
        "TxnId": 2,
        "Label": "a8a3e802-2329-49e8-912b-04c800a461a6",
        "TwoPhaseCommit": "false",
        "Status": "Success",
        "Message": "OK",
        "NumberTotalRows": 1000000,
        "NumberLoadedRows": 1000000,
        "NumberFilteredRows": 0,
        "NumberUnselectedRows": 0,
        "LoadBytes": 130618406,
        "LoadTimeMs": 8988,
        "BeginTxnTimeMs": 23,
        "StreamLoadPutTimeMs": 113,
        "ReadDataTimeMs": 4788,
        "WriteDataTimeMs": 8811,
        "CommitAndPublishTimeMs": 38
    }
  3. Jalankan count() untuk memastikan impor berhasil.

    SELECT count() FROM hackernews_1m;
    +---------+
    | count() |
    +---------+
    | 1000000 |
    +---------+
    1 row in set (0.02 sec)

Perbandingan performa

Catatan
  • Hasil berbeda antara inverted index bertokenisasi dan tanpa inverted index. Tokenisasi menormalisasi token—misalnya, mengonversi ke huruf kecil—sehingga hasil kueri inverted index mungkin sedikit lebih tinggi.

  • Beberapa contoh menunjukkan perbedaan performa kecil karena dataset kecil. Dataset yang lebih besar menunjukkan perbedaan lebih besar.

Pencarian teks penuh
  • Hitung baris di mana kolom comment berisi OLAP.

    • Menghitung jumlah baris di kolom `comment` yang berisi OLAP menggunakan operator `LIKE` membutuhkan waktu 0,18 detik.

      SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLAP%';
      +---------+
      | count() |
      +---------+
      |      34 |
      +---------+
      1 row in set (0.18 sec)
    • Pencarian teks penuh berbasis inverted index menggunakan MATCH_ANY untuk menghitung jumlah baris yang berisi OLAP di kolom comment membutuhkan waktu 0,02 detik, yaitu 9 kali lebih cepat daripada penghitungan berbasis LIKE.

      SELECT count() FROM hackernews_1m WHERE comment MATCH_ANY 'OLAP';
      +---------+
      | count() |
      +---------+
      |      35 |
      +---------+
      1 row in set (0.02 sec)
  • Hitung baris di mana kolom comment berisi OLTP.

    • Menggunakan LIKE untuk menghitung baris di kolom comment yang berisi OLTP membutuhkan waktu 0,07 detik.

      SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLTP%';
      +---------+
      | count() |
      +---------+
      |      48 |
      +---------+
      1 row in set (0.07 sec)
    • Pencarian teks penuh berbasis inverted index menggunakan MATCH_ANY menghitung jumlah baris di kolom comment yang berisi OLTP, membutuhkan waktu 0,01 detik. Ini 7 kali lebih cepat daripada penghitungan berbasis LIKE.

      SELECT count() FROM hackernews_1m WHERE comment MATCH_ANY 'OLTP';
      +---------+
      | count() |
      +---------+
      |      51 |
      +---------+
      1 row in set (0.01 sec)
  • Hitung baris di mana kolom comment berisi OLAP dan OLTP.

    • Menggunakan LIKE: 0,13 detik.

      SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLAP%' AND comment LIKE '%OLTP%';
      +---------+
      | count() |
      +---------+
      |      14 |
      +---------+
      1 row in set (0.13 sec)
    • Pencarian teks penuh berbasis inverted index menggunakan MATCH_ALL membutuhkan waktu 0,01 detik. Metode ini 12 kali lebih cepat daripada statistik berbasis LIKE.

       SELECT count() FROM hackernews_1m WHERE comment MATCH_ALL 'OLAP OLTP';
      +---------+
      | count() |
      +---------+
      |      15 |
      +---------+
      1 row in set (0.01 sec)
  • Hitung baris di mana kolom comment berisi OLAP atau OLTP.

    • Menggunakan LIKE: 0,12 detik.

      SELECT count() FROM hackernews_1m WHERE comment LIKE '%OLAP%' OR comment LIKE '%OLTP%';
      +---------+
      | count() |
      +---------+
      |      68 |
      +---------+
      1 row in set (0.12 sec)
    • Indeks teks penuh melakukan penghitungan statistik dalam 0,01 detik, yaitu 12 kali lebih cepat daripada kueri LIKE.

      SELECT count() FROM hackernews_1m WHERE comment MATCH_ANY 'OLAP OLTP';
      +---------+
      | count() |
      +---------+
      |      71 |
      +---------+
      1 row in set (0.01 sec)

Kueri kesetaraan dan rentang

  • Performa kueri rentang pada kolom DateTime.

    1. Sebelum membuat inverted index, hitung baris di mana timestamp > 2007-08-23 04:17:00. Waktu: 0,03 detik.

       SELECT count() FROM hackernews_1m WHERE timestamp > '2007-08-23 04:17:00';
      +---------+
      | count() |
      +---------+
      |  999081 |
      +---------+
      1 row in set (0.03 sec)
    2. Buat inverted index pada kolom timestamp.

      CREATE INDEX idx_timestamp ON hackernews_1m(timestamp) USING INVERTED;
      Query OK, 0 rows affected (0.03 sec)
    3. Periksa progres pembuatan indeks. Selisih antara FinishTime dan CreateTime menunjukkan bahwa pembuatan indeks pada 1 juta baris hanya membutuhkan waktu 1 detik.

      SHOW ALTER TABLE COLUMN;
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      | JobId | TableName     | CreateTime              | FinishTime              | IndexName     | IndexId | OriginIndexId | SchemaVersion | TransactionId | State    | Msg  | Progress | Timeout |
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      | 10030 | hackernews_1m | 2023-02-10 19:44:12.929 | 2023-02-10 19:44:13.938 | hackernews_1m | 10031   | 10008         | 1:1994690496  | 3             | FINISHED |      | NULL     | 2592000 |
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      1 row in set (0.00 sec)
    4. Setelah indeks dibuat, menggunakan pernyataan kueri yang sama untuk menghitung baris di mana kolom timestamp lebih besar dari 2007-08-23 04:17:00 membutuhkan waktu 0,01 detik. Kueri ini 2 kali lebih cepat daripada sebelum inverted index dibuat.

      SELECT count() FROM hackernews_1m WHERE timestamp > '2007-08-23 04:17:00';
      +---------+
      | count() |
      +---------+
      |  999081 |
      +---------+
      1 row in set (0.01 sec)
  • Performa kueri kesetaraan pada kolom numerik.

    1. Sebelum membuat inverted index, hitung baris di mana parent = 11189.

      SELECT count() FROM hackernews_1m WHERE parent = 11189;
      +---------+
      | count() |
      +---------+
      |       2 |
      +---------+
      1 row in set (0.01 sec)
    2. Buat inverted index pada kolom parent tanpa tokenisasi.

      -- Untuk tipe numerik, USING INVERTED tidak memerlukan tokenizer
      -- ALTER TABLE t ADD INDEX adalah sintaks kedua untuk menambahkan indeks
      ALTER TABLE hackernews_1m ADD INDEX idx_parent(parent) USING INVERTED;
      Query OK, 0 rows affected (0.01 sec)
    3. Periksa progres pembuatan indeks.

      SHOW ALTER TABLE COLUMN;
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      | JobId | TableName     | CreateTime              | FinishTime              | IndexName     | IndexId | OriginIndexId | SchemaVersion | TransactionId | State    | Msg  | Progress | Timeout |
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      | 10030 | hackernews_1m | 2023-02-10 19:44:12.929 | 2023-02-10 19:44:13.938 | hackernews_1m | 10031   | 10008         | 1:1994690496  | 3             | FINISHED |      | NULL     | 2592000 |
      | 10053 | hackernews_1m | 2023-02-10 19:49:32.893 | 2023-02-10 19:49:33.982 | hackernews_1m | 10054   | 10008         | 1:378856428   | 4             | FINISHED |      | NULL     | 2592000 |
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
    4. Setelah indeks dibuat, gunakan pernyataan kueri yang sama untuk menghitung baris di mana kolom numerik parent sama dengan 11189.

      SELECT count() FROM hackernews_1m WHERE parent = 11189;
      +---------+
      | count() |
      +---------+
      |       2 |
      +---------+
      1 row in set (0.01 sec)
  • Performa kueri kesetaraan pada kolom string.

    1. Sebelum membuat inverted index, hitung baris di mana author = 'faster'. Waktu: 0,03 detik.

      SELECT count() FROM hackernews_1m WHERE author = 'faster';
      +---------+
      | count() |
      +---------+
      |      20 |
      +---------+
      1 row in set (0.03 sec)
    2. Buat inverted index pada kolom author tanpa tokenisasi.

      -- Hanya menggunakan USING INVERTED. Memperlakukan seluruh string sebagai satu token.
      ALTER TABLE hackernews_1m ADD INDEX idx_author(author) USING INVERTED;
      Query OK, 0 rows affected (0.01 sec)
    3. Periksa progres pembuatan indeks.

      -- Membangun indeks pada 1 juta nilai author hanya membutuhkan waktu 1,5 detik.
      SHOW ALTER TABLE COLUMN;
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      | JobId | TableName     | CreateTime              | FinishTime              | IndexName     | IndexId | OriginIndexId | SchemaVersion | TransactionId | State    | Msg  | Progress | Timeout |
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      | 10030 | hackernews_1m | 2023-02-10 19:44:12.929 | 2023-02-10 19:44:13.938 | hackernews_1m | 10031   | 10008         | 1:1994690496  | 3             | FINISHED |      | NULL     | 2592000 |
      | 10053 | hackernews_1m | 2023-02-10 19:49:32.893 | 2023-02-10 19:49:33.982 | hackernews_1m | 10054   | 10008         | 1:378856428   | 4             | FINISHED |      | NULL     | 2592000 |
      | 10076 | hackernews_1m | 2023-02-10 19:54:20.046 | 2023-02-10 19:54:21.521 | hackernews_1m | 10077   | 10008         | 1:1335127701  | 5             | FINISHED |      | NULL     | 2592000 |
      +-------+---------------+-------------------------+-------------------------+---------------+---------+---------------+---------------+---------------+----------+------+----------+---------+
      
    4. Setelah Indeks terbalik dibuat, gunakan Pernyataan kueri yang sama untuk menghitung baris di mana kolom string author bernilai faster. Operasi ini memerlukan waktu 0,01 detik, atau 2 detik lebih cepat dibandingkan kueri yang sama sebelum Indeks terbalik dibuat.

      -- Pencocokan kesetaraan string mengalami percepatan signifikan setelah pembuatan indeks.
      SELECT count() FROM hackernews_1m WHERE author = 'faster';
      +---------+
      | count() |
      +---------+
      |      20 |
      +---------+
      1 row in set (0.01 sec)

Fungsi Tokenisasi

Fungsi tokenisasi memisahkan teks kontinu menjadi token atau frasa individual. Fungsi ini merupakan inti dari pembuatan dan penggunaan inverted index. Kualitas dan metode tokenisasi secara langsung memengaruhi kualitas dan performa indeks.

Jika Anda tidak yakin bagaimana string teks akan ditokenisasi, gunakan fungsi TOKENIZE untuk memeriksa. TOKENIZE menerima dua parameter utama: parser dan parser_mode. Deskripsinya sebagai berikut.

Parameter

Deskripsi

parser

Menentukan tokenizer. Secara default, tidak ada tokenizer yang diterapkan.

  • english: Menokenisasi teks bahasa Inggris. Memisahkan berdasarkan spasi dan tanda baca. Performa tinggi.

  • chinese: Menokenisasi teks bahasa Tionghoa. Performa lebih rendah daripada english.

  • unicode: Menokenisasi teks multibahasa, termasuk campuran Tionghoa dan Inggris. Menangani awalan dan akhiran email, alamat IP, string alfanumerik, serta karakter Tionghoa.

parser_mode

Menentukan pola tokenisasi karena granularitas tokenisasi bergantung pada pola tersebut.

Semua tokenizer secara default menggunakan mode coarse-grained. Mode coarse-grained lebih memilih token yang lebih panjang. Misalnya, 'Wuhan City Yangtze River Bridge' menjadi 'Wuhan City' dan 'Yangtze River Bridge'.

Ketika parser=chinese, mode fine-grained juga didukung. Mode fine-grained lebih memilih token yang lebih pendek. Misalnya, 'Wuhan City Yangtze River Bridge' menjadi 'Wuhan', 'Wuhan City', 'Mayor', 'Yangtze River', 'Yangtze River Bridge', dan 'Bridge'.

Contoh berikut.

-- Hasil tokenisasi bahasa Inggris.
SELECT TOKENIZE('I love CHINA','"parser"="english"');
+------------------------------------------------+
| tokenize('I love CHINA', '"parser"="english"') |
+------------------------------------------------+
| ["i", "love", "china"]                         |
+------------------------------------------------+
1 row in set (0.02 sec)

-- Hasil tokenisasi fine-grained dari tokenizer bahasa Tionghoa.
SELECT TOKENIZE('武汉长江大桥','"parser"="chinese","parser_mode"="fine_grained"');
+-----------------------------------------------------------------------------------+
| tokenize('武汉长江大桥', '"parser"="chinese","parser_mode"="fine_grained"')       |
+-----------------------------------------------------------------------------------+
| ["武汉", "武汉长江大桥", "长江", "长江大桥", "大桥"]                              |
+-----------------------------------------------------------------------------------+
1 row in set (0.02 sec)

-- Hasil tokenisasi coarse-grained dari tokenizer bahasa Tionghoa.
SELECT TOKENIZE('武汉市长江大桥','"parser"="chinese","parser_mode"="coarse_grained"');
+----------------------------------------------------------------------------------------+
| tokenize('武汉市长江大桥', '"parser"="chinese","parser_mode"="coarse_grained"')        |
+----------------------------------------------------------------------------------------+
| ["武汉市", "长江大桥"]                                                                 |
+----------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

-- Hasil tokenisasi campuran multibahasa.
SELECT TOKENIZE('I love CHINA 我爱我的祖国','"parser"="unicode"');
+-------------------------------------------------------------------+
| tokenize('I love CHINA 我爱我的祖国', '"parser"="unicode"')       |
+-------------------------------------------------------------------+
| ["i", "love", "china", "我", "爱", "我", "的", "祖", "国"]        |
+-------------------------------------------------------------------+
1 row in set (0.02 sec)