Halaman ini menjelaskan cara menambahkan tokenisasi ke tabel. Tokenisasi diperlukan untuk membuat token yang digunakan dalam indeks penelusuran.
Tokenisasi adalah proses mengubah nilai menjadi token. Metode yang Anda gunakan untuk membuat token dokumen menentukan jenis dan efisiensi penelusuran yang dapat dilakukan pengguna di dalamnya.
Spanner menyediakan tokenizer untuk teks bahasa alami, substring, teks verbatim, angka, dan boolean. Skema database menggunakan tokenizer yang cocok dengan jenis penelusuran yang diperlukan untuk kolom. Pembuat token memiliki karakteristik berikut:
- Setiap tokenizer adalah fungsi SQL yang mendapatkan input, seperti string atau angka, dan argumen bernama untuk opsi tambahan.
- Pembuat token menghasilkan
TOKENLIST
.
Misalnya, string teks The quick brown fox jumps over the lazy dog
ditokenisasi menjadi [the,quick,brown,fox,jumps,over,the,lazy,dog]
.
String HTML The <b>apple</b> is <i>red</i>
dibuat token 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 kumpulan atribut terkait opsional. Misalnya, dalam aplikasi teks lengkap, token biasanya berupa satu kata dari dokumen tekstual.
- Saat membuat token nilai HTML, Spanner menghasilkan atribut yang menunjukkan keterlihatan token dalam dokumen. Spanner menggunakan atribut ini untuk penskoran guna meningkatkan istilah yang lebih penting (seperti judul).
Tokenizer
Spanner mendukung fungsi pemisah kata berikut:
Tokenizer teks lengkap (
TOKENIZE_FULLTEXT
) menghasilkan token kata lengkap untuk kueri bahasa alami.Contoh
Kedua fungsi berikut
TOKENIZE_FULLTEXT("Yellow apple") TOKENIZE_FULLTEXT("Yellow <b>apple</b>", content_type=>"text/html")
menghasilkan token yang sama:
[yellow,apple]
.Pembuat token substring (
TOKENIZE_SUBSTRING
) membuat token untuk setiap n-gram dari setiap kata. Fungsi ini digunakan untuk menemukan substring kata dalam teks.Contoh
TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
Menghasilkan token berikut:
[ello,hell,hello,orld,worl,world]
.Pemisah n-gram (
TOKENIZE_NGRAMS
) menghasilkan n-gram dari input (tanpa membaginya menjadi kata terpisah). 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 menelusuri 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]
.Pembuat token angka (
TOKENIZE_NUMBER
) digunakan untuk membuat kumpulan token yang mempercepat penelusuran perbandingan numerik. Untuk kondisi persamaan, token adalah angka itu sendiri. Untuk kondisi rentang (sepertirating >= 3.5
), kumpulan token lebih rumit.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. Kolom
ini ditentukan sebagai HIDDEN
sehingga tidak disertakan dalam hasil kueri
SELECT *
.
Contoh berikut menggunakan tokenizer teks lengkap dan tokenizer numerik untuk membuat database yang menyimpan nama dan rating album musik. Pernyataan DDL melakukan dua hal:
- Menentukan kolom data
AlbumTitle
danRating
. Menentukan
AlbumTitle_Tokens
danAlbumRating_Tokens
. KolomTOKENLIST
ini melakukan tokenisasi 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 otomatis diperbarui.
Membuat token teks biasa atau konten HTML
Tokenisasi teks mendukung jenis konten teks biasa dan HTML. Gunakan fungsi TOKENIZE_FULLTEXT
Spanner untuk membuat token. Kemudian, gunakan pernyataan DDL CREATE SEARCH INDEX
untuk membuat indeks penelusuran.
Misalnya, pernyataan DDL CREATE TABLE
berikut menggunakan fungsi TOKENIZE_FULLTEXT
untuk membuat token dari AlbumTitles
di tabel Albums
. Pernyataan DDL CREATE SEARCH INDEX
membuat indeks penelusuran 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 pembuatan token menggunakan aturan berikut:
- Tokenisasi tidak mencakup stemming atau koreksi kata yang salah eja. Misalnya, dalam kalimat seperti "Seekor kucing sedang melihat sekelompok kucing", token "kucing" diindeks secara terpisah dari token "kucing". Dibandingkan dengan mesin telusur lain yang melakukan normalisasi token selama penulisan, Spanner menyediakan opsi untuk memperluas kueri penelusuran agar menyertakan berbagai bentuk kata. Untuk mengetahui informasi selengkapnya, lihat Mode kueri yang ditingkatkan.
- Kata penghenti (seperti "a") disertakan dalam indeks penelusuran.
- Penelusuran teks lengkap selalu tidak peka huruf besar/kecil. Proses tokenisasi mengonversi semua token menjadi huruf kecil.
Proses tokenisasi melacak posisi untuk setiap token dalam teks asli. Posisi ini nantinya digunakan untuk mencocokkan frasa. Posisi disimpan di indeks penelusuran bersama dengan docid.
Google terus meningkatkan algoritma tokenisasi. Dalam beberapa kasus, hal ini dapat menyebabkan string ditokenisasi secara berbeda pada masa mendatang dari cara ditokenisasi sekarang. Kami memperkirakan kasus seperti ini sangat jarang terjadi. Contohnya adalah jika ada peningkatan dalam segmentasi bahasa Cina, Jepang, dan Korea (CJK).
Argumen content_type
menentukan apakah format konten menggunakan teks biasa
atau HTML. Gunakan setelan berikut untuk menetapkan content_type
:
- Untuk tokenisasi teks, tetapkan argumen
content_type
ke "text/plain
". Ini adalah setelan default. - Untuk tokenisasi HTML, tetapkan argumen
content_type
ke"text/html
". Tanpa argumen ini, tag HTML akan diperlakukan sebagai tanda baca. Dalam mode HTML, Spanner menggunakan heuristik untuk menyimpulkan seberapa jelas teks di halaman. Misalnya, apakah teks berada dalam judul atau ukuran fontnya. Atribut yang didukung untuk HTML mencakupsmall
,medium
,large
,title
, dan `link'. Seperti posisi, atribut disimpan bersama token dalam indeks penelusuran. Tokenisasi tidak membuat token untuk tag HTML apa pun.
Atribut token tidak memengaruhi pencocokan atau hasil fungsi SEARCH
atau
SEARCH_SUBSTRING
. Kolom ini 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
meningkatkan perilaku ini:
AlbumTitle_Tokens TOKENLIST
AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN
Sebagian besar aplikasi membiarkan argumen language_tag
tidak ditentukan dan sebagai gantinya mengandalkan
deteksi bahasa otomatis. Segmentasi untuk bahasa Asia seperti China,
Korea, dan Jepang tidak memerlukan setelan bahasa tokenisasi.
Contoh berikut menunjukkan kasus saat language_tag
memengaruhi tokenisasi:
Fungsi tokenisasi | Token yang dihasilkan |
---|---|
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.