Menggunakan penganalisis teks
Pernyataan DDL
CREATE SEARCH INDEX
,
fungsi SEARCH
, dan
fungsi
TEXT_ANALYZE
mendukung opsi konfigurasi penganalisis teks lanjutan. Dengan memahami penganalisis teks BigQuery dan opsinya, Anda dapat mengoptimalkan pengalaman penelusuran.
Dokumen ini memberikan ringkasan tentang berbagai penganalisis teks yang tersedia di BigQuery dan opsi konfigurasinya, serta contoh cara kerja penganalisis teks dengan penelusuran di BigQuery. Untuk mengetahui informasi selengkapnya tentang sintaksis penganalisis teks, lihat Analisis teks.
Penganalisis teks
BigQuery mendukung penganalisis teks berikut:
NO_OP_ANALYZER
LOG_ANALYZER
PATTERN_ANALYZER
NO_OP_ANALYZER
Gunakan NO_OP_ANALYZER
jika Anda memiliki data yang telah diproses sebelumnya yang ingin dicocokkan
secara persis. Tidak ada tokenisasi atau normalisasi yang diterapkan pada teks. Karena
tidak melakukan tokenisasi atau normalisasi, analyzer ini tidak menerima
konfigurasi. Untuk mengetahui informasi selengkapnya tentang
NO_OP_ANALYZER
, lihat
NO_OP_ANALYZER
.
LOG_ANALYZER
LOG_ANALYZER
mengubah data dengan cara berikut:
- Teks dibuat huruf kecil.
Nilai ASCII yang lebih besar dari 127 akan dipertahankan apa adanya.
Teks dibagi menjadi istilah individual yang disebut token oleh pembatas berikut:
[ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \n \r \s \t %21 %26 %2526 %3B %3b %7C %7c %20 %2B %2b %3D %3d %2520 %5D %5d %5B %5b %3A %3a %0A %0a %2C %2c %28 %29
Jika tidak ingin menggunakan pemisah default, Anda dapat menentukan pembatas yang ingin digunakan sebagai opsi penganalisis teks.
LOG_ANALYZER
memungkinkan Anda mengonfigurasi pemisah dan filter token tertentu untuk kontrol yang lebih besar atas hasil penelusuran. Untuk mengetahui informasi selengkapnya tentang opsi konfigurasi spesifik yang tersedia saat menggunakanLOG_ANALYZER
, lihat opsi penganalisisdelimiters
dan opsi penganalisistoken_filters
.
PATTERN_ANALYZER
Penganalisis teks PATTERN_ANALYZER
mengekstrak token dari teks menggunakan ekspresi
reguler. Mesin ekspresi reguler dan sintaksis yang digunakan dengan PATTERN_ANALYZER
adalah RE2. PATTERN_ANALYZER
membuat token pola dalam urutan berikut:
- Menemukan substring pertama yang cocok dengan pola (dari kiri) dalam string. Ini adalah token yang akan disertakan dalam output.
- Fungsi ini menghapus semuanya dari string input hingga akhir substring yang ditemukan pada langkah 1.
- Mengulangi proses sampai {i>string<i} kosong.
Tabel berikut menyediakan contoh ekstraksi token PATTERN_ANALYZER
:
Pola | Memasukkan teks | Token output |
---|---|---|
ab | Ababab |
|
ab | Abacad |
|
[a-z]{2} | Abacad |
|
aaa | aaaaa |
|
[a-z]/ | a/b/c/d/e |
|
/[^/]+/ | aa/bb/cc |
|
[0-9]+ | abc | |
(?:/?)[a-z] | /abc |
|
(?:/)[a-z] | /abc |
|
(?:[0-9]abc){3}(?:[a-z]000){2} | 7abc7abc7abcx000y000 |
|
".+" | "kucing" dan "" |
Perhatikan bahwa penggunaan pengukur rakus + membuat pencocokan cocok dengan string terpanjang yang mungkin dalam teks, sehingga menyebabkan '"cats" dan "dogs"' diekstrak sebagai token dalam teks. |
".+?" | "kucing" dan "" |
Perhatikan penggunaan pengukur lambat +? membuat ekspresi reguler cocok dengan string terpendek yang mungkin ada dalam teks, sehingga '"cats"', '"dogs"' diekstrak sebagai 2 token terpisah dalam teks. |
Dengan penganalisis teks PATTERN_ANALYZER
, Anda dapat lebih leluasa mengontrol
token yang diekstrak dari teks saat digunakan dengan fungsi
SEARCH
. Tabel berikut menunjukkan bagaimana pola dan hasil yang berbeda menghasilkan hasil SEARCH
yang berbeda:
Pola | Kueri | Text | Token dari teks | SEARCH(teks, kueri) | Penjelasan |
---|---|---|---|---|---|
abc | abcdef | abcghi |
|
TRUE | 'abc' dalam ['abcghi'] |
cd[a-z] | abcdef | abcghi |
|
FALSE | 'cde' dalam ['abcghi'] |
[a-z]/ | a/b/ | a/b/c/d/ |
|
TRUE | 'a/' dalam ['a/', 'b/', 'c/', 'd/'] DAN 'b/' dalam ['a/', 'b/', 'c/', 'd/'] |
/[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
TRUE | '/bb/' dalam ['/bb/'] |
/[^/]+/ | bb | aa/bb/cc/ |
|
ERROR | Tidak ditemukan kecocokan dalam istilah kueri |
[0-9]+ | abc | abc123 | ERROR | Tidak ditemukan kecocokan dalam istilah kueri | |
[0-9]+ | `abc` | abc123 | ERROR | Tidak ditemukan kecocokan dalam istilah kueri Mencocokan {i>backtick<i} sebagai {i>backtick<i}, bukan karakter khusus. |
|
[a-z][a-z0-9]*@google\.com | Ini adalah email saya: test@google.com | test@google.com |
|
TRUE | 'test@google.com' dalam 'test@google.com' |
abc | abc\ abc | abc |
|
TRUE | 'abc' dalam ['abc'] Perhatikan bahwa 'abc abc' adalah satu subkueri(yaitu) setelah diurai oleh parser kueri penelusuran karena spasi di-escape. |
(?i)(?:Abc) (tanpa normalisasi) | aBcd | ABC |
|
FALSE | 'aBc' dalam ['Abc'] |
(?i)(?:Abc) normalisasi: lower_case = true |
aBcd | ABC |
|
TRUE | 'abc' dalam ['abc'] |
(?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' dalam ['/abc'] |
(?:/?)abc | abc | d/abc |
|
FALSE | 'abc' dalam ['/abc'] |
".+" | "kucing" | "kucing" dan "" |
|
FALSE | '"cats"' dalam ['"cats" dan "dogs"] Perhatikan penggunaan greedy quantifiers + membuat ekspresi reguler cocok dengan string terpanjang yang mungkin dalam teks, sehingga '"cats" dan "dogs"' diekstrak sebagai token dalam teks. |
".+?" | "kucing" | "kucing" dan "" |
|
TRUE | '"cats"' in ['"cats"', '"dogs"] Perhatikan penggunaan lazy quantifiers +? membuat ekspresi reguler cocok dengan string terpendek yang mungkin ada dalam teks, sehingga '"cats"', '"dogs"' diekstrak sebagai 2 token terpisah dalam teks. |
Contoh
Contoh berikut menunjukkan penggunaan analisis teks dengan opsi penyesuaian untuk membuat indeks penelusuran, mengekstrak token, dan menampilkan hasil penelusuran.
LOG_ANALYZER
dengan normalisasi ICU NFKC dan kata perhentian.
Contoh berikut mengonfigurasi opsi LOG_ANALYZER
dengan normalisasi
NFKC ICU dan kata perhentian. Contoh ini mengasumsikan tabel data berikut dengan data yang sudah diisi:
CREATE TABLE dataset.data_table( text_data STRING );
Untuk membuat indeks penelusuran dengan normalisasi ICU NFKC dan daftar kata perhentian, buat string berformat JSON dalam opsi analyzer_options
dari pernyataan DDL CREATE
SEARCH INDEX
.
Untuk daftar lengkap opsi yang tersedia saat membuat indeks penelusuran dengan LOG_ANALYZER
, lihat LOG_ANALYZER
.
Untuk contoh ini, kata perhentiannya adalah "the", "of", "and", "for"
.
CREATE OR REPLACE SEARCH INDEX `my_index` ON `dataset.data_table`(ALL COLUMNS) OPTIONS( analyzer='PATTERN_ANALYZER', analyzer_options= '''{ "token_filters": [ { "normalizer": { "mode": "ICU_NORMALIZE", "icu_normalize_mode": "NFKC", "icu_case_folding": true } }, { "stop_words": ["the", "of", "and", "for"] } ] }''');
Dengan contoh sebelumnya, tabel berikut menjelaskan ekstraksi token untuk berbagai nilai text_data
. Perhatikan bahwa dalam dokumen ini, karakter tanda tanya ganda (⁇) dicetak miring untuk membedakan antara dua tanda tanya (??):
Teks Data | Token untuk indeks | Penjelasan |
---|---|---|
Rubah Cokelat Cepat | ["cepat", "cokelat", "rubah"] | Tokenisasi LOG_ANALYZER menghasilkan token ["The", "Quick", "Brown", "Fox"]. Selanjutnya, normalisasi ICU dengan icu_case_folding = true huruf kecil token untuk menghasilkan ["the", "quick", "brown", "fox"]Terakhir, filter kata perhentian menghapus "the" dari daftar. |
Rubah Cokelat Cepat | ["cepat", "cokelat", "rubah"] | Tokenisasi LOG_ANALYZER menghasilkan token ["The", "Quick", "Brown", "Fox"]. Selanjutnya, normalisasi ICU NFKC dengan icu_case_folding = true huruf kecil menjadi token untuk menghasilkan ["the", "quick", "brown", "fox"]Terakhir, filter kata perhentian akan menghapus "the" dari daftar. |
Rubah⁇Cepat | ["cepat??fox"] | Tokenisasi LOG_ANALYZER menghasilkan token ["The", "Quick⁇Fox"]. Selanjutnya, normalisasi ICU NFKC dengan icu_case_folding = true huruf kecil token untuk menghasilkan ["quick??fox"]. Perhatikan bahwa unicode tanda tanya ganda telah dinormalisasi menjadi 2 karakter ASCII tanda tanya.Terakhir, filter kata perhentian tidak melakukan apa pun karena tidak ada token yang ada dalam daftar filter. |
Setelah indeks penelusuran dibuat, Anda dapat menggunakan fungsi
SEARCH
untuk menelusuri
tabel menggunakan konfigurasi analyzer yang sama dengan yang ditetapkan dalam indeks penelusuran. Perhatikan
bahwa jika konfigurasi analyzer dalam fungsi SEARCH
tidak cocok dengan konfigurasi
indeks penelusuran, indeks penelusuran tidak akan digunakan. Gunakan kueri berikut:
SELECT SEARCH( analyzer => 'LOG_ANALYZER', analyzer_options => '''{ "token_filters": [ { "normalizer": { "mode": "ICU_NORMALIZE", "icu_normalize_mode": "NFKC", "icu_case_folding": true } }, { "stop_words": ["the", "of", "and", "for"] } ] }''')
Ganti kode berikut:
search_query
: Teks yang ingin Anda telusuri.
Tabel berikut menunjukkan berbagai hasil berdasarkan teks penelusuran yang berbeda dan nilai search_query
yang berbeda:
text_data | search_query |
Hasil | Penjelasan |
---|---|---|---|
Rubah Cokelat Cepat | "Ⓠuick" |
TRUE |
Daftar akhir token yang diekstrak dari teks adalah ["quick", "brown", "fox"]. Daftar akhir token yang diekstrak dari kueri teks adalah ["quick"]. Semua token kueri daftar dapat ditemukan di token teks. |
Rubah Cokelat Cepat | "quick" |
TRUE |
Daftar akhir token yang diekstrak dari teks adalah ["quick", "brown", "fox"]. Daftar akhir token yang diekstrak dari kueri teks adalah ["quick"]. Semua token kueri daftar dapat ditemukan di token teks. |
Rubah⁇Cepat | "quick" |
FALSE |
Daftar akhir token yang diekstrak dari teks adalah ["quick??fox"]. Daftar akhir token yang diekstrak dari kueri teks adalah ["quick"]. "quick" tidak ada dalam daftar token dari teks. |
Rubah⁇Cepat | "quick⁇fox" |
TRUE |
Daftar akhir token yang diekstrak dari teks adalah ["quick??fox"]. Daftar akhir token yang diekstrak dari kueri teks adalah ["quick??fox"]. "quick??fox" ada dalam daftar token dari teks tersebut. |
Rubah⁇Cepat | "`quick⁇fox`" |
FALSE |
Di LOG_ANALYZER , aksen nontirus memerlukan pencocokan teks yang sama persis. |
PATTERN_ANALYZER
untuk penelusuran IPv4 dengan kata perhentian
Contoh berikut mengonfigurasi penganalisis teks PATTERN_ANALYZER
untuk menelusuri pola tertentu sekaligus memfilter kata perhentian tertentu. Dalam contoh ini, pola cocok dengan alamat IPv4 dan mengabaikan nilai localhost (127.0.0.1
).
Contoh ini mengasumsikan bahwa tabel berikut telah diisi dengan data:
CREATE TABLE dataset.data_table( text_data STRING );
Untuk membuat indeks penelusuran, opsi pattern
dan daftar kata perhentian, buat string berformat JSON di opsi analyzer_options
dari pernyataan DDL CREATE SEARCH
INDEX
.
Untuk daftar lengkap opsi yang tersedia saat membuat indeks penelusuran dengan PATTERN_ANALYZER
, lihat PATTERN_ANALYZER
.
Untuk contoh ini, kata perhentian kita adalah alamat localhost, 127.0.0.1
.
CREATE SEARCH INDEX my_index ON dataset.data_table(text_data) OPTIONS (analyzer = 'PATTERN_ANALYZER', analyzer_options = '''{ "patterns": [ "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" ], "token_filters": [ { "stop_words": [ "127.0.0.1" ] } ] }''' );
Saat menggunakan ekspresi reguler dengan analyzer_options
, sertakan tiga
simbol \
utama untuk meng-escape ekspresi reguler dengan benar yang menyertakan
simbol \
, seperti \d
atau \b
.
Tabel berikut menjelaskan opsi tokenisasi untuk berbagai nilai text_data
Teks Data | Token untuk indeks | Penjelasan |
---|---|---|
abc192.168.1.1def 172.217.20.142 | ["192.168.1.1", "172.217.20.142"] | Pola IPv4 ini menangkap alamat IPv4 bahkan jika tidak ada ruang antara alamat dan teks. |
104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | “127.0.0.1” disaring karena ada dalam daftar kata-kata perhentian. |
Setelah indeks penelusuran dibuat, Anda dapat menggunakan fungsi SEARCH
untuk menelusuri tabel berdasarkan tokenisasi yang ditentukan di analyzer_options
. Gunakan
kueri berikut:
SELECT
SEARCH(dataset.data_table.text_data
"search_data",
analyzer => 'PATTERN_ANALYZER',
analyzer_options => '''{
"patterns": [
"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)[.]){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
],
"token_filters": [
{
"stop_words": [
"127.0.0.1"
]
}
]
}'''
);
Ganti kode berikut:
search_query
: Teks yang ingin Anda telusuri.
Tabel berikut menunjukkan berbagai hasil berdasarkan teks penelusuran yang berbeda dan nilai search_query
yang berbeda:
text_data | search_query |
Hasil | Penjelasan |
---|---|---|---|
128.0.0.2 | "127.0.0.1" | ERROR | Tidak ada token penelusuran dalam kueri. Kueri melewati penganalisis teks, yang memfilter token "127.0.0.1". |
abc192.168.1.1def 172.217.20.142 | "192.168.1.1abc" | TRUE | Daftar token yang diekstrak dari kueri adalah ["192.168.1.1"]. Daftar token yang diekstrak dari teks adalah ["192.168.1.1", "172.217.20.142"]. |
abc192.168.1.1def 172.217.20.142 | "`192.168.1.1`" | TRUE | Daftar token yang diekstrak dari kueri adalah ["192.168.1.1"]. Daftar token yang diekstrak dari teks adalah ["192.168.1.1", "172.217.20.142"]. Perhatikan bahwa tanda kutip terbalik diperlakukan sebagai karakter reguler untuk pattern_ANALYZER. |
Langkah selanjutnya
- Untuk mengetahui ringkasan kasus penggunaan, harga, izin yang diperlukan, dan batasan indeks penelusuran, lihat Pengantar penelusuran di BigQuery.
- Untuk mengetahui informasi tentang penelusuran kolom yang diindeks secara efisien, lihat Menelusuri dengan indeks.