עבודה עם כלי ניתוח טקסט
הפונקציות CREATE SEARCH INDEX DDL
statement, SEARCH ו-TEXT_ANALYZE תומכות באפשרויות מתקדמות להגדרת כלי ניתוח הטקסט. הבנה של כלי הניתוח של טקסט ב-BigQuery והאפשרויות שלהם מאפשרת לכם לשפר את חוויית החיפוש.
במאמר הזה מפורטת סקירה כללית של מנתחי הטקסט השונים שזמינים ב-BigQuery ואפשרויות ההגדרה שלהם, וגם דוגמאות לאופן שבו מנתחי טקסט פועלים עם חיפוש ב-BigQuery. מידע נוסף על התחביר של כלי ניתוח הטקסט זמין במאמר בנושא ניתוח טקסט.
כלי ניתוח טקסט
BigQuery תומך במנתחי הטקסט הבאים:
NO_OP_ANALYZERLOG_ANALYZERPATTERN_ANALYZER
NO_OP_ANALYZER
כדאי להשתמש ב-NO_OP_ANALYZER כשרוצים להתאים נתונים שעברו עיבוד מראש בצורה מדויקת. לא מתבצעת טוקניזציה או נרמול של הטקסט. מכיוון שהכלי הזה לא מבצע טוקניזציה או נורמליזציה, הוא לא מקבל הגדרות. מידע נוסף על NO_OP_ANALYZER זמין במאמר NO_OP_ANALYZER.
LOG_ANALYZER
ה-LOG_ANALYZER משנה את הנתונים בדרכים הבאות:
- הטקסט מומר לאותיות קטנות.
ערכי ASCII שגדולים מ-127 נשמרים כמו שהם.
הטקסט מפולח למונחים נפרדים שנקראים אסימונים באמצעות התווים הבאים שמגדירים את סוף המונח:
[ ] < > ( ) { } | ! ; , ' " * & ? + / : = @ . - $ % \ _ \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 text 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" |
שימו לב לשימוש בlazy quantifiers +?. הביטוי הרגולרי מתאים למחרוזת הקצרה ביותר האפשרית בטקסט, ולכן המחרוזות '"cats"' ו-'"dogs"' מחולצות כ-2 טוקנים נפרדים בטקסט. |
שימוש בPATTERN_ANALYZER text analyzer מאפשר לכם לשלוט יותר בטוקנים שחולצו מטקסט כשמשתמשים בו עם הפונקציה SEARCH. בטבלה הבאה מוצגות דוגמאות לתוצאות שונות שמתקבלות מדפוסים שונים:SEARCH
| דוגמת קוד | שאילתה | טקסט | טוקנים מטקסט | SEARCH(text, query) | הסבר |
|---|---|---|---|---|---|
| abc | abcdef | abcghi |
|
TRUE | 'abc' in ['abcghi'] |
| cd[a-z] | abcdef | abcghi |
|
לא נכון | '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/' in ['/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' in ['abc'] שימו לב ש-'abc abc' היא שאילתת משנה יחידה(ie) אחרי שהיא עוברת ניתוח על ידי מנתח שאילתות החיפוש, כי הרווח מוחרג. |
| (?i)(?:Abc) (no normalization) | aBcd | Abc |
|
לא נכון | 'aBc' in ['Abc'] |
| (?i)(?:Abc) normalization: lower_case = true |
aBcd | Abc |
|
TRUE | 'abc' in ['abc'] |
| (?:/?)abc | bc/abc | /abc/abc/ |
|
TRUE | '/abc' ב- ['/abc'] |
| (?:/?)abc | abc | d/abc |
|
לא נכון | 'abc' in ['/abc'] |
| ".+" | "cats" | "cats" ו-"dogs" |
|
לא נכון | 'cats' ב-'cats' and 'dogs'] שימו לב לשימוש בכמתים חמדנים + שגורם לביטוי הרגולרי להתאים למחרוזת הארוכה ביותר האפשרית בטקסט, וכך המערכת מחלצת את המחרוזת 'cats' and 'dogs' כטוקן בטקסט. |
| ".+?" | "cats" | "cats" ו-"dogs" |
|
TRUE | '"cats"' in ['"cats"', '"dogs"] שימו לב לשימוש בכמתים עצלים +? שגורם לביטוי הרגולרי להתאים למחרוזת הקצרה ביותר האפשרית בטקסט, וכך המילים '"cats"' ו-'"dogs"' מחולצות כ-2 טוקנים נפרדים בטקסט. |
דוגמאות
בדוגמאות הבאות מוצג שימוש בניתוח טקסט עם אפשרויות התאמה אישית ליצירת אינדקסים של חיפוש, לחילוץ טוקנים ולהחזרת תוצאות חיפוש.
LOG_ANALYZER עם נירמול NFKC ICU ומילות עצירה
בדוגמה הבאה מוגדרות LOG_ANALYZER אפשרויות עם נורמליזציה של NFKC ICU ומילות עצירה. בדוגמה הזו, טבלת הנתונים הבאה כבר מאוכלסת בנתונים:
CREATE TABLE dataset.data_table( text_data STRING );
כדי ליצור אינדקס חיפוש עם נורמליזציה של NFKC ICU ורשימה של מילות עצירה, יוצרים מחרוזת בפורמט JSON באפשרות analyzer_options של הצהרת CREATE
SEARCH INDEX DDL.
רשימת האפשרויות המלאה שזמינות כשיוצרים אינדקס חיפוש באמצעות 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' מהרשימה. |
| The Ⓠuick Ⓑrown Ⓕox | ["quick", "brown", "fox"] | הטוקניזציה של LOG_ANALYZER יוצרת את הטוקנים [The, Ⓠuick, Ⓑrown, Ⓕox]. בשלב הבא, הנורמליזציה של NFKC ICU עם icu_case_folding = true אותיות קטנות באסימונים יוצרת את הרשימה ['the', 'quick', 'brown', 'fox']לבסוף, המסנן של מילות עצירה מסיר את המילה 'the' מהרשימה. |
| Ⓠuick⁇Ⓕox | ["quick??fox"] | הטוקניזציה של LOG_ANALYZER יוצרת את הטוקנים ['The', 'Ⓠuick⁇Ⓕox']. בשלב הבא, מתבצעת נורמליזציה של NFKC ICU עם icu_case_folding = true המרה לאותיות קטנות של הטוקנים כדי ליצור את הערך ['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']. הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['מהר']. אפשר למצוא את כל האסימונים של שאילתת הרשימה באסימוני הטקסט. |
| The Ⓠuick Ⓑrown Ⓕox | "quick" |
TRUE |
הרשימה הסופית של הטוקנים שחולצו מהטקסט היא ['quick', 'brown', 'fox']. הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['מהר']. אפשר למצוא את כל האסימונים של שאילתת הרשימה באסימוני הטקסט. |
| Ⓠuick⁇Ⓕox | "quick" |
FALSE |
הרשימה הסופית של הטוקנים שחולצו מהטקסט היא ['quick??fox']. הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['מהיר']. הערך 'quick' לא מופיע ברשימת האסימונים מהטקסט. |
| Ⓠuick⁇Ⓕox | "quick⁇fox" |
TRUE |
הרשימה הסופית של הטוקנים שחולצו מהטקסט היא ['quick??fox']. הרשימה הסופית של הטוקנים שחולצו משאילתת הטקסט היא ['quick??fox']. "quick??fox" נמצא ברשימת האסימונים מהטקסט. |
| Ⓠuick⁇Ⓕox | "`quick⁇fox`" |
FALSE |
ב-LOG_ANALYZER, התו backtick מחייב התאמה מדויקת של הטקסט. |
PATTERN_ANALYZER לחיפוש IPv4 עם מילות עצירה
בדוגמה הבאה מוגדר PATTERN_ANALYZER מנתח הטקסט לחיפוש תבנית ספציפית תוך סינון מילות עצירה מסוימות. בדוגמה הזו, התבנית תואמת לכתובת IPv4 ומתעלמת מהערך של localhost (127.0.0.1).
בדוגמה הזו, ההנחה היא שהטבלה הבאה מאוכלסת בנתונים:
CREATE TABLE dataset.data_table( text_data STRING );
כדי ליצור אינדקס חיפוש, האפשרות pattern ורשימה של מילות עצירה, יוצרים מחרוזת בפורמט JSON באפשרות analyzer_options של הצהרת CREATE SEARCH
INDEX DDL.
רשימת האפשרויות המלאה שזמינות כשיוצרים אינדקס חיפוש באמצעות PATTERN_ANALYZER מופיעה במאמר PATTERN_ANALYZER.
בדוגמה הזו, מילות העצירה הן כתובת ה-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" ] } ] }''' );
כשמשתמשים בביטויים רגולריים עם analyzer_options, צריך לכלול שלושה סמלי \ מובילים כדי לבצע escape לביטויים רגולריים שכוללים סמל \, כמו \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 מופיע סקירה כללית של תרחישי שימוש, תמחור, הרשאות נדרשות ומגבלות של אינדקסים לחיפוש.
- מידע על חיפוש יעיל של עמודות באינדקס זמין במאמר בנושא חיפוש באמצעות אינדקס.