Bekerja dengan penganalisis teks

Pernyataan DDL CREATE SEARCH INDEX, fungsi SEARCH, dan fungsi TEXT_ANALYZE mendukung opsi konfigurasi penganalisis teks lanjutan. Memahami penganalisis teks BigQuery dan opsinya memungkinkan Anda menyempurnakan 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 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 dibuat menjadi huruf kecil.
  • Nilai ASCII yang lebih besar dari 127 tetap seperti 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 pembatas default, Anda dapat menentukan pembatas yang ingin digunakan sebagai opsi penganalisis teks. LOG_ANALYZER memungkinkan Anda mengonfigurasi pembatas dan filter token tertentu untuk mendapatkan kontrol yang lebih besar atas hasil penelusuran. Untuk mengetahui informasi selengkapnya tentang opsi konfigurasi spesifik yang tersedia saat menggunakan LOG_ANALYZER, lihat opsi penganalisis delimiters dan opsi penganalisis token_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 membuat token pola dalam urutan berikut:

  1. Fungsi ini menemukan substring pertama yang cocok dengan pola (dari kiri) dalam string. Ini adalah token yang akan disertakan dalam output.
  2. Fungsi ini menghapus semua karakter dari string input hingga akhir substring yang ditemukan pada langkah 1.
  3. Proses ini diulang hingga string kosong.

Tabel berikut memberikan contoh ekstraksi token PATTERN_ANALYZER:

Pola Memasukkan teks Token output
ab ababab
  • ab
ab abacad
  • ab
[a-z]{2} abacad
  • ab
  • ac
  • iklan
aaa aaaaa
  • aaa
[a-z]/ a/b/c/d/e
  • a/
  • b/
  • c/
  • d/
/[^/]+/ aa/bb/cc
  • /bb/
[0-9]+ abc
(?:/?)[a-z] /abc
  • /abc
(?:/)[a-z] /abc
  • /abc
(?:[0-9]abc){3}(?:[a-z]000){2} 7abc7abc7abcx000y000
  • 7abc7abc7abcx000y000
".+" "cats" dan "dogs"
  • "cats" dan "dogs"


Perhatikan bahwa penggunaan pengukur serakah + membuat kecocokan mencocokkan string terpanjang yang mungkin dalam teks, sehingga '"cats" dan "dogs"' diekstrak sebagai token dalam teks.
".+?" "cats" dan "dogs"
  • "cats"
  • ""


Perhatikan penggunaan pengukur malas +? membuat ekspresi reguler mencocokkan string terpendek yang mungkin dalam teks, sehingga '"cats"', '"dogs"' diekstrak sebagai 2 token terpisah dalam teks.

Dengan menggunakan penganalisis teks PATTERN_ANALYZER, Anda akan 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
  • abcghi
TRUE 'abc' in ['abcghi']
cd[a-z] abcdef abcghi
  • abcghi
FALSE 'cde' in ['abcghi']
[a-z]/ a/b/ a/b/c/d/
  • a/
  • b/
  • c/
  • d/
TRUE 'a/' in ['a/', 'b/', 'c/', 'd/'] AND 'b/' in ['a/', 'b/', 'c/', 'd/']
/[^/]+/ aa/bb/ aa/bb/cc/
  • /bb/
TRUE '/bb/' dalam ['/bb/']
/[^/]+/ bb aa/bb/cc/
  • /bb/
ERROR Tidak ada kecocokan dalam istilah kueri
[0-9]+ abc abc123 ERROR Tidak ada kecocokan dalam istilah kueri
[0-9]+ `abc` abc123 ERROR Tidak ada kecocokan yang ditemukan dalam istilah kueri

Mencocokkan tanda petik terbalik sebagai tanda petik terbalik, bukan karakter khusus.
[a-z][a-z0-9]*@google\.com Ini email saya: test@google.com test@google.com
  • test@google.com
TRUE 'test@google.com' di 'test@google.com'
abc abc\ abc abc
  • abc
TRUE 'abc' in ['abc']

Perhatikan bahwa 'abc abc' adalah satu subkueri(yaitu) setelah diuraikan oleh parser kueri penelusuran karena spasi di-escape.
(?i)(?:Abc) (tanpa normalisasi) aBcd Abc
  • Abc
FALSE 'aBc' in ['Abc']
(?i)(?:Abc)

normalisasi:
lower_case = true
aBcd Abc
  • abc
TRUE 'abc' in ['abc']
(?:/?)abc bc/abc /abc/abc/
  • /abc
TRUE '/abc' in ['/abc']
(?:/?)abc abc d/abc
  • /abc
FALSE 'abc' in ['/abc']
".+" "cats" (kucing) "cats" dan "dogs"
  • "cats" dan "dogs"
FALSE '"cats"' dalam ['"cats" and "dogs"]

Perhatikan penggunaan pengukur serakah + membuat ekspresi reguler mencocokkan string terpanjang yang mungkin dalam teks, sehingga '"cats" and "dogs"' diekstrak sebagai token dalam teks.
".+?" "cats" (kucing) "cats" dan "dogs"
  • "cats"
  • ""
TRUE '"cats"' in ['"cats"', '"dogs"]

Perhatikan penggunaan pengukur lambat +? membuat ekspresi reguler mencocokkan string terpendek yang 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 ICU NFKC dan kata-kata penghenti

Contoh berikut mengonfigurasi opsi LOG_ANALYZER dengan normalisasi NFKC ICU dan kata henti. 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 kata berhenti, 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-kata penghentian kami 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 huruf kecil token untuk menghasilkan ["the", "quick", "brown", "fox"]

Terakhir, filter kata henti menghapus "the" dari daftar.
Ⓠ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 huruf kecil token untuk menghasilkan ["the", "quick", "brown", "fox"]

Terakhir, filter kata henti 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 huruf kecil token untuk menghasilkan ["quick??fox"]. Perhatikan bahwa unicode tanda tanya ganda telah dinormalisasi menjadi 2 karakter ASCII tanda tanya.

Terakhir, filter kata umum 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 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 cari.

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 ["cepat"].

Semua token kueri daftar dapat ditemukan dalam token teks.
Ⓠuick Ⓑrown Ⓕox "quick" TRUE Daftar akhir token yang diekstrak dari teks adalah ["cepat", "cokelat", "rubah"].
Daftar akhir token yang diekstrak dari kueri teks adalah ["cepat"].

Semua token kueri daftar 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 ["cepat"].

"cepat" tidak ada dalam daftar token dari teks.
ⓆuickⒻox "quickfox" 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 "`quickfox`" FALSE Di LOG_ANALYZER, tanda kutip terbalik memerlukan kecocokan teks yang persis.

PATTERN_ANALYZER untuk penelusuran IPv4 dengan kata henti

Contoh berikut mengonfigurasi penganalisis teks PATTERN_ANALYZER untuk menelusuri pola tertentu sambil memfilter kata henti 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 kata berhenti, buat string berformat JSON di opsi analyzer_options 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-kata berhenti 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 memisahkan 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 kata henti.

Setelah indeks penelusuran dibuat, Anda dapat menggunakan fungsi SEARCH untuk menelusuri tabel berdasarkan tokenisasi yang ditentukan dalam 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 cari.

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 akan melalui 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 petik terbalik diperlakukan sebagai karakter biasa untuk PATTERN_ANALYZER.

Langkah berikutnya