使用文字分析器
CREATE SEARCH INDEX
DDL 陳述式、SEARCH
函式和 TEXT_ANALYZE
函式 支援進階文字分析器設定選項。瞭解 BigQuery 的文字分析器及其選項,有助您改善搜尋體驗。
本文件將概略說明 BigQuery 提供的各種文字分析器及其設定選項,並提供文字分析器如何與 BigQuery 中的搜尋搭配運作。如要進一步瞭解文字分析器語法,請參閱「文字分析」。
文字分析器
BigQuery 支援下列文字分析器:
NO_OP_ANALYZER
LOG_ANALYZER
PATTERN_ANALYZER
NO_OP_ANALYZER
如果您有預先處理過的資料,且想精確比對,請使用 NO_OP_ANALYZER
。系統不會對文字進行符號化或標準化處理。由於這個分析器不會執行符記化或標準化,因此不接受任何設定。如要進一步瞭解 NO_OP_ANALYZER
,請參閱 NO_OP_ANALYZER
。
LOG_ANALYZER
LOG_ANALYZER
會以以下方式修改資料:
- 文字會轉為小寫。
大於 127 的 ASCII 值會維持原樣。
文字會以下列分隔符分割為個別字詞,稱為「詞元」:
[ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \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
如果您不想使用預設分隔符,可以指定要用於文字分析器選項的分隔符。
LOG_ANALYZER
可讓您設定特定分隔符和符號篩選器,進一步控管搜尋結果。如要進一步瞭解使用LOG_ANALYZER
時可用的特定設定選項,請參閱「delimiters
分析器選項」和「token_filters
分析器選項」。
PATTERN_ANALYZER
PATTERN_ANALYZER
文字分析器會使用規則運算式從文字中擷取符記。PATTERN_ANALYZER
使用的規則運算式引擎和語法為 RE2。PATTERN_ANALYZER
會按照以下順序將模式切割成符號:
- 會在字串中找出與模式相符的第一個子字串 (從左側開始)。這是要納入輸出內容的符記。
- 它會移除輸入字串中的所有內容,直到找到步驟 1 中的子字串為止。
- 這個程序會重複執行,直到字串為空為止。
下表列出 PATTERN_ANALYZER
符記擷取的範例:
模式 | 輸入文字 | 輸出內容詞元 |
---|---|---|
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」和「dogs」 |
請注意,使用貪婪量詞 + 會讓系統比對文字中可能最長的字串,導致「cats」和「dogs」會在文字中擷取為符記。 |
「.+?」 | 「cats」和「dogs」 |
請注意,使用惰性量詞 +? 會讓正規表示式與文字中可能最短的字串相符,導致「cats」和「dogs」會在文字中分別擷取為 2 個不同的符記。 |
使用 PATTERN_ANALYZER
文字分析器,您就能在搭配 SEARCH
函式 使用時,進一步控管從文字擷取的符記。下表顯示不同模式和結果如何產生不同的 SEARCH
結果:
模式 | 查詢 | 文字 | 文字中的符記 | SEARCH(text, query) | 說明 |
---|---|---|---|---|---|
abc | abcdef | abcghi |
|
TRUE | ['abcghi'] 中的「'abc'」 |
cd[a-z] | abcdef | abcghi |
|
FALSE | ['abcghi'] 中的「cde」 |
[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/'] 中的 '/bb/' |
/[^/]+/ | bb | aa/bb/cc/ |
|
錯誤 | 查詢字詞中找不到相符項目 |
[0-9]+ | abc | abc123 | 錯誤 | 查詢字詞中找不到相符項目 | |
[0-9]+ | `abc` | abc123 | 錯誤 | 查詢字詞中找不到相符的項目 將反斜線視為反斜線,而非特殊字元。 |
|
[a-z][a-z0-9]*@google\.com | 我的電子郵件地址:test@google.com | test@google.com |
|
TRUE | 'test@google.com' 中的 'test@google.com' |
abc | abc\ abc | abc |
|
TRUE | 在 ['abc']中使用 'abc' 請注意,由於空格已遭轉義,因此在搜尋查詢剖析器剖析後,'abc abc' 就會成為單一子查詢(ie)。 |
(?i)(?:Abc) (不正規化) | aBcd | Abc |
|
FALSE | ['Abc'] 中的'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'] 中的「abc」 |
「.+」 | 「cats」 | 「cats」和「dogs」 |
|
FALSE | 在 ['"cats" 和 "dogs"]中使用 '"cats"' 請注意,使用貪婪量詞 + 會讓規則運算式與文字中可能最長的字串比對,導致系統將「cats」和「dogs」擷取為文字中的符記。 |
「.+?」 | 「cats」 | 「cats」和「dogs」 |
|
TRUE | '"cats"' in ['"cats"', '"dogs"] 請注意,使用惰性量詞 +? 會讓規則運算式比對文字中可能最短的字串,導致 '"cats"'、'"dogs"' 會在文字中擷取為 2 個個別的符記。 |
範例
以下範例說明如何使用文字分析和自訂選項,建立搜尋索引、擷取符記,並傳回搜尋結果。
LOG_ANALYZER
搭配 NFKC ICU 正規化和停用字
以下範例會使用 NFKC ICU 規範和停用字詞,設定 LOG_ANALYZER
選項。這個範例假設已填入資料的資料表如下:
CREATE TABLE dataset.data_table( text_data STRING );
如要使用 NFKC ICU 規範化和停用字詞清單建立搜尋索引,請在 CREATE
SEARCH INDEX
DDL 陳述式的 analyzer_options
選項中建立 JSON 格式的字串。如需使用 LOG_ANALYZER
建立搜尋索引時可用的完整選項清單,請參閱 LOG_ANALYZER
。在本例中,停用字詞為 "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"] } ] }''');
以上述範例為例,下表說明 text_data
的各種值的符記擷取方式。請注意,本文件中的雙問號字元 (⁇) 已以斜體顯示,以便區分兩個問號 (??):
資料文字 | 索引符記 | 說明 |
---|---|---|
The Quick Brown Fox | ["quick", "brown", "fox"] | LOG_ANALYZER 權杖化會產生權杖 [「The」, 「Quick」, 「Brown」, 「Fox」]。 接著,ICU 會使用 icu_case_folding = true 將符號轉換為小寫,產生 ["the", "quick", "brown", "fox"]最後,停用字詞篩選器會從清單中移除「the」。 |
Ⓠ快速 Ⓑ瀏覽 Ⓕ盒 | ["quick", "brown", "fox"] | LOG_ANALYZER 符記產生符記 ["The", "Ⓠuick", "Ⓑrown", "Ⓕox"]。 接著,使用 icu_case_folding = true 將符號轉為小寫的 NFKC ICU 規範化程序,產生 ["the", "quick", "brown", "fox"]最後,停用字詞篩選器會從清單中移除「the」。 |
Ⓠuick⁇Ⓕox | ["quick??fox"] | LOG_ANALYZER 符記產生符記 [「The」,「Ⓠuick⁇Ⓕox」]。 接著,使用 icu_case_folding = true 將符號轉為小寫的 NFKC ICU 正規化功能,產生 ["quick??fox"]。請注意,雙問號的 Unicode 已規格化為 2 個問號 ASCII 字元。最後,由於篩選器清單中沒有任何符記,因此停用字詞篩選器不會執行任何操作。 |
搜尋索引已建立完成,您可以使用 SEARCH
函式,以搜尋索引中指定的相同分析器設定搜尋資料表。請注意,如果 SEARCH
函式中的分析器設定與搜尋索引的設定不符,系統就不會使用搜尋索引。請使用下列查詢:
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"] } ] }''')
更改下列內容:
search_query
:要搜尋的文字。
下表列出不同搜尋字詞和 search_query
的不同值,以及對應的結果:
text_data | search_query |
結果 | 說明 |
---|---|---|---|
The Quick Brown Fox | "Ⓠuick" |
TRUE |
從文字中擷取的符記最終清單為 ["quick", "brown", "fox"]。 從文字查詢中擷取的最終符記清單為 ["quick"]。 清單查詢權杖可在文字權杖中找到。 |
Ⓠ快速 Ⓑ瀏覽 Ⓕ盒 | "quick" |
TRUE |
從文字中擷取的符記最終清單為 ["quick", "brown", "fox"]。 從文字查詢中擷取的最終符記清單為 ["quick"]。 清單查詢權杖可在文字權杖中找到。 |
Ⓠuick⁇Ⓕox | "quick" |
FALSE |
從文字中擷取的符記最終清單為 ["quick??fox"]。 從文字查詢中擷取的最終符記清單為 ["quick"]。 「quick」不在文字的符記清單中。 |
Ⓠuick⁇Ⓕox | "quick⁇fox" |
TRUE |
從文字中擷取的符記最終清單為 ["quick??fox"]。 從文字查詢中擷取的最終符記清單為 ["quick??fox"]。 「quick??fox」是文字中的符記清單。 |
Ⓠuick⁇Ⓕox | "`quick⁇fox`" |
FALSE |
在 LOG_ANALYZER 中,反引號需要與文字完全相符。 |
PATTERN_ANALYZER
:針對含有停用字的 IPv4 搜尋
以下範例會設定 PATTERN_ANALYZER
文字分析器,以便搜尋特定模式,同時篩除特定停用字詞。在這個範例中,模式會比對 IPv4 位址,並忽略 localhost 值 (127.0.0.1
)。
本範例假設下表已填入資料:
CREATE TABLE dataset.data_table( text_data STRING );
如要建立搜尋索引擎索引、pattern
選項和停用字詞清單,請在 CREATE SEARCH
INDEX
DDL 陳述式的 analyzer_options
選項中建立 JSON 格式的字串。如需使用 PATTERN_ANALYZER
建立搜尋索引時可用的完整選項清單,請參閱 PATTERN_ANALYZER
。在本例中,停用字詞是本機位址 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" ] } ] }''' );
使用含有 analyzer_options
的規則運算式時,請在開頭加上三個 \
符號,以便正確轉義含有 \
符號的規則運算式,例如 \d
或 \b
。
下表說明 text_data
的各種值的符記化選項。
資料文字 | 索引符記 | 說明 |
---|---|---|
abc192.168.1.1def 172.217.20.142 | ["192.168.1.1", "172.217.20.142"] | 即使位址和文字之間沒有空格,IPv4 模式也會擷取 IPv4 位址。 |
104.24.12.10abc 127.0.0.1 | ["104.24.12.10"] | 「127.0.0.1」會遭到篩除,因為它在停用字詞清單中。 |
搜尋索引已建立完成,您可以使用 SEARCH
函式,根據 analyzer_options
中指定的權杖化搜尋資料表。使用下列查詢:
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" ] } ] }''' );
更改下列內容:
search_query
:要搜尋的文字。
下表列出不同搜尋字詞和 search_query
的不同值,以及對應的結果:
text_data | search_query |
結果 | 說明 |
---|---|---|---|
128.0.0.2 | 「127.0.0.1」 | 錯誤 | 查詢中沒有搜尋符記。 查詢會經過文字分析器,該分析器會篩除「127.0.0.1」符記。 |
abc192.168.1.1def 172.217.20.142 | 「192.168.1.1abc」 | TRUE | 從查詢中擷取的符記清單為 ["192.168.1.1"]。 從文字中擷取的符記清單為 ["192.168.1.1", "172.217.20.142"]。 |
abc192.168.1.1def 172.217.20.142 | 「`192.168.1.1`」 | TRUE | 從查詢中擷取的符記清單為 ["192.168.1.1"]。 從文字中擷取的符記清單為 ["192.168.1.1", "172.217.20.142"]。 請注意,系統會將反引號視為 PATTERN_ANALYZER 的一般字元。 |
後續步驟
- 如要瞭解搜尋索引的用途、價格、必要權限和限制,請參閱 BigQuery 搜尋功能簡介。
- 如要瞭解如何有效搜尋已建立索引的資料欄,請參閱「使用索引進行搜尋」。