Hologres mendukung indeks terbalik pencarian teks penuh mulai dari versi 4.0. Fitur ini memanfaatkan mesin pencarian teks penuh berkinerja tinggi Tantivy untuk memberikan kemampuan pencarian yang cepat dan akurat, termasuk dukungan algoritma perhitungan skor kesamaan BM25. Anda dapat menggunakannya untuk peringkat dokumen, pencarian kata kunci, pencarian frasa, dan lainnya.
Cara Kerja
Setelah Anda menulis data teks ke Hologres, sistem membuat file indeks terbalik pencarian teks penuh untuk setiap file data berdasarkan konfigurasi indeks yang ditentukan. Pertama, tokenizer membagi teks menjadi token. Kemudian, indeks mencatat pemetaan antara setiap token dan teks sumbernya, lengkap dengan informasi posisi dan frekuensi kata kunci.
Saat menjalankan pencarian, Hologres terlebih dahulu melakukan tokenisasi pada teks kueri untuk mendapatkan kumpulan token kueri. Selanjutnya, sistem menggunakan algoritma BM25 untuk menghitung skor relevansi setiap dokumen sumber terhadap kumpulan token tersebut, sehingga memungkinkan pencarian teks penuh yang cepat dan tepat.
Catatan Penting
-
Indeks terbalik pencarian teks penuh hanya dapat digunakan pada tabel berorientasi kolom dan tabel hibrida baris-kolom di Hologres versi 4.0 atau lebih baru. Tabel berorientasi baris tidak didukung.
-
Indeks terbalik pencarian teks penuh hanya dapat dibuat pada kolom bertipe TEXT, CHAR, atau VARCHAR.
-
Hanya satu indeks terbalik pencarian teks penuh yang dapat dibuat pada satu kolom dalam satu waktu. Untuk mengindeks beberapa kolom, buat indeks terpisah untuk masing-masing kolom.
-
Setelah pembuatan indeks terbalik pencarian teks penuh, Hologres membangun file indeks secara asinkron selama proses compaction, baik untuk data yang sudah ada maupun data baru yang dimasukkan secara batch. Skor relevansi BM25 untuk data tersebut bernilai nol hingga file indeks selesai dibangun.
-
Untuk penulisan data real-time setelah pembuatan indeks: sebelum Hologres versi 4.0.8, indeks dibangun secara sinkron saat data tiba. Mulai versi 4.0.8, demi menyeimbangkan kinerja penulisan real-time dan efisiensi pengindeksan, Hologres merefresh indeks real-time di memori setiap detik. Anda hanya dapat melakukan kueri data setelah setiap refresh.
-
Pencarian teks penuh hanya berfungsi pada kolom yang memiliki indeks teks penuh dan tidak mendukung komputasi brute-force pada kolom yang tidak diindeks.
-
Kami menyarankan menggunakan resource Serverless Computing untuk impor data batch. Resource Serverless melakukan compaction dan membangun indeks teks penuh secara sinkron selama impor. Untuk detailnya, lihat Jalankan Tugas Baca/Tulis dengan Serverless Computing dan Jalankan Tugas Compaction dengan Serverless Computing. Jika tidak menggunakan resource Serverless, picu compaction secara manual setelah mengimpor data batch atau mengubah indeks dengan menjalankan perintah berikut: Compaction.
VACUUM <schema_name>.<table_name>; -
Skor relevansi BM25 dihitung per file. Jika volume data kecil, picu compaction secara manual untuk menggabungkan file dan meningkatkan akurasi pencarian.
-
Anda dapat menjalankan kueri pencarian teks penuh menggunakan resource Serverless Computing.
-
Pilih tokenizer sesuai kasus penggunaan Anda, seperti yang ditunjukkan pada tabel berikut:
Skenario
Tokenizer
Catatan
Ekstraksi kata kunci dari artikel panjang
Jieba
Mendukung penemuan kata baru dan pergantian pola kompleks.
Pencarian teks deskriptif Bahasa Tionghoa
IK
Mengidentifikasi istilah Bahasa Tionghoa secara akurat.
Pencarian teks judul Bahasa Inggris
Simple, Whitespace, Standard
Sederhana dan efisien. Pilih berdasarkan teks Bahasa Inggris Anda.
Pencarian teks log fuzzy
Ngram
Tidak memerlukan kamus. Memenuhi kebutuhan kueri fuzzy.
Pencarian pinyin untuk produk atau nama Tionghoa
Pinyin
Mendukung pinyin lengkap, huruf awal, dan inferensi karakter homofon.
Kelola Indeks
Buat Indeks
Sintaksis
CREATE INDEX [ IF NOT EXISTS ] idx_name ON table_name
USING FULLTEXT (column_name [ , ... ])
[ WITH ( storage_parameter [ = value ] [ , ... ] ) ];
Deskripsi Parameter
|
Parameter |
Deskripsi |
|
idx_name |
Nama indeks. |
|
table_name |
Nama tabel target. |
|
column_name |
Kolom target untuk indeks terbalik pencarian teks penuh. |
|
storage_parameter |
Konfigurasikan parameter indeks terbalik pencarian teks penuh. Parameter yang didukung meliputi:
Catatan
Anda hanya dapat menentukan satu tokenizer dan satu pengaturan analyzer_params per indeks. |
Detail Konfigurasi index_options
index_options mendukung tiga tingkat. Tingkat yang lebih tinggi mencakup semua informasi dari tingkat yang lebih rendah: freqs mencakup docs, dan positions mencakup freqs dan docs.
|
Nilai |
Konten Indeks |
Dampak Fitur dan Batasan |
Kasus Penggunaan Khas |
|
positions (default) |
ID Dokumen + Frekuensi Kata Kunci + Posisi Kata Kunci |
Dukungan fitur lengkap: Mendukung kueri frasa dan perhitungan skor relevansi standar. |
Pencarian teks penuh umum |
|
freqs |
ID Dokumen + Frekuensi Kata Kunci |
Kueri frasa gagal karena informasi posisi tidak tersedia. |
Perhitungan skor dan pengurutan berdasarkan frekuensi kata kunci, tetapi tidak memerlukan pencocokan frasa eksak |
|
docs |
Hanya ID Dokumen |
|
Hanya pemeriksaan keberadaan (filtering melalui indeks teks penuh). Sensitif terhadap penyimpanan dan tidak memerlukan pengurutan relevansi |
Untuk indeks yang menggunakan tokenizer keyword, tingkat pencatatan tetap di docs dan tidak dapat diubah melalui index_options.
Contoh
-
Buat indeks terbalik pencarian teks penuh menggunakan tokenizer default (jieba) dan konfigurasi default.
CREATE INDEX idx1 ON tbl USING FULLTEXT (col1); -
Gunakan tokenizer ik secara eksplisit dengan konfigurasi default-nya.
CREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (tokenizer = 'ik'); -
Gunakan konfigurasi tokenizer jieba kustom: mode exact dan hanya filter lowercase.
CREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (tokenizer = 'jieba', analyzer_params = '{"tokenizer":{"type":"jieba","mode":"exact"}, "filter":["lowercase"]}'); -
Atur index_options ke freqs saat membuat indeks (menghemat ruang tetapi menonaktifkan kueri frasa). Tersedia mulai Hologres versi 4.1.9.
CREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (index_options = 'freqs');
-
Setelah membuat indeks terbalik pencarian teks penuh, file indeks dibangun selama compaction setelah impor data.
-
Kami menyarankan menggunakan resource Serverless Computing untuk impor data batch. Resource Serverless melakukan compaction dan membangun indeks teks penuh secara sinkron selama impor. Lihat Jalankan Tugas Baca/Tulis dengan Serverless Computing dan Jalankan Tugas Compaction dengan Serverless Computing.
-
Jika tidak menggunakan resource Serverless, picu compaction secara manual setelah mengimpor data batch atau mengubah indeks. Lihat Compaction (Beta).
VACUUM <schema_name>.<table_name>;
Ubah Indeks
Sintaksis
-- Ubah konfigurasi indeks
ALTER INDEX [ IF EXISTS ] <idx_name> SET ( <storage_parameter> = '<storage_value>' [ , ... ] );
-- Kembalikan ke konfigurasi default
ALTER INDEX [ IF EXISTS ] <idx_name> RESET ( <storage_parameter> [ , ... ] );
Deskripsi Parameter
Untuk detail parameter lengkap, lihat Deskripsi Parameter.
Contoh
Setelah mengubah indeks terbalik pencarian teks penuh, file indeks dibangun secara asinkron selama compaction. Jalankan VACUUM <schema_name>.<table_name>; untuk memicu compaction segera. Untuk detailnya, lihat Compaction.
-
Ubah tokenizer ke standard.
ALTER INDEX idx1 SET (tokenizer = 'standard'); -
Ubah tokenizer ke ik dalam mode ik_max_word, nonaktifkan konversi lowercase, dan tidak menerapkan filter.
ALTER INDEX idx1 SET ( tokenizer = 'ik', analyzer_params = '{"tokenizer":{"type":"ik","mode":"ik_max_word","enable_lowercase": false}}' ); -
Kembalikan tokenizer jieba default dan analyzer_params default-nya.
ALTER INDEX idx1 RESET (tokenizer); ALTER INDEX idx1 RESET (tokenizer, analyzer_params); -
Kembalikan analyzer_params default untuk tokenizer saat ini.
ALTER INDEX idx1 RESET (analyzer_params); -
Ubah index_options ke docs.
ALTER INDEX idx1 SET (index_options = 'docs'); -
Kembalikan index_options ke nilai default (positions).
ALTER INDEX idx1 RESET (index_options);
Hapus Indeks
Sintaksis
DROP INDEX [ IF EXISTS ] <idx_name> [ RESTRICT ];
Deskripsi Parameter
Untuk detail parameter lengkap, lihat Deskripsi Parameter.
Lihat Indeks
Hologres menyediakan tabel sistem hologres.hg_index_properties untuk mencantumkan indeks terbalik pencarian teks penuh dan lokasinya.
SELECT * FROM hologres.hg_index_properties;
Jalankan SQL ini untuk melihat tabel dan kolom yang terkait dengan suatu indeks.
SELECT
t.relname AS table_name,
a.attname AS column_name
FROM pg_class t
JOIN pg_index i ON t.oid = i.indrelid
JOIN pg_class idx ON i.indexrelid = idx.oid
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
WHERE t.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = '<namespace>')
AND idx.relname = '<indexname>'
LIMIT 1;
Deskripsi parameter:
-
namespace: Nilai field
table_namespacedalam outputSELECT * FROM hologres.hg_index_properties;. -
indexname: Nama indeks aktual yang Anda buat.
Gunakan Indeks Terbalik Pencarian Teks Penuh untuk Pencarian
Hologres mendukung beberapa mode pencarian. Pilih mode yang paling sesuai dengan logika bisnis Anda.
|
Mode Pencarian |
Deskripsi |
|
Keyword Match |
Mencocokkan kata kunci dari kueri yang telah ditokenisasi. Mendukung hubungan AND/OR antar kata kunci. |
|
Phrase Search |
Mencocokkan frasa eksak. Mengharuskan token berada dalam jarak tertentu. |
|
Natural Language Search |
Mendukung kueri fleksibel dan kompleks. Definisikan hubungan AND/OR, istilah wajib/dikecualikan, dan frasa. |
|
Term Search |
Menjalankan pencocokan eksak. String kueri harus ada persis di indeks. |
Fungsi TEXT_SEARCH
Fungsi TEXT_SEARCH menghitung skor relevansi BM25 untuk kueri terhadap teks sumber.
Sintaksis Fungsi
TEXT_SEARCH (
<search_data> TEXT/VARCHAR/CHAR
,<search_expression> TEXT
[ ,<mode> TEXT DEFAULT 'match'
,<operator> TEXT DEFAULT 'OR'
,<tokenizer> TEXT DEFAULT ''
,<analyzer_params> TEXT DEFAULT ''
,<options> TEXT DEFAULT '']
)
Deskripsi Parameter
|
Parameter |
Wajib |
Deskripsi |
|
search_data |
Ya |
Teks sumber untuk dicari. Mendukung tipe TEXT, VARCHAR, dan CHAR. Harus merupakan kolom dengan indeks teks penuh. Jika tidak, kueri akan gagal. |
|
search_expression |
Ya |
Teks kueri. Mendukung tipe TEXT, VARCHAR, dan CHAR. Harus berupa konstanta. |
|
mode |
Tidak |
Mode pencarian. Nilai yang didukung:
|
|
operator |
Tidak |
Operator logika antar kata kunci. Hanya berlaku ketika mode adalah match. Nilai yang didukung:
|
|
tokenizer, analyzer_params |
Tidak |
Tokenizer dan konfigurasi yang digunakan untuk search_expression. Biasanya tidak diperlukan.
|
|
options |
Tidak |
Parameter pencarian tambahan. Format: Saat ini hanya mendukung parameter slop, yang hanya berlaku ketika mode adalah phrase. Nilai valid adalah 0 (default) atau bilangan bulat positif. Mendefinisikan jarak maksimum yang diizinkan antar kata dalam frasa. Catatan
slop mendefinisikan celah maksimum (atau biaya transformasi) antar istilah frasa. Untuk tokenizer seperti jieba, keyword, dan icu, satuannya adalah karakter. Untuk tokenizer seperti standard, simple, dan whitespace, satuannya adalah token. |
Nilai Kembalian
Mengembalikan nilai FLOAT non-negatif yang merepresentasikan skor relevansi BM25. Skor yang lebih tinggi menunjukkan relevansi yang lebih tinggi. Skor 0 berarti tidak relevan.
Contoh
-
Gunakan mode pencocokan kata kunci dengan operator AND.
-- Disarankan: Tentukan nama parameter SELECT TEXT_SEARCH (content, 'machine learning', operator => 'AND') FROM tbl; -- Tanpa nama parameter: Tentukan sesuai urutan SELECT TEXT_SEARCH (content, 'machine learning', 'match', 'AND') FROM tbl; -
Gunakan mode pencarian frasa dengan slop=2.
SELECT TEXT_SEARCH (content, 'machine learning', 'phrase', options => 'slop=2;') FROM tbl; -
Gunakan mode pencarian bahasa alami.
-- Gunakan operator AND/OR untuk mendefinisikan logika SELECT TEXT_SEARCH (content, 'machine AND (system OR recognition)', 'natural_language') FROM tbl; -- Gunakan + (wajib) dan - (dikecualikan) untuk mendefinisikan logika SELECT TEXT_SEARCH (content, '+learning -machine system', 'natural_language') FROM tbl; -
Gunakan mode pencarian istilah.
SELECT TEXT_SEARCH (content, 'machine learning', 'term') FROM tbl;
Fungsi TOKENIZE
Fungsi TOKENIZE mengembalikan output yang telah ditokenisasi menggunakan konfigurasi tokenizer Anda. Gunakan fungsi ini untuk menguji dan men-debug perilaku tokenisasi.
Sintaksis Fungsi
TOKENIZE (
<search_data> TEXT
[ ,<tokenizer> TEXT DEFAULT ''
,<analyzer_params> TEXT DEFAULT '']
)
Deskripsi Parameter
-
search_data: Wajib. Teks yang akan ditokenisasi. Mendukung konstanta.
-
tokenizer, analyzer_params: Opsional. Tokenizer dan konfigurasi yang digunakan untuk search_data. Default ke jieba.
Nilai Kembalian
Mengembalikan array TEXT yang berisi token yang telah ditokenisasi.
Verifikasi Penggunaan Indeks
Periksa rencana eksekusi untuk memastikan apakah SQL menggunakan indeks terbalik pencarian teks penuh. Jika menampilkan Fulltext Filter, berarti indeks digunakan. Untuk detail rencana eksekusi, lihat EXPLAIN dan EXPLAIN ANALYZE.
Contoh SQL:
EXPLAIN ANALYZE SELECT * FROM wiki_articles WHERE text_search(content, 'Yangtze River') > 0;
Rencana eksekusi muncul di bawah ini. Kehadiran Fulltext Filter mengonfirmasi penggunaan indeks berhasil.
QUERY PLAN
Gather (cost=0.00..1.00 rows=1 width=12)
-> Local Gather (cost=0.00..1.00 rows=1 width=12)
-> Index Scan using Clustering_index on wiki_articles (cost=0.00..1.00 rows=1 width=12)
Fulltext Filter: (text_search(content, search_expression => 'Yangtze River'::text, mode => match, operator => OR, tokenizer => jieba, analyzer_params => {"filter":["removepunct","lowercase",{"stop_words":["_english_"],"type":"stop"},{"language":"english","type":"stemmer"}],"tokenizer":{"hmm":true,"mode":"search","type":"jieba"}}, options => ) > '0'::double precision)
Query Queue: init_warehouse.default_queue
Optimizer: HQO version 4.0.0
Contoh
Persiapan Data
Jalankan SQL berikut untuk membuat tabel uji dan memasukkan data sampel.
-- Buat tabel
CREATE TABLE wiki_articles (id int, content text);
-- Buat indeks
CREATE INDEX ft_idx_1 ON wiki_articles
USING FULLTEXT (content)
WITH (tokenizer = 'jieba');
-- Masukkan data
INSERT INTO wiki_articles VALUES
(1, 'The Yangtze River is China''s longest river and the world''s third-longest river, about 6,300 km long.'),
(2, 'Li was born in 1962 in Wendeng County, Shandong.'),
(3, 'He graduated from the department of physics at Shandong University.'),
(4, 'The Spring Festival, also known as the Lunar New Year, is China''s most important traditional festival.'),
(5, 'The Spring Festival usually falls between late January and mid-February on the Gregorian calendar. Major customs include pasting spring couplets, setting off firecrackers, eating reunion dinner, and giving New Year greetings.'),
(6, 'In 2006, the Spring Festival was approved by the State Council as part of China''s first batch of national intangible cultural heritage.'),
(7, 'Shandong has dozens of universities.'),
(8, 'ShanDa is a famous university in Shandong.');
-- Jalankan compaction
VACUUM wiki_articles;
-- Kueri data tabel
SELECT * FROM wiki_articles limit 1;
Output contoh:
id | content
---+---------------------------------------------------
1 | The Yangtze River is China''s longest river and the world''s third-longest river, about 6,300 km long.
Contoh Pencarian Berbeda
-
Pencocokan kata kunci.
-- (K1) Pencocokan kata kunci (operator default=OR): Mencocokkan dokumen yang berisi ''shandong'' atau ''university''. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 2 | Li was born in 1962 in Wendeng County, Shandong. 3 | He graduated from the department of physics at Shandong University. 7 | Shandong has dozens of universities. 8 | ShanDa is a famous university in Shandong. -- (K2) Pencocokan kata kunci (operator=AND): Hanya mencocokkan dokumen yang berisi ''shandong'' dan ''university''. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', operator => 'AND') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 3 | He graduated from the department of physics at Shandong University. 7 | Shandong has dozens of universities. 8 | ShanDa is a famous university in Shandong. -
Pencarian frasa.
-- (P1) Pencarian frasa (slop default = 0): Hanya mencocokkan ketika ''shandong'' diikuti langsung oleh ''university''. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 3 | He graduated from the department of physics at Shandong University. (1 row) -- (P2) Pencarian frasa dengan slop = 14: Mencocokkan ketika ''shandong'' dan ''university'' berjarak hingga 14 karakter. Mencocokkan ''Shandong has dozens of universities.''. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase', options => 'slop=14;') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 3 | He graduated from the department of physics at Shandong University. 7 | Shandong has dozens of universities. (2 rows) -- (P3) Pencarian frasa mendukung frasa yang tidak berurutan, tetapi perhitungan slop berbeda. Jadi ''university of Shandong'' cocok dengan slop=23, tetapi tidak dengan slop=22. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase', options => 'slop=23;') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 3 | He graduated from the department of physics at Shandong University. 7 | Shandong has dozens of universities. 8 | ShanDa is a famous university in Shandong. (3 rows) -- (P4) Perilaku dengan tokenizer standard. (ALTER INDEX ft_idx_1 SET (tokenizer = 'standard');) -- Untuk tokenizer standard, slop diukur dalam token, bukan karakter. Nol token antar kata dihitung sebagai pencocokan frasa, terlepas dari spasi. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', mode => 'phrase') > 0; -- Hasil id | content ----+------------------------ 1 | shandong university 2 | shandong university 3 | shandong university 4 | shandong university (4 rows) -- (P5) Tanda baca diabaikan. (Menggunakan tokenizer jieba.) -- Meskipun teks menggunakan koma antara ''river'' dan ''length'', dan kueri menggunakan titik, tetap cocok. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'river. length', mode => 'phrase') > 0; -- Hasil id | content ----+----------------------------------------------------- 1 | The Yangtze River is China''s longest river and the world''s third-longest river, about 6,300 km long. (1 row) -
Kueri bahasa alami.
-- (N1) Kueri bahasa alami: Tidak ada operator default ke pencocokan kata kunci. Setara dengan (K1). SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', 'natural_language') > 0; id | content ----+--------------------------------------------------------------------- 7 | Shandong has dozens of universities. 2 | Li was born in 1962 in Wendeng County, Shandong. 3 | He graduated from the department of physics at Shandong University. 8 | ShanDa is a famous university in Shandong. -- (N2) Kueri bahasa alami: Pencocokan kata kunci yang mengharuskan ('shandong' AND 'university') ATAU 'culture'. AND memiliki prioritas lebih tinggi daripada OR. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '(shandong AND university) OR culture', 'natural_language') > 0; -- Setara dengan SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong AND university OR culture', 'natural_language') > 0; -- Setara dengan SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '(+shandong +university) culture', 'natural_language') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 8 | ShanDa is a famous university in Shandong. 7 | Shandong has dozens of universities. 3 | He graduated from the department of physics at Shandong University. 6 | In 2006, the Spring Festival was approved by the State Council as part of China's first batch of national intangible cultural heritage. -- (N3) Kueri bahasa alami: Harus berisi 'shandong', tidak boleh berisi 'university', dan boleh berisi 'culture'. Kata kunci 'culture' tidak memengaruhi baris mana yang cocok, tetapi meningkatkan skor relevansi untuk baris yang cocok. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '+shandong -university culture', 'natural_language') > 0; id | content ----+-------------------------------------------------- 2 | Li was born in 1962 in Wendeng County, Shandong. -- Harus berisi 'shandong', tidak boleh berisi 'physics', dan boleh berisi 'famous'. Baris dengan 'famous' mendapatkan skor relevansi lebih tinggi. -- Catatan: Hasil skor ini untuk satu shard. Skor dapat bervariasi di berbagai shard atau tata letak file. SELECT id, content, TEXT_SEARCH(content, '+shandong -physics famous', 'natural_language') as score FROM wiki_articles WHERE TEXT_SEARCH(content, '+shandong -physics famous', 'natural_language') > 0 ORDER BY score DESC; -- Hasil id | content | score ----+--------------------------------------------------+---------- 8 | ShanDa is a famous university in Shandong. | 2.92376 7 | Shandong has dozens of universities. | 0.863399 2 | Li was born in 1962 in Wendeng County, Shandong. | 0.716338 -- (N4) Kueri bahasa alami: Pencarian frasa, setara dengan (P1). Sertakan frasa dalam tanda kutip ganda. Escape tanda kutip internal dengan \. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '"shandong university"', 'natural_language') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 3 | He graduated from the department of physics at Shandong University. -- (N5) Kueri bahasa alami: Pencarian frasa dengan slop, setara dengan (P2). Gunakan sintaks ~. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '"shandong university"~23', 'natural_language') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 8 | ShanDa is a famous university in Shandong. 7 | Shandong has dozens of universities. 3 | He graduated from the department of physics at Shandong University. -- (N6) Kueri bahasa alami: Cocokkan semua dokumen. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '*', 'natural_language') > 0; -- Hasil id | content ----+---------------------------------------------------------------------------------------------- 1 | The Yangtze River is China's longest river and the world's third-longest river, about 6,300 km long. 2 | Li was born in 1962 in Wendeng County, Shandong. 3 | He graduated from the department of physics at Shandong University. 4 | The Spring Festival, also known as the Lunar New Year, is China's most important traditional festival. 5 | The Spring Festival usually falls between late January and mid-February on the Gregorian calendar. Major customs include pasting spring couplets, setting off firecrackers, eating reunion dinner, and giving New Year greetings. 6 | In 2006, the Spring Festival was approved by the State Council as part of China's first batch of national intangible cultural heritage. 7 | Shandong has dozens of universities. 8 | ShanDa is a famous university in Shandong. -
Kueri istilah.
-- (T1) Kueri istilah: Secara eksplisit berisi ''Spring Festival'', jadi cocok. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'Spring Festival', 'term') > 0; -- Hasil id | content ----+---------------------------------------------------------------------------------------------- 4 | The Spring Festival, also known as the Lunar New Year, is China''s most important traditional festival. 5 | The Spring Festival usually falls between late January and mid-February on the Gregorian calendar. Major customs include pasting spring couplets, setting off firecrackers, eating reunion dinner, and giving New Year greetings. 6 | In 2006, the Spring Festival was approved by the State Council as part of China''s first batch of national intangible cultural heritage. -- (T2) Kueri istilah: Gagal mencocokkan. -- Karena kolom wiki_articles.content menggunakan tokenizer jieba secara default, ''shandong university'' dibagi. -- Kami menyarankan memasangkan kueri istilah dengan tokenizer keyword untuk pencocokan eksak. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', 'term') > 0; -- Hasil id | content ----+---------
Contoh Kueri Kompleks
-
Anda dapat melakukan kueri gabungan dengan PK.
-- Temukan teks yang berisi ''shandong'' atau ''university'', dan dengan id=3. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university') > 0 and id = 3; -- Hasil id | content ----+--------------------------------------------------------------------- 3 | He graduated from the department of physics at Shandong University. -- Temukan teks yang berisi ''shandong'' atau ''university'', atau dengan id<2. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university') > 0 OR id < 2; -- Hasil id | content ----+--------------------------------------------------------------------- 2 | Li was born in 1962 in Wendeng County, Shandong. 8 | ShanDa is a famous university in Shandong. 1 | The Yangtze River is China''s longest river and the world''s third-longest river, about 6,300 km long. 3 | He graduated from the department of physics at Shandong University. 7 | Shandong has dozens of universities. -
Kembalikan skor dan dapatkan 3 teratas.
SELECT id, content, TEXT_SEARCH(content, 'shandong university') AS score, TOKENIZE(content, 'jieba') FROM wiki_articles ORDER BY score DESC LIMIT 3; -- Hasil id | content | score | tokenize ----+---------------------------------------------------------------------+---------+-------------------------------------------------- 8 | ShanDa is a famous university in Shandong. | 2.74634 | {shanda,famous,univers,shandong} 7 | Shandong has dozens of universities. | 2.74634 | {shandong,has,dozen,univers} 3 | He graduated from the department of physics at Shandong University. | 2.38178 | {he,graduat,from,depart,physic,shandong,univers} -
Gunakan TEXT_SEARCH di klausa SELECT dan WHERE.
SELECT id, content, TEXT_SEARCH(content, 'shandong university') AS score, TOKENIZE(content, 'jieba') FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university') > 0 ORDER BY score DESC; -- Hasil id | content | score | tokenize ----+---------------------------------------------------------------------+---------+-------------------------------------------------- 7 | Shandong has dozens of universities. | 2.74634 | {shandong,has,dozen,univers} 8 | ShanDa is a famous university in Shandong. | 2.74634 | {shanda,famous,univers,shandong} 3 | He graduated from the department of physics at Shandong University. | 2.38178 | {he,graduat,from,depart,physic,shandong,univers} 2 | Li was born in 1962 in Wendeng County, Shandong. | 1.09244 | {li,born,1962,wendeng,counti,shandong} -
Temukan dokumen paling relevan tentang ''shandong university'' dari sumber wiki.
-- Tabel sumber untuk JOIN. CREATE TABLE article_source (id int primary key, source text); INSERT INTO article_source VALUES (1, 'baike'), (2, 'wiki'), (3, 'wiki'), (4, 'baike'), (5, 'baike'), (6, 'baike'), (7, 'wiki'), (8, 'paper'), (9, 'http_log'), (10, 'http_log'), (11, 'http_log'); SELECT a.id, source, content, TEXT_SEARCH(content, 'shandong university') AS score, TOKENIZE(a.content, 'jieba') FROM wiki_articles a JOIN article_source b ON (a.id = b.id) WHERE TEXT_SEARCH(a.content, 'shandong university') > 0 AND b.source = 'wiki' ORDER BY score DESC; -- Hasil id | source | content | score | tokenize ----+--------+---------------------------------------------------------------------+---------+-------------------------------------------------- 7 | wiki | Shandong has dozens of universities. | 2.74634 | {shandong,has,dozen,univers} 3 | wiki | He graduated from the department of physics at Shandong University. | 2.38178 | {he,graduat,from,depart,physic,shandong,univers} 2 | wiki | Li was born in 1962 in Wendeng County, Shandong. | 1.09244 | {li,born,1962,wendeng,counti,shandong}
Praktik Terbaik
Bangun Ulang Indeks Menggunakan Resource Serverless
Memodifikasi properti tabel dapat memicu compaction dan pembangunan ulang indeks, yang mengakibatkan konsumsi CPU tinggi. Untuk memodifikasi properti tabel berikut, lakukan langkah-langkah berikut:
Perubahan pada
bitmap_columns,dictionary_encoding_columns, atau indeks vektor memicu compaction dan pengindeksan ulang. Kami menyarankan untuk menghindari sintaksisALTER TABLE xxx SETuntuk perubahan ini. Sebagai gantinya, gunakan sintaksisREBUILDdengan resource Serverless Computing. Untuk informasi lebih lanjut, lihat REBUILD.
ASYNC REBUILD TABLE <table_name>
WITH (
rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
bitmap_columns = '<col1>,<col2>',
dictionary_encoding_columns = '<col1>:on,<col2>:off',
vectors = '{
"<col_vector>": {
"algorithm": "HGraph",
"distance_method": "Cosine",
"builder_params": {
"base_quantization_type": "rabitq",
"graph_storage_type": "compressed",
"max_degree": 64,
"ef_construction": 400,
"precise_quantization_type": "fp32",
"use_reorder": true,
"max_total_size_to_merge_mb" : 4096
}
}
}'
);Memodifikasi penyimpanan berorientasi kolom untuk data berformat JSON atau kolom indeks teks penuh juga memicu compaction dan pembangunan ulang indeks. Sintaksis REBUILD belum didukung untuk modifikasi ini. Sebagai gantinya, buat tabel sementara sebagai berikut:
BEGIN ;
-- Bersihkan tabel sementara yang mungkin ada
DROP TABLE IF EXISTS <table_new>;
-- Buat tabel sementara
SET hg_experimental_enable_create_table_like_properties=on;
CALL HG_CREATE_TABLE_LIKE ('<table_new>', 'select * from <table>');
COMMIT ;
-- Aktifkan penyimpanan berorientasi kolom untuk data berformat JSON untuk kolom yang sesuai
ALTER TABLE <table_new> ALTER COLUMN <column_name> SET (enable_columnar_type = ON);
-- Buat indeks teks penuh untuk kolom yang sesuai
CREATE INDEX <idx_name> ON <table_new> USING FULLTEXT (column_name);
-- Masukkan data ke tabel sementara, jalankan menggunakan resource Serverless, dan selesaikan pembangunan indeks secara sinkron
SET hg_computing_resource = 'serverless';
INSERT INTO <table_new> SELECT * FROM <table>;
ANALYZE <table_new>;
BEGIN ;
-- Hapus tabel lama
DROP TABLE IF EXISTS <table>;
-- Ubah nama tabel sementara
ALTER TABLE <table_new> RENAME TO <table>;
COMMIT ;Untuk modifikasi properti lainnya—seperti `distribution_key`, `clustering_key`, `segment_key`, dan format penyimpanan—gunakan sintaksis REBUILD dengan resource Serverless Computing.
Lanjutan: Menyesuaikan Konfigurasi Tokenizer
Hologres merekomendasikan penggunaan konfigurasi tokenizer default. Namun, Anda mungkin perlu menyesuaikannya untuk kebutuhan bisnis tertentu.
Persyaratan analyzer_params
Persyaratan untuk konfigurasi analyzer_params:
-
Harus berupa string JSON.
-
Kunci tingkat atas adalah tokenizer dan filter:
-
filter: Opsional. Array JSON dari konfigurasi filter. Filter diterapkan pada setiap token secara berurutan.
-
tokenizer: Wajib. Objek JSON dari pengaturan tokenizer. Kunci yang didukung meliputi:
-
type: Wajib. Nama tokenizer.
-
Parameter spesifik tokenizer lainnya. Lihat tabel di bawah untuk detailnya.
Tokenizer
Parameter lain dari objek tokenizer
Deskripsi parameter
Nilai
jieba
mode
Menentukan mode tokenisasi.
-
search (default): Mencantumkan semua kombinasi yang mungkin selama tokenisasi, memungkinkan redundansi. Misalnya, istilah Bahasa Tionghoa "traditional festival" ditokenisasi menjadi "tradition", "festival", dan "traditional festival", menghasilkan tiga token.
-
exact: Melakukan tokenisasi non-redundan. Misalnya, istilah Bahasa Tionghoa "traditional festival" ditokenisasi menjadi hanya satu token: "traditional festival".
hmm
Menentukan apakah akan menggunakan Model Markov Tersembunyi (HMM) untuk mendeteksi kata di luar kamus (OOV). Ini meningkatkan kemampuan mengenali kata baru.
-
true (default): gunakan
-
false: Nilai ini tidak digunakan.
standard
max_token_length
Panjang maksimum token.
Bilangan bulat positif. Nilai default adalah 255. Jika token melebihi panjang ini, akan dibagi pada interval max_token_length.
ik
mode
Menentukan mode tokenisasi.
-
ik_max_word (default): Tokenisasi tingkat halus. Menghasilkan semua kata pendek yang mungkin. Misalnya, istilah Bahasa Tionghoa "Nanjing City" ditokenisasi menjadi "Nanjing" dan "city".
-
ik_smart: Tokenisasi tingkat kasar. Mengutamakan kata yang lebih panjang untuk mengurangi jumlah pemisahan. Token output tidak tumpang tindih. Berusaha menggabungkan angka dan kuantifier menjadi satu token. Misalnya, "Nanjing City" dan "1 kilometer" tidak ditokenisasi lebih lanjut.
enable_lowercase
Menentukan apakah akan mengonversi token menjadi huruf kecil.
-
true (default)
-
false
ngram
min_ngram
Panjang karakter minimum token.
Nilai default adalah 1. Harus berupa bilangan positif. Selisih maksimum antara min_ngram dan max_ngram adalah 3.
Catatan: Anda dapat menyesuaikan selisih maksimum dengan mengatur parameter Konfigurasi Grand Unified (GUC) berikut. Contoh:
SET hg_fulltext_index_max_ngram_diff = 5max_ngram
Panjang karakter maksimum token.
Nilai default adalah 2. Rentang nilai [1, 255]. Selisih maksimum antara max_ngram dan min_ngram adalah 3.
CatatanJika selisih antara max_ngram dan min_ngram terlalu besar, tokenizer ngram menghasilkan banyak token. Hal ini dapat menyebabkan peningkatan konsumsi resource, penyimpanan indeks yang lebih besar, dan waktu pembuatan indeks yang lebih lama.
prefix_only
Menentukan apakah hanya mempertimbangkan awalan.
-
true
-
false (default)
pinyin
keep_first_letter
Menentukan apakah akan menyimpan huruf awal setiap karakter Tionghoa.
-
true (default): Menyimpan huruf awal. Misalnya, Pinyin untuk "Lǐ Míng" ditokenisasi untuk menyertakan "lm".
-
false: Item tidak disimpan.
keep_separate_first_letter
Menentukan apakah akan menyimpan huruf awal setiap karakter Tionghoa.
-
true: Menyimpan huruf awal sebagai token terpisah. Misalnya, Pinyin untuk "Lǐ Míng" ditokenisasi untuk menyertakan "l" dan "m".
-
false (default): Sistem tidak menyimpan item tersebut.
limit_first_letter_length
Panjang maksimum token yang terdiri dari huruf awal.
Panjang maksimum string huruf awal. Nilainya berupa bilangan bulat. Nilai default adalah 16.
keep_full_pinyin
Menentukan apakah akan menyimpan Pinyin lengkap setiap karakter Tionghoa.
-
true (default): Menyimpan Pinyin lengkap. Misalnya, Pinyin untuk "Lǐ Míng" ditokenisasi untuk menyertakan "li" dan "ming".
-
false: Penyimpanan dinonaktifkan.
keep_joined_full_pinyin
Menentukan apakah akan menggabungkan Pinyin lengkap setiap karakter Tionghoa.
-
Jika true, suku kata pinyin digabung. Misalnya, hasil tokenisasi untuk "李明" menyertakan "liming".
-
false (nilai bawaan): Koneksi tidak dibuat.
keep_none_chinese
Menentukan apakah akan menyimpan huruf atau angka non-Tionghoa dalam hasil.
-
true (default): Menyimpannya.
-
false: Tidak menyimpannya.
keep_none_chinese_together
Menentukan apakah akan menyimpan huruf atau angka non-Tionghoa yang berurutan bersama sebagai satu token.
-
true (default): Menyimpannya bersama. Misalnya, "DJ李明" ditokenisasi untuk menyertakan "DJ", "li", dan "ming", di mana "DJ" adalah satu token.
-
false: Tidak menyimpannya bersama. Misalnya, "DJ李明" ditokenisasi untuk menyertakan "D", "J", "li", dan "ming".
CatatanParameter ini hanya berlaku ketika keep_none_chinese diatur ke true.
keep_none_chinese_in_first_letter
Menentukan apakah akan menyimpan huruf atau angka non-Tionghoa dalam token yang terdiri dari huruf awal.
-
true (default): Menyimpannya. Misalnya, "李明AT2025" ditokenisasi untuk menyertakan "lmat2025".
-
false: Tidak menyimpannya.
keep_none_chinese_in_joined_full_pinyin
Menentukan apakah akan menyimpan huruf atau angka non-Tionghoa dalam token yang terdiri dari Pinyin lengkap yang digabung.
-
true: Menyimpannya. Misalnya, "李明AT2025" ditokenisasi untuk menyertakan "limingat2025".
-
false (default): Tidak menyimpannya.
none_chinese_pinyin_tokenize
Jika urutan huruf non-Tionghoa merupakan suku kata Pinyin yang valid, tentukan apakah akan membaginya menjadi istilah Pinyin terpisah.
-
true (default): Membagi urutan tersebut. Misalnya, "limingalibaba2025" ditokenisasi untuk menyertakan "li", "ming", "a", "li", "ba", "ba", dan "2025".
-
false: Tidak membagi urutan tersebut.
CatatanParameter ini hanya berlaku ketika keep_none_chinese dan keep_none_chinese_together diatur ke true.
keep_original
Menentukan apakah akan menyimpan input asli.
-
true: Menyimpan input asli.
-
false (default): Tidak menyimpan input asli.
lowercase
Menentukan apakah akan mengonversi huruf non-Tionghoa menjadi huruf kecil.
-
true (default)
-
false
trim_whitespace
Menentukan apakah akan menghapus karakter spasi.
-
true (default)
-
false
remove_duplicated_term
Menentukan apakah akan menghapus istilah duplikat.
-
true: Menghapus istilah duplikat. Misalnya, "de的" ditokenisasi menjadi "de". Namun, hal ini dapat memengaruhi hasil kueri frasa untuk "de的".
-
false (default): Tidak menghapus istilah duplikat.
keep_separate_chinese
Menentukan apakah akan menyimpan karakter Tionghoa individual sebagai token terpisah.
-
true: Menyimpan karakter individual. Misalnya, "李明" ditokenisasi untuk menyertakan "李" dan "明" sebagai dua token terpisah.
-
false (default): Nilai tidak disimpan.
-
-
-
Default analyzer_params
analyzer_params default untuk setiap tokenizer:
|
Nama Tokenizer |
Parameter bawaan alat analisis |
Contoh Tokenisasi |
|
jieba (tokenizer default) |
|
|
|
whitespace |
|
|
|
keyword |
|
|
|
simple |
|
|
|
standard |
|
|
|
icu |
|
|
|
ik |
|
|
|
ngram |
|
|
|
pinyin |
|
|
Konfigurasi Filter dalam analyzer_params
Hologres mendukung filter berikut dalam analyzer_params.
Jika Anda mengonfigurasi beberapa filter, filter tersebut diterapkan pada setiap token secara berurutan.
|
Nama Properti |
Deskripsi |
Format parameter |
Contoh |
|
lowercase |
Mengonversi huruf kapital dalam token menjadi huruf kecil. |
Deklarasikan lowercase.
|
|
|
stop |
Menghapus token kata berhenti. |
|
|
|
stemmer |
Mengurangi token ke bentuk dasarnya berdasarkan aturan bahasa. |
|
|
|
length |
Menghapus token yang lebih panjang dari panjang yang ditentukan. |
|
|
|
removepunct |
Menghapus token yang hanya terdiri dari karakter tanda baca. |
Deklarasikan removepunct.
Catatan
Mulai versi 4.0.8, removepunct menambahkan parameter mode. Nilai valid:
|
|
|
pinyin |
Filter token pinyin. |
|
Pengaturan filter sesuai dengan tokenizer pinyin. |