Menggunakan penganalisis teks
Mengonfigurasi penganalisis teks lanjutan di BigQuery memungkinkan Anda meningkatkan
pengalaman penelusuran dengan mengontrol secara tepat cara data string ditokenisasi.
Menerapkan konfigurasi kustom ke indeks penelusuran, seperti pola ekspresi reguler dan filter stop word, memungkinkan Anda menentukan dengan tepat cara fungsi mengevaluasi dan mencocokkan teks. Anda dapat mengonfigurasi penganalisis teks lanjutan untuk pernyataan DDL CREATE SEARCH INDEX, fungsi SEARCH, dan fungsi TEXT_ANALYZE.
Penganalisis teks
BigQuery mendukung penganalisis teks berikut:
NO_OP_ANALYZERLOG_ANALYZERPATTERN_ANALYZER
NO_OP_ANALYZER
Gunakan NO_OP_ANALYZER jika Anda telah melakukan pra-pemrosesan data yang ingin dicocokkan persis. Tidak ada tokenisasi atau normalisasi yang diterapkan pada teks. Karena
penganalisis ini tidak melakukan tokenisasi atau normalisasi, penganalisis 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 diubah menjadi huruf kecil.
Nilai ASCII yang lebih besar dari 127 akan dipertahankan sebagaimana 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 %29Jika tidak ingin menggunakan pemisah default, Anda dapat menentukan pemisah yang ingin digunakan sebagai opsi penganalisis teks.
LOG_ANALYZERmemungkinkan Anda mengonfigurasi pembatas dan filter token tertentu untuk kontrol yang lebih besar atas hasil penelusuran Anda. Untuk mengetahui informasi selengkapnya tentang opsi konfigurasi spesifik yang tersedia saat menggunakanLOG_ANALYZER, lihat opsi penganalisisdelimitersdan opsi penganalisistoken_filters.
PATTERN_ANALYZER
Penganalisis teks PATTERN_ANALYZER mengekstrak token dari teks menggunakan ekspresi reguler. Mesin dan sintaksis ekspresi reguler yang digunakan dengan
PATTERN_ANALYZER adalah RE2. PATTERN_ANALYZER
melakukan tokenisasi pola dalam urutan berikut:
- Fungsi ini menemukan substring pertama yang cocok dengan pola (dari kiri) dalam string. Ini adalah token yang akan disertakan dalam output.
- Fungsi ini menghapus semua karakter dari string input hingga akhir substring yang ditemukan di langkah 1.
- Proses ini diulang hingga string kosong.
Tabel berikut memberikan 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 |
|
| ".+" | "cats" dan "dogs" |
Perhatikan bahwa penggunaan greedy quantifier + membuat pencocokan mencocokkan string terpanjang yang mungkin ada dalam teks, sehingga '"cats" and "dogs"' diekstrak sebagai token dalam teks. |
| ".+?" | "cats" dan "dogs" |
Perhatikan bahwa 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. |
Dengan menggunakan penganalisis teks PATTERN_ANALYZER, Anda memiliki kontrol lebih besar atas
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 | Teks | Token dari teks | SEARCH(text, query) | Penjelasan |
|---|---|---|---|---|---|
| abc | abcdef | abcghi |
|
TRUE | 'abc' in ['abcghi'] |
| cd[a-z] | abcdef | abcghi |
|
FALSE | 'cde' in ['abcghi'] |
| [a-z]/ | a/b/ | a/b/c/d/ |
|
TRUE | 'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/'] |
| /[^/]+/ | aa/bb/ | aa/bb/cc/ |
|
TRUE | '/bb/' di ['/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 Mencocokkan backtick sebagai backtick, bukan karakter khusus. |
|
| [a-z][a-z0-9]*@google\.com | Ini email saya: test@google.com | test@google.com |
|
TRUE | 'test@google.com' in 'test@google.com' |
| abc | abc\ abc | abc |
|
TRUE | 'abc' in ['abc'] Perhatikan bahwa 'abc abc' adalah subkueri tunggal (yaitu) setelah diurai oleh parser kueri penelusuran karena spasi di-escape. |
| (?i)(?:Abc) (tanpa normalisasi) | aBcd | Abc |
|
FALSE | 'aBc' in ['Abc'] |
| (?i)(?:Abc) normalization: lower_case = true |
aBcd | Abc |
|
TRUE | 'abc' in ['abc'] |
| (?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' in ['/abc'] |
| (?:/?)abc | abc | d/abc |
|
FALSE | 'abc' in ['/abc'] |
| ".+" | "cats" | "cats" dan "dogs" |
|
FALSE | '"cats"' di ['"cats" and "dogs"] Perhatikan bahwa penggunaan greedy quantifier + membuat ekspresi reguler cocok dengan string terpanjang yang mungkin ada dalam teks, sehingga '"cats" and "dogs"' diekstrak sebagai token dalam teks. |
| ".+?" | "cats" | "cats" dan "dogs" |
|
TRUE | '"cats"' in ['"cats"', '"dogs"] Perhatikan bahwa penggunaan lazy quantifier +? membuat ekspresi reguler cocok dengan string sesingkat mungkin 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 NFKC ICU dan stop word
Contoh berikut mengonfigurasi opsi LOG_ANALYZER dengan normalisasi NFKC ICU dan stop word. 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 NFKC ICU dan daftar stop word,
buat string berformat JSON di opsi analyzer_options dari pernyataan DDL
CREATE
SEARCH INDEX.
Untuk mengetahui daftar lengkap opsi yang tersedia saat membuat indeks penelusuran dengan
LOG_ANALYZER, lihat
LOG_ANALYZER.
Untuk contoh ini, stop word kita 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"] } ] }''');
Berdasarkan contoh sebelumnya, tabel berikut menjelaskan ekstraksi token
untuk berbagai nilai text_data. Perhatikan bahwa dalam dokumen ini, karakter tanda tanya ganda (⁇) telah dicetak miring untuk membedakan antara dua tanda tanya (??):
| Teks Data | Token untuk indeks | Penjelasan |
|---|---|---|
| The Quick Brown Fox | ["quick", "brown", "fox"] | Tokenisasi LOG_ANALYZER menghasilkan token ["The", "Quick", "Brown", "Fox"]. Selanjutnya, normalisasi ICU dengan icu_case_folding = true mengubah token menjadi huruf kecil untuk menghasilkan ["the", "quick", "brown", "fox"]Terakhir, filter stop word menghapus "the" dari daftar. |
| The Ⓠuick Ⓑrown Ⓕox | ["quick", "brown", "fox"] | Tokenisasi LOG_ANALYZER menghasilkan token ["The", "Ⓠuick", "Ⓑrown", "Ⓕox"]. Selanjutnya, normalisasi NFKC ICU dengan icu_case_folding = true mengubah token menjadi huruf kecil untuk menghasilkan ["the", "quick", "brown", "fox"]Terakhir, filter stop word menghapus "the" dari daftar. |
| Ⓠuick⁇Ⓕox | ["quick??fox"] | Tokenisasi LOG_ANALYZER menghasilkan token ["The", "Ⓠuick⁇Ⓕox"]. Selanjutnya, normalisasi NFKC ICU dengan icu_case_folding = true mengubah token menjadi huruf kecil untuk menghasilkan ["quick??fox"]. Perhatikan bahwa unicode tanda tanya ganda telah dinormalisasi menjadi 2 karakter ASCII tanda tanya.Terakhir, filter stop word 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 penganalisis yang sama dengan yang ditentukan dalam indeks penelusuran. Perhatikan
bahwa jika konfigurasi penganalisis 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 |
|---|---|---|---|
| The Quick Brown Fox | "Ⓠuick" |
TRUE |
Daftar akhir token yang diekstrak
dari teks adalah ["quick", "brown", "fox"]. Daftar akhir token yang diekstrak dari kueri teks adalah ["quick"]. Token kueri daftar semuanya dapat ditemukan dalam token teks. |
| The Ⓠuick Ⓑrown Ⓕox | "quick" |
TRUE |
Daftar akhir token yang diekstrak dari teks adalah ["quick", "brown", "fox"]. Daftar akhir token yang diekstrak dari kueri teks adalah ["quick"]. Token kueri daftar semuanya dapat ditemukan dalam token teks. |
| Ⓠuick⁇Ⓕox | "quick" |
FALSE |
Daftar akhir token yang diekstrak dari teks adalah ["quick??fox"]. Daftar akhir token yang diekstrak dari kueri teks adalah ["quick"]. "cepat" tidak ada dalam daftar token dari teks. |
| Ⓠuick⁇Ⓕox | "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. |
| Ⓠuick⁇Ⓕox | "`quick⁇fox`" |
FALSE |
Di LOG_ANALYZER, tanda kutip terbalik memerlukan pencocokan teks yang sama persis. |
PATTERN_ANALYZER untuk penelusuran IPv4 dengan stop word
Contoh berikut mengonfigurasi penganalisis teks PATTERN_ANALYZER untuk menelusuri pola tertentu sambil memfilter stop word tertentu. Dalam contoh ini, pola cocok dengan alamat IPv4 dan mengabaikan nilai localhost (127.0.0.1).
Contoh ini mengasumsikan bahwa tabel berikut diisi dengan data:
CREATE TABLE dataset.data_table( text_data STRING );
Untuk membuat indeks penelusuran, opsi pattern, dan daftar stop word, buat string berformat JSON di opsi analyzer_options dari pernyataan DDL CREATE SEARCH
INDEX.
Untuk mengetahui daftar lengkap opsi yang tersedia saat membuat indeks penelusuran dengan
PATTERN_ANALYZER, lihat
PATTERN_ANALYZER.
Untuk contoh ini, stop word 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 \ di awal untuk meng-escape ekspresi reguler yang menyertakan simbol \ dengan benar, 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 menangkap alamat IPv4 meskipun tidak ada spasi antara alamat dan teks. |
| 104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | "127.0.0.1" difilter karena ada dalam daftar stop word. |
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 biasa untuk PATTERN_ANALYZER. |
Langkah berikutnya
- 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.