Hologres V4.0 dan versi selanjutnya mendukung indeks terbalik teks penuh yang dibangun di atas Tantivy, mesin pencarian teks penuh berkinerja tinggi. Fitur ini menyediakan pengambilan data berkinerja tinggi serta mendukung algoritma penskoran kesamaan BM25 untuk pengurutan dokumen, pencarian kata kunci, dan pencarian frasa.
Cara kerja
Saat Anda menulis teks sumber ke Hologres, sistem membangun file indeks terbalik teks penuh untuk setiap file data berdasarkan konfigurasi indeks yang ditentukan. Pertama, tokenizer memecah teks menjadi token. Indeks kemudian mencatat pemetaan antara setiap token dan teks sumber, termasuk informasi seperti posisi dan frekuensi kata kunci.
Untuk melakukan pencarian teks, kueri pencarian terlebih dahulu ditokenisasi menjadi sekumpulan token target. Algoritma BM25 kemudian menghitung skor relevansi setiap teks sumber terhadap token target tersebut, sehingga memungkinkan pencarian teks penuh yang cepat dan akurat.
Catatan
Indeks terbalik teks penuh hanya didukung untuk tabel berorientasi kolom dan tabel hibrida baris-kolom di Hologres V4.0 dan versi selanjutnya. Tabel berorientasi baris tidak didukung.
Anda hanya dapat membuat indeks terbalik teks penuh pada kolom dengan tipe data TEXT, CHAR, atau VARCHAR.
Anda hanya dapat membangun indeks terbalik teks penuh pada satu kolom sekaligus. Setiap kolom hanya mendukung satu indeks terbalik teks penuh. Untuk mengindeks beberapa kolom, Anda harus membuat indeks terpisah untuk masing-masing kolom.
Setelah membuat indeks terbalik teks penuh, file indeks untuk data yang sudah ada maupun data baru yang diimpor dibangun secara asinkron selama proses kompaksi data. Sampai file indeks dibangun, skor relevansi BM25 untuk data tersebut bernilai 0.
Untuk penulisan data real-time setelah pembuatan indeks terbalik teks penuh: Pada versi sebelum Hologres V4.0.8, indeks dibangun secara sinkron dengan penulisan data real-time. Mulai V4.0.8 dan versi selanjutnya, sistem merefresh indeks real-time di memori secara asinkron setiap detik guna menjaga efisiensi penulisan data dan pembuatan indeks. Data hanya dapat dikueri menggunakan indeks setelah indeks direfresh.
Pencarian teks penuh hanya dapat dilakukan pada kolom yang memiliki indeks teks penuh. Pencarian brute-force pada kolom tanpa indeks tidak didukung.
Anda dapat menggunakan resource Serverless Computing untuk impor data batch. Resource Serverless menyelesaikan kompaksi dan pembuatan indeks teks penuh secara sinkron selama impor data. Untuk informasi lebih lanjut, lihat Gunakan Serverless Computing untuk tugas baca dan tulis dan Gunakan Serverless Computing untuk tugas kompaksi. Jika tidak menggunakan resource Serverless, Anda harus menjalankan perintah berikut secara manual untuk memicu Kompaksi setelah mengimpor data secara batch atau memodifikasi indeks.
VACUUM <schema_name>.<table_name>;Algoritma pencarian BM25 menghitung skor relevansi pada tingkat file. Jika Anda mengimpor jumlah data yang kecil, Anda dapat memicu Kompaksi secara manual untuk menggabungkan file dan meningkatkan akurasi pencarian.
Anda dapat menggunakan resource Serverless Computing untuk menjalankan kueri pencarian teks penuh.
Anda dapat memilih tokenizer sesuai skenario dalam tabel berikut:
Skenario
Tokenizer
Catatan
Ekstraksi kata kunci dari artikel panjang
Jieba
Mendukung penemuan kata baru dan peralihan pola kompleks.
Pencarian teks deskriptif Bahasa Mandarin
IK
Mengidentifikasi istilah Bahasa Mandarin secara akurat.
Pencarian teks judul Bahasa Inggris
Simple, Whitespace, Standard
Sederhana dan efisien. Gunakan sesuai kebutuhan berdasarkan teks Bahasa Inggris target.
Pencarian kabur untuk teks log
Ngram
Tidak memerlukan kamus. Memenuhi kebutuhan kueri teks kabur.
Pencarian Pinyin untuk nama produk atau orang Tionghoa
Pinyin
Mendukung berbagai skenario Pinyin Tionghoa seperti Pinyin lengkap, huruf awal, dan derivasi homofon.
Kelola indeks
Buat indeks
Sintaks
CREATE INDEX [ IF NOT EXISTS ] idx_name ON table_name
USING FULLTEXT (column_name [ , ... ])
[ WITH ( storage_parameter [ = value ] [ , ... ] ) ];Parameter
Parameter | Deskripsi |
idx_name | Nama indeks. |
table_name | Nama tabel target. |
column_name | Nama kolom target untuk membangun indeks terbalik teks penuh. |
storage_parameter | Parameter untuk indeks terbalik teks penuh. Terdapat dua jenis parameter:
Catatan Hanya satu jenis `tokenizer` dan `analyzer_params` yang dapat diatur dalam indeks yang sama. |
Contoh
Buat indeks terbalik teks penuh yang menggunakan tokenizer dan konfigurasi default. Tokenizer default adalah tokenizer Jieba.
CREATE INDEX idx1 ON tbl USING FULLTEXT (col1);Tentukan secara eksplisit tokenizer IK dan gunakan konfigurasi default-nya.
CREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (tokenizer = 'ik');Tentukan secara eksplisit konfigurasi tokenizer kustom yang menggunakan tokenizer Jieba dalam mode `exact` dan hanya filter `lowercase` untuk mengonversi teks menjadi huruf kecil.
CREATE INDEX idx1 ON tbl USING FULLTEXT (col1) WITH (tokenizer = 'jieba', analyzer_params = '{"tokenizer":{"type":"jieba","mode":"exact"}, "filter":["lowercase"]}');
Setelah membuat indeks terbalik teks penuh, file indeks dibangun selama proses Kompaksi setelah data diimpor.
Anda dapat menggunakan resource Serverless Computing untuk impor data batch. Resource Serverless menyelesaikan kompaksi dan pembuatan indeks teks penuh secara sinkron selama impor data. Untuk informasi lebih lanjut, lihat Gunakan Serverless Computing untuk tugas baca dan tulis dan Gunakan Serverless Computing untuk tugas kompaksi.
Jika tidak menggunakan resource Serverless, Anda harus menjalankan perintah berikut secara manual untuk memicu Kompaksi setelah mengimpor data secara batch atau memodifikasi indeks. Untuk informasi lebih lanjut, lihat Kompaksi (Beta).
VACUUM <schema_name>.<table_name>;
Modifikasi indeks
Sintaks
-- Modifikasi konfigurasi indeks
ALTER INDEX [ IF EXISTS ] <idx_name> SET ( <storage_parameter> = '<storage_value>' [ , ... ] );
-- Atur ulang ke konfigurasi default
ALTER INDEX [ IF EXISTS ] <idx_name> RESET ( <storage_parameter> [ , ... ] );Parameter
Untuk informasi lebih lanjut tentang parameter, lihat Parameter.
Contoh
Setelah memodifikasi indeks terbalik teks penuh, file indeks dibangun ulang secara asinkron selama proses kompaksi data. Anda harus menjalankan perintah VACUUM <schema_name>.<table_name>; secara manual untuk memicu Kompaksi secara sinkron. Untuk informasi lebih lanjut, lihat Kompaksi.
Ubah tokenizer indeks menjadi `standard`.
ALTER INDEX idx1 SET (tokenizer = 'standard');Ubah tokenizer indeks menjadi `ik` dengan mode `ik_max_word`, tanpa mengonversi teks menjadi huruf kecil atau menambahkan filter.
ALTER INDEX idx1 SET ( tokenizer = 'ik', analyzer_params = '{"tokenizer":{"type":"ik","mode":"ik_max_word","enable_lowercase": false}}' );Atur ulang indeks untuk menggunakan tokenizer Jieba default dan konfigurasi `analyzer_params` default-nya.
ALTER INDEX idx1 RESET (tokenizer); ALTER INDEX idx1 RESET (tokenizer, analyzer_params);Atur ulang konfigurasi `analyzer_params` ke nilai default untuk tokenizer saat ini.
ALTER INDEX idx1 RESET (analyzer_params);
Hapus indeks
Sintaks
DROP INDEX [ IF EXISTS ] <idx_name> [ RESTRICT ];Parameter
Untuk informasi lebih lanjut tentang parameter, lihat Parameter.
Lihat indeks
Hologres menyediakan tabel sistem hologres.hg_index_properties untuk melihat indeks terbalik teks penuh yang telah dibuat beserta lokasinya.
SELECT * FROM hologres.hg_index_properties;Anda dapat menjalankan pernyataan SQL berikut untuk melihat tabel dan kolom yang sesuai 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;Parameter:
namespace: Nilai field
table_namespacedalam hasil yang dikembalikan oleh perintahSELECT * FROM hologres.hg_index_properties;.indexname: Nama indeks.
Gunakan indeks untuk pencarian teks penuh
Hologres mendukung berbagai mode pencarian yang memungkinkan Anda melakukan pencarian teks penuh secara fleksibel sesuai kebutuhan.
Mode pencarian | Deskripsi |
Pencocokan kata kunci | Mencari berdasarkan kata kunci dari kueri pencarian yang telah ditokenisasi. Mendukung pendefinisian hubungan AND/OR antar kata kunci. |
Pencarian frasa | Mencari berdasarkan frasa dari kueri pencarian. Pencocokan memerlukan jarak antara beberapa kata memenuhi persyaratan yang ditentukan. |
Pencarian bahasa alami | Memungkinkan Anda mendefinisikan kondisi kueri kompleks untuk mencapai tujuan pencarian secara fleksibel, seperti mendefinisikan hubungan AND/OR, kata wajib, kata yang dikecualikan, dan frasa. |
Pencarian kata kunci | Menjalankan pencarian tepat untuk kueri pencarian. Pencocokan memerlukan bahwa indeks berisi string kueri yang persis sama. |
Fungsi pencarian TEXT_SEARCH
Fungsi `TEXT_SEARCH` menghitung skor relevansi BM25 untuk teks sumber berdasarkan kueri pencarian.
Sintaks 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 '']
)Parameter
Parameter | Wajib | Deskripsi |
search_data | Ya | Sumber pencarian. Parameter ini mendukung tipe data TEXT, VARCHAR, dan CHAR. Hanya input kolom yang didukung, dan kolom tersebut harus memiliki indeks teks penuh. Jika tidak, akan muncul error. |
search_expression | Ya | Objek pencarian. Parameter ini mendukung tipe data TEXT, VARCHAR, dan CHAR. Hanya konstanta yang didukung. |
mode | Tidak | Mode pencarian. Mode berikut didukung:
|
operator | Tidak | Operator logika antar kata kunci. Parameter ini hanya berlaku ketika mode diatur ke `match`. Nilai berikut didukung:
|
tokenizer, analyzer_params | Tidak | Tokenizer dan konfigurasi yang digunakan untuk kueri pencarian search_expression. Biasanya Anda tidak perlu mengonfigurasi parameter ini.
|
options | Tidak | Parameter lain untuk indeks teks penuh. Tentukan parameter ini dalam format Saat ini, hanya parameter slop yang didukung. Parameter ini hanya berlaku ketika mode diatur ke phrase. Anda dapat mengatur slop ke 0 (default) atau bilangan bulat positif. Nilai ini menentukan jarak maksimum yang diizinkan antara istilah dalam frasa. Catatan Nilai slop menentukan celah maksimum yang diizinkan—atau overhead transformasi—antara istilah dalam frasa. Untuk tokenizer seperti jieba, keyword, dan icu, celah diukur dalam karakter, bukan token. Untuk tokenizer seperti standard, simple, dan whitespace, celah diukur dalam token. |
Nilai kembalian
Fungsi ini mengembalikan nilai FLOAT non-negatif yang merepresentasikan skor relevansi BM25 antara teks sumber dan kueri pencarian. Skor yang lebih tinggi menunjukkan relevansi yang lebih tinggi. Skor 0 menunjukkan bahwa teks sama sekali tidak relevan.
Contoh
Gunakan mode pencocokan kata kunci dan ubah operator menjadi AND.
-- Tentukan nama parameter. SELECT TEXT_SEARCH (content, 'machine learning', operator => 'AND') FROM tbl; -- Jangan tentukan nama parameter. Anda harus menentukan parameter sesuai urutan. SELECT TEXT_SEARCH (content, 'machine learning', 'match', 'AND') FROM tbl;Gunakan mode pencarian frasa dan atur slop ke 2.
SELECT TEXT_SEARCH (content, 'machine learning', 'phrase', options => 'slop=2;') FROM tbl;Gunakan mode pencarian bahasa alami.
-- Definisikan logika pencarian token menggunakan operator AND dan OR. SELECT TEXT_SEARCH (content, 'machine AND (system OR recognition)', 'natural_language') FROM tbl; -- Definisikan logika pencarian token menggunakan + (harus termasuk) dan - (harus dikecualikan). SELECT TEXT_SEARCH (content, '+learning -machine system', 'natural_language') FROM tbl;Gunakan mode pencarian kata kunci.
SELECT TEXT_SEARCH (content, 'machine learning', 'term') FROM tbl;
Fungsi TOKENIZE
Fungsi `TOKENIZE` menghasilkan hasil tokenisasi berdasarkan konfigurasi tokenizer. Anda dapat menggunakannya untuk men-debug efek tokenisasi indeks terbalik teks penuh.
Sintaks fungsi
TOKENIZE (
<search_data> TEXT
[ ,<tokenizer> TEXT DEFAULT ''
,<analyzer_params> TEXT DEFAULT '']
)Parameter
search_data: Wajib. Teks target untuk tokenisasi. Hanya input konstanta yang didukung.
tokenizer, analyzer_params: Opsional. Tokenizer dan konfigurasi yang digunakan untuk teks target search_data. Default-nya adalah tokenizer Jieba.
Nilai kembalian
Fungsi ini mengembalikan array TEXT yang berisi kumpulan token dari teks target.
Verifikasi penggunaan indeks
Anda dapat menggunakan rencana eksekusi untuk menentukan apakah pernyataan SQL menggunakan indeks terbalik teks penuh. Jika rencana eksekusi mencakup Fulltext Filter, maka indeks terbalik teks penuh digunakan. Untuk informasi lebih lanjut tentang rencana eksekusi, lihat EXPLAIN dan EXPLAIN ANALYZE.
Contoh pernyataan SQL:
EXPLAIN ANALYZE SELECT * FROM wiki_articles WHERE text_search(content, 'Yangtze River') > 0;Rencana eksekusi berikut berisi field Fulltext Filter. Ini menunjukkan bahwa pernyataan SQL menggunakan indeks terbalik teks penuh.
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.0Contoh penggunaan
Persiapan data
Jalankan pernyataan SQL berikut untuk membuat tabel uji dan memasukkan data ke dalamnya.
-- 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');
-- Tulis data.
INSERT INTO wiki_articles VALUES
(1, 'The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers.'),
(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 the most important traditional festival in China.'),
(5, 'The Spring Festival usually falls between late January and mid-February in the Gregorian calendar. Main customs during the Spring Festival include pasting spring couplets, setting off firecrackers, having a New Year''s Eve dinner, and making New Year visits.'),
(6, 'In 2006, the Spring Festival was approved by the State Council as one of the first national intangible cultural heritages.'),
(7, 'Shandong has dozens of universities.'),
(8, 'ShanDa is a famous university of Shandong.');
-- Kompaksi
VACUUM wiki_articles;
-- Kueri data tabel.
SELECT * FROM wiki_articles limit 1;Hasil berikut dikembalikan:
id | content
---+---------------------------------------------------
1 | The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers.Contoh pencarian berbeda
Pencocokan kata kunci.
-- (K1) Pencocokan kata kunci (operator default=OR). Dokumen yang berisi 'shandong' atau 'university' dicocokkan. 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 of Shandong. -- (K2) Pencocokan kata kunci (operator=AND). Dokumen harus berisi 'shandong' dan 'university' untuk dicocokkan. 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 of Shandong.Pencarian frasa.
-- (P1) Pencarian frasa (slop default = 0). Pencocokan hanya terjadi jika '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. Jarak antara 'shandong' dan 'university' tidak boleh melebihi 14 karakter. Ini 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 tidak berurutan, tetapi perhitungan slop berbeda dan memerlukan nilai yang lebih besar daripada frasa berurutan. -- Oleh karena itu, 'university of Shandong' juga dapat mencocokkan kueri berikut, tetapi tidak akan dicocokkan jika 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 of Shandong. (3 rows) -- (P4) Perilaku dengan indeks tokenizer standard. (ALTER INDEX ft_idx_1 SET (tokenizer = 'standard');) -- Untuk tokenizer standard, slop dihitung dalam token. -- Selama tidak ada token di antaranya, terlepas dari jumlah spasi, dianggap sebagai pencocokan frasa. 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. (Contoh dengan tokenizer Jieba) -- Meskipun ada koma antara 'river' dan 'with' dalam teks, dan string kueri memiliki titik. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'river. with', mode => 'phrase') > 0; -- Hasil id | content ----+----------------------------------------------------- 1 | The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers. (1 row)Pencarian bahasa alami.
-- (N1) Kueri bahasa alami: Tanpa simbol apa pun, ini setara dengan pencocokan kata kunci. Sama seperti (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 of Shandong. -- (N2) Kueri bahasa alami: Pencocokan kata kunci. Harus berisi ('shandong' AND 'university') ATAU 'heritage'. Operator AND memiliki prioritas lebih tinggi daripada OR. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '(shandong AND university) OR heritage', 'natural_language') > 0; -- Setara dengan SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong AND university OR heritage', 'natural_language') > 0; -- Setara dengan SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '(+shandong +university) heritage', 'natural_language') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 8 | ShanDa is a famous university of 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 one of the first national intangible cultural heritages. -- (N3) Kueri bahasa alami: Pencocokan kata kunci. Harus berisi 'shandong', tidak boleh berisi 'university', dan boleh berisi 'heritage'. -- Dalam kueri ini, kata kunci 'heritage' tidak memiliki tanda + atau -, sehingga tidak memengaruhi baris mana yang dicocokkan. Namun, ini memengaruhi skor pencocokan. Baris dengan 'heritage' akan memiliki skor lebih tinggi. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '+shandong -university heritage', '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'. Skor relevansi lebih tinggi jika berisi 'famous'. -- Catatan: Kueri ini menunjukkan hasil perhitungan skor pada satu shard. Skor BM25 yang dihitung dapat bervariasi dengan jumlah shard yang berbeda dan organisasi file yang berbeda. 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 of 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). Frasa harus diapit tanda kutip ganda (""). Jika frasa berisi tanda kutip ganda, harus di-escape dengan backslash (\). 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. Setara dengan (P2). Mendukung pengaturan slop dengan sintaks ~. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, '"shandong university"~23', 'natural_language') > 0; -- Hasil id | content ----+--------------------------------------------------------------------- 8 | ShanDa is a famous university of 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 the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers. 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 the most important traditional festival in China. 5 | The Spring Festival usually falls between late January and mid-February in the Gregorian calendar. Main customs during the Spring Festival include pasting spring couplets, setting off firecrackers, having a New Year's Eve dinner, and making New Year visits. 6 | In 2006, the Spring Festival was approved by the State Council as one of the first national intangible cultural heritages. 7 | Shandong has dozens of universities. 8 | ShanDa is a famous university of Shandong.Pencarian kata kunci.
-- (T1) Kueri kata kunci: Hasil tokenisasi secara eksplisit berisi "Spring Festival", sehingga dapat diambil. 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 the most important traditional festival in China. 5 | The Spring Festival usually falls between late January and mid-February in the Gregorian calendar. Main customs during the Spring Festival include pasting spring couplets, setting off firecrackers, having a New Year's Eve dinner, and making New Year visits. 6 | In 2006, the Spring Festival was approved by the State Council as one of the first national intangible cultural heritages. -- (T2) Kueri kata kunci: Contoh yang tidak mengembalikan hasil. -- Karena kolom content tabel sumber wiki_articles menggunakan tokenizer Jieba secara default, yang memisahkan "shandong university". -- Kami menyarankan menggunakan kueri kata kunci dengan tokenizer keyword. Dalam kasus tersebut, data target dapat diambil. SELECT * FROM wiki_articles WHERE TEXT_SEARCH(content, 'shandong university', 'term') > 0; -- Hasil id | content ----+---------
Contoh kueri kompleks
Kueri dengan primary key.
-- Ambil teks yang berisi 'shandong' atau 'university' dan memiliki 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. -- Ambil teks yang berisi 'shandong' atau 'university', atau memiliki id kurang dari 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 of Shandong. 1 | The Yangtze River is the longest river in China and the third longest in the world, with a total length of about 6,300 kilometers. 3 | He graduated from the department of physics at Shandong University. 7 | Shandong has dozens of universities.Dapatkan skor dan ambil tiga hasil 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 of 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 fungsi TEXT_SEARCH baik di daftar SELECT maupun klausa 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 of 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}Ambil dokumen dari sumber 'wiki' yang paling relevan dengan 'shandong university'.
-- 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}
Rekomendasi penggunaan
Pengindeksan ulang menggunakan resource Serverless
Jika Anda memodifikasi properti tabel, kompaksi mungkin dipicu dan indeks mungkin dibangun ulang, yang mengonsumsi banyak resource CPU. Untuk memodifikasi properti tabel berikut, lakukan langkah-langkah di bawah ini:
-
Memodifikasi `bitmap_columns`, `dictionary_encoding_columns`, atau indeks vektor memicu kompaksi dan pengindeksan ulang. Oleh karena itu, jangan gunakan sintaks `ALTER TABLE xxx SET`. Sebagai gantinya, jalankan perintah berikut untuk menggunakan sintaks `REBUILD` dengan 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 kolom JSONB berorientasi kolom atau kolom indeks teks penuh juga memicu kompaksi dan pengindeksan ulang. Sintaks `REBUILD` tidak didukung untuk modifikasi ini. Sebagai gantinya, buat tabel sementara dengan mengikuti langkah-langkah 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 pada kolom yang sesuai.
CREATE INDEX <idx_name> ON <table_new> USING FULLTEXT (column_name);
-- Masukkan data ke tabel sementara, gunakan resource Serverless untuk menjalankan pekerjaan, dan selesaikan pembuatan 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 memodifikasi properti lain, seperti `distribution_key`, `clustering_key`, `segment_key`, dan format penyimpanan, gunakan sintaks `REBUILD` dengan resource Serverless Computing.
Operasi lanjutan: Menyesuaikan konfigurasi tokenizer
Hologres merekomendasikan penggunaan konfigurasi tokenizer default. Namun, dalam beberapa kasus, konfigurasi default mungkin tidak memenuhi kebutuhan bisnis Anda. Anda dapat menyesuaikan konfigurasi tokenizer untuk tokenisasi yang lebih fleksibel.
Persyaratan konfigurasi analyzer_params
Parameter `analyzer_params` memiliki persyaratan konfigurasi berikut:
Hanya string berformat JSON yang didukung.
Tingkat atas JSON mendukung dua kunci: `tokenizer` dan `filter`.
filter: Opsional. Nilainya adalah array JSON yang digunakan untuk mengonfigurasi properti filter token. Jika Anda mengonfigurasi beberapa properti filter token, properti tersebut diterapkan pada setiap token sesuai urutan yang ditentukan.
tokenizer: Wajib. Nilainya adalah objek JSON yang digunakan untuk mengonfigurasi properti tokenizer. Objek JSON mendukung kunci berikut:
type: Wajib. Nama tokenizer.
Parameter lain untuk objek tokenizer. Tokenizer berbeda mendukung parameter berbeda, seperti ditunjukkan dalam tabel berikut:
Tokenizer
Parameter lain untuk
objek tokenizerDeskripsi parameter
Nilai parameter
jieba
mode
Menentukan mode tokenisasi.
search (default): Menampilkan beberapa kombinasi yang mungkin selama tokenisasi, yang memungkinkan redundansi. Misalnya, hasil tokenisasi untuk "festival tradisional" adalah "tradisional", "festival", dan "festival tradisional".
exact: Mencegah pemisahan redundan selama tokenisasi. Misalnya, hasil tokenisasi untuk "festival tradisional" hanya "festival tradisional".
hmm
Menentukan apakah akan menggunakan Model Markov Tersembunyi (HMM) untuk mengidentifikasi kata yang tidak ada dalam kamus. Ini meningkatkan pengenalan kata baru.
true (default): Diaktifkan
false: Dinonaktifkan.
standard
max_token_length
Panjang token maksimum.
Bilangan bulat positif. Nilai default adalah 255. Jika token melebihi panjang ini, token tersebut dipisah pada interval `max_token_length`.
ik
mode
Menentukan mode tokenisasi.
ik_max_word (default): Melakukan tokenisasi detail halus yang menghasilkan semua kata pendek yang mungkin. Misalnya, hasil tokenisasi untuk "Kota Nanjing" adalah "Nanjing" dan "Kota".
ik_smart: Melakukan tokenisasi kasar yang memprioritaskan kata panjang dan mengurangi jumlah pemisahan. Token output tidak tumpang tindih. Mode ini mencoba menggabungkan angka dan kuantifier menjadi satu token. Misalnya, "Kota Nanjing" 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.
Bilangan positif. Nilai default adalah 1. Selisih maksimum antara `min_ngram` dan `max_ngram` adalah 3.
Catatan: Anda dapat menyesuaikan selisih maksimum dengan mengatur GUC berikut. Misalnya,
SET hg_fulltext_index_max_ngram_diff = 5.max_ngram
Panjang karakter maksimum token.
Nilai default adalah 2. Nilai harus dalam rentang [1, 255]. Selisih maksimum antara `min_ngram` dan `max_ngram` adalah 3.
CatatanJika selisih antara `max_ngram` dan `min_ngram` terlalu besar, tokenizer ngram menghasilkan banyak token. Hal ini dapat meningkatkan konsumsi resource, memerlukan lebih banyak penyimpanan indeks, dan memperpanjang waktu pembuatan indeks.
prefix_only
Menentukan apakah hanya mempertimbangkan awalan.
true
false (default)
pinyin
keep_first_letter
Menentukan apakah akan menyimpan huruf awal setiap karakter Tionghoa sebagai token.
true (default): Menyimpan huruf awal. Misalnya, hasil tokenisasi untuk "Li Ming" mencakup "lm".
false: Tidak menyimpan.
keep_separate_first_letter
Menentukan apakah akan menyimpan huruf awal setiap karakter Tionghoa sebagai token terpisah.
true: Menyimpan huruf awal secara terpisah. Misalnya, hasil tokenisasi untuk "Li Ming" mencakup "l,m".
false (default): Pengaturan tidak menyimpan nilai.
limit_first_letter_length
Panjang maksimum token huruf awal.
Bilangan bulat yang menentukan panjang maksimum string huruf awal. Nilai default adalah 16.
keep_full_pinyin
Menentukan apakah akan menyimpan Pinyin lengkap setiap karakter Tionghoa sebagai token terpisah.
true (default): Menyimpan Pinyin lengkap. Misalnya, hasil tokenisasi untuk "Li Ming" mencakup "li,ming".
false: Item tidak disimpan.
keep_joined_full_pinyin
Menentukan apakah akan menggabungkan Pinyin lengkap setiap karakter Tionghoa menjadi satu token.
true: Menggabungkan Pinyin lengkap. Misalnya, hasil tokenisasi untuk "Li Ming" mencakup "liming".
false (default): Sistem tidak membuat koneksi.
keep_none_chinese
Menentukan apakah akan menyimpan huruf atau angka non-Tionghoa dalam hasil tokenisasi.
true (default): Simpan.
false: Tidak disimpan.
keep_none_chinese_together
Menentukan apakah akan menyimpan huruf atau angka non-Tionghoa bersama-sama.
true (default): Menyimpan karakter non-Tionghoa bersama. Misalnya, hasil tokenisasi untuk "DJ Li Ming" adalah "DJ,li,ming", di mana "DJ" tetap bersama.
false: Tidak menyimpan karakter non-Tionghoa bersama. Misalnya, hasil tokenisasi untuk "DJ Li Ming" adalah "D,J,li,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 huruf awal.
true (default): Simpan. Misalnya, hasil tokenisasi 李明AT2025 mencakup lmat2025.
false: Item tidak disimpan.
keep_none_chinese_in_joined_full_pinyin
Menentukan apakah akan menyimpan huruf atau angka non-Tionghoa dalam token Pinyin lengkap yang digabung.
true: Menyimpan karakter non-Tionghoa. Misalnya, hasil tokenisasi untuk "Li Ming AT2025" mencakup "limingat2025".
false (default): Resource tidak disimpan.
none_chinese_pinyin_tokenize
Jika huruf non-Tionghoa merupakan Pinyin yang valid, tentukan apakah akan memisahkannya menjadi istilah Pinyin terpisah.
true (default): Memisahkan istilah. Misalnya, hasil tokenisasi untuk "limingalibaba2025" mencakup "li,ming,a,li,ba,ba,2025".
false: Tidak memisahkan istilah.
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.
Jika parameter ini diatur ke true, token tertentu dihapus. Misalnya, "de的" ditokenisasi sebagai "de", yang 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, hasil tokenisasi untuk "Li Ming" mencakup dua token "Li" dan "Ming".
false (default): Item tidak disimpan.
Konfigurasi analyzer_params default
Konfigurasi `analyzer_params` default untuk tokenizer berbeda adalah sebagai berikut:
Analyzer name | Konfigurasi analyzer_params default | Contoh tokenisasi |
jieba (alat analisis default) | | |
whitespace | | |
keyword | | |
simple | | |
standard | | |
icu | | |
ik | | |
ngram | | |
pinyin | | |
Konfigurasi filter dalam analyzer_params
Hologres mendukung filter berikut, juga dikenal sebagai properti filter token, dalam `analyzer_params`.
Jika Anda mengonfigurasi beberapa properti filter token, properti tersebut diterapkan pada setiap token sesuai urutan yang ditentukan.
Nama properti | Deskripsi properti | Format parameter | Contoh |
lowercase | Mengonversi huruf kapital dalam token menjadi huruf kecil. | Deklarasikan `lowercase`. |
|
stop | Menghapus token kata berhenti. |
|
|
stemmer | Mengonversi token menjadi bentuk dasar (stem) yang sesuai berdasarkan aturan tata bahasa bahasa tersebut. |
|
|
length | Menghapus token yang melebihi panjang tertentu. |
|
|
removepunct | Menghapus token yang hanya terdiri dari karakter tanda baca. | Deklarasikan `removepunct`. Catatan Di V4.0.8 dan versi selanjutnya, `removepunct` memiliki parameter `mode` baru yang menentukan mode penghapusan. Nilainya sebagai berikut:
|
|
pinyin | Filter token Pinyin. | | Properti konfigurasi filter sama dengan untuk tokenizer Pinyin. |