Halaman ini menjelaskan cara menambahkan tokenisasi ke tabel. Tokenisasi adalah yang diperlukan untuk membuat token yang digunakan dalam indeks penelusuran.
Ringkasan
Tokenisasi adalah proses transformasi nilai menjadi token. Metode yang Anda digunakan untuk membuat token pada dokumen menentukan jenis dan efisiensi pencarian yang dapat dilakukan pengguna.
Spanner menyediakan tokenizer untuk teks natural language, {i>substring<i}, teks verbatim, angka, dan boolean. Skema {i>database<i} menggunakan tokenizer yang cocok dengan jenis pencarian yang dibutuhkan untuk kolom tersebut. Tokenizer memiliki karakteristik berikut:
- Setiap tokenizer adalah fungsi SQL yang mendapatkan input, seperti string atau angka, dan argumen yang dinamai untuk opsi tambahan.
- Tokenizer menghasilkan
TOKENLIST
.
Misalnya, string teks The quick brown fox jumps over the lazy dog
ditokenkan menjadi [the,quick,brown,fox,jumps,over,the,lazy,dog]
.
String HTML The <b>apple</b> is <i>red</i>
ditokenkan menjadi
[the,apple,is,red]
.
Token memiliki karakteristik berikut:
- Token disimpan dalam kolom yang menggunakan jenis data
TOKENLIST
. - Setiap token disimpan sebagai urutan byte, dengan serangkaian yang terkait. Misalnya, dalam aplikasi teks lengkap, token biasanya satu kata dari dokumen tekstual.
- Saat membuat token nilai HTML, Spanner menghasilkan atribut yang menunjukkan keterlihatan token dalam dokumen. Spanner menggunakan atribut ini untuk penilaian guna meningkatkan istilah yang menonjol (seperti tajuk).
Tokenizer
Spanner mendukung fungsi tokenizer berikut:
Tokenizer teks lengkap (
TOKENIZE_FULLTEXT
) menghasilkan token kata utuh untuk kueri natural language.Contoh
Kedua fungsi berikut
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")
menghasilkan token yang sama:
[yellow,apple]
.Tokenizer substring (
TOKENIZE_SUBSTRING
) menghasilkan token untuk setiap n-gram dari setiap kata. Fungsi ini digunakan untuk menemukan {i>substring<i} kata dalam sebuah teks.Contoh
TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
Menghasilkan token berikut:
[ello,hell,hello,orld,worl,world]
.Tokenizer N-gram (
TOKENIZE_NGRAMS
) menghasilkan n-gram dari input (tanpa membaginya menjadi kata-kata terpisah). Fungsi ini digunakan untuk mempercepat predikat ekspresi reguler.Contoh
Fungsi berikut:
TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
Menghasilkan token berikut:
["Big ","ig T","g Ti"," Tim", "Time"]
.Tokenizer pencocokan persis (
TOKEN
danTOKENIZE_BOOL
) digunakan untuk mencari baris yang berisi nilai tertentu di salah satu kolomnya. Misalnya, aplikasi yang mengindeks katalog produk mungkin ingin mencari produk dari merek dan warna tertentu.Contoh
Fungsi berikut:
TOKEN("hello") TOKEN(["hello", "world"])
Buat token berikut:
[hello]
dan[hello,world]
.Fungsi berikut:
TOKENIZE_BOOL(true)
Menghasilkan token berikut:
[y]
.Tokenizer angka (
TOKENIZE_NUMBER
) digunakan untuk menghasilkan serangkaian token yang mempercepat perbandingan numerik penelusuran. Untuk kondisi kesetaraan, tokennya adalah angka itu sendiri. Untuk rentang kondisi tertentu (sepertirating >= 3.5
), kumpulan token lebih terperinci.Contoh
Pernyataan fungsi berikut:
TOKENIZE_NUMBER(42, comparison_type=>"equality") TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
Buat token berikut:
"==42"
dan"==42"
,"[1,75]"
,"[36, 45]"
,"[36,55]"
,"[36, 75]"
.
Fungsi tokenisasi biasanya digunakan dalam
ekspresi kolom yang dihasilkan. Ini
kolom ditetapkan sebagai HIDDEN
sehingga tidak disertakan dalam SELECT *
hasil kueri.
Contoh berikut menggunakan tokenizer teks lengkap dan tokenizer numerik untuk membuat {i>database<i} yang menyimpan nama dan peringkat album musik. Pernyataan DDL melakukan dua hal:
- Menentukan kolom data
AlbumTitle
danRating
. Menentukan
AlbumTitle_Tokens
danAlbumRating_Tokens
.TOKENLIST
ini kolom menjadi token nilai dalam kolom data sehingga Spanner dapat mengindeksnya.CREATE TABLE Albums ( AlbumId STRING(MAX) NOT NULL, AlbumTitle STRING(MAX), Rating FLOAT64, AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN, Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN ) PRIMARY KEY(AlbumId);
Setiap kali nilai dasar diubah, AlbumTitle_Tokens
dan Rating_Tokens
akan diperbarui secara otomatis.
Membuat token teks biasa atau konten HTML
Tokenisasi teks mendukung jenis konten HTML dan teks biasa. Gunakan
Spanner TOKENIZE_FULLTEXT
fungsi untuk membuat token. Kemudian gunakan
CREATE SEARCH INDEX
Pernyataan DDL untuk menghasilkan indeks penelusuran.
Misalnya, pernyataan DDL CREATE TABLE
berikut menggunakan metode
fungsi TOKENIZE_FULLTEXT
untuk membuat token dari AlbumTitles
di
Tabel Albums
. Pernyataan DDL CREATE SEARCH INDEX
membuat penelusuran
indeks dengan AlbumTitles_Tokens
baru.
CREATE TABLE Albums (
AlbumId STRING(MAX) NOT NULL,
AlbumTitle STRING(MAX),
AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);
CREATE SEARCH INDEX AlbumsIndex ON Albums(AlbumTitle_Tokens)
Proses tokenisasi menggunakan aturan berikut:
- Tokenisasi tidak mencakup stemming atau koreksi dari kata yang salah eja. Misalnya, dalam kalimat seperti "Seorang kucing sedang melihat group of cats", token "cat" diindeks secara terpisah dari token "cats". Dibandingkan dengan mesin telusur lain yang menormalisasi token selama penulisan, Spanner menyediakan opsi untuk memperluas kueri penelusuran ke menggunakan bentuk kata yang berbeda. Untuk informasi selengkapnya, lihat Mode kueri yang ditingkatkan.
- Stopword (seperti "a") disertakan dalam indeks penelusuran.
- Penelusuran teks lengkap selalu tidak peka huruf besar/kecil. Proses tokenisasi akan mengonversi semua token menjadi huruf kecil.
Proses tokenisasi melacak posisi setiap token dalam token teks. Posisi ini kemudian digunakan untuk mencocokkan frasa. Posisi disimpan dalam indeks penelusuran bersama dengan docid.
Google terus meningkatkan kualitas algoritma tokenisasi. Dalam beberapa kasus, ini mungkin menyebabkan string di-tokenkan secara berbeda di masa mendatang dari cara ditokenkan sekarang. Kami memperkirakan kasus semacam ini akan sangat jarang terjadi. Contohnya adalah apakah ada peningkatan dalam bahasa China, Jepang, dan Korea (CJK) segmentasi.
Argumen content_type
menentukan apakah format konten menggunakan data biasa
teks atau HTML. Gunakan setelan berikut untuk menetapkan content_type
:
- Untuk tokenisasi teks, tetapkan argumen
content_type
ke "text/plain
". Setelan ini adalah setelan default. - Untuk tokenisasi HTML, tetapkan argumen
content_type
ke"text/html
". Tanpa argumen ini, tag HTML dianggap sebagai tanda baca. Dalam mode HTML, Spanner menggunakan heuristik untuk menyimpulkan seberapa terlihatnya teks pada halaman. Misalnya, apakah teks ada dalam judul atau ukuran fontnya. Atribut yang didukung untuk HTML meliputismall
,medium
,large
,title
, dan `link'. Seperti posisi, atribut disimpan bersama token kata dalam indeks penelusuran. Tokenisasi tidak membuat token untuk HTML apa pun {i>tag<i}.
Atribut token tidak memengaruhi pencocokan atau hasil SEARCH
atau
fungsi SEARCH_SUBSTRING
. Mereka hanya digunakan untuk
peringkat.
Contoh berikut menunjukkan cara membuat token teks:
CREATE TABLE T (
...
Text STRING(MAX),
Html STRING(MAX),
Text_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(Text, content_type=>"text/plain")) HIDDEN,
Html_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(Html, content_type=>"text/html")) HIDDEN
) PRIMARY KEY(...);
Peningkatan deteksi bahasa dengan argumen language_tag
Tokenisasi mendeteksi bahasa input secara otomatis, secara default. Jika
bahasa input diketahui, argumen language_tag
dapat digunakan untuk
pertajam perilaku ini:
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
Sebagian besar aplikasi membiarkan argumen language_tag
tidak ditentukan dan justru mengandalkan
deteksi bahasa otomatis. Segmentasi untuk bahasa Asia seperti China,
Korea, dan Jepang tidak memerlukan pengaturan bahasa tokenisasi.
Contoh berikut menunjukkan kasus saat language_tag
memengaruhi tokenisasi:
Fungsi tokenisasi | Token yang diproduksi |
---|---|
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que") |
[a, tout, pourquoi, il, ya, un, parce, que] |
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que", \ language_tag=>"fr" ) |
[a, tout, pourquoi, il, y, a, un, parce, que] |
TOKENIZE_FULLTEXT("旅 行") |
Dua token: [旅, 行] |
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") |
Satu token: [旅行] |
Langkah selanjutnya
- Pelajari indeks penelusuran.
- Pelajari indeks numerik.
- Pelajari partisi indeks.