בדף הזה מוסבר איך להשתמש בשיפור שאילתות כחלק מחיפוש טקסט מלא.
כדי להגדיל את הסיכוי למציאת תוצאות רלוונטיות, Spanner מציע יכולות מתקדמות שמרחיבות את שאילתת החיפוש כך שיכללו מונחים קשורים, מילים נרדפות ותיקוני איות. Spanner מספק את האפשרויות הבאות לשיפור שאילתות:
שאילתה משופרת
כדי להשתמש בשאילתה משופרת, מגדירים את enhance_query=>true בפונקציה SEARCH. לאחר מכן, Spanner מרחיב באופן אוטומטי את שאילתות החיפוש על ידי הכללת מונחים קשורים ומילים נרדפות, החלת גזירה (stemming) ותיקון שגיאות כתיב. לדוגמה, כשמשתמשים בשאילתה משופרת, שאילתת החיפוש hotl cal תואמת לאלבום Hotel California.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'hotl cal', enhance_query=>true)
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(albumtitle_tokens, 'hotl cal', enhance_query=>true)
enhance_query היא אפשרות שמוגדרת בזמן השאילתה ולא משפיעה על יצירת הטוקנים.
אפשר להשתמש באותו אינדקס חיפוש עם או בלי enhance_query.
Google כל הזמן משפרת את האלגוריתמים של שיפור השאילתות. כתוצאה מכך, שאילתה עם enhance_query => true עשויה להניב תוצאות שונות מעט לאורך זמן.
השימוש ב-enhance_query עלול להגדיל את זמן האחזור בגלל התקורה של הרחבת שאילתת החיפוש והרצת השאילתה הגדולה יותר שמתקבלת.
מילונים מותאמים אישית
אתם יכולים להשתמש במילונים מותאמים אישית עם חיפוש טקסט מלא ב-Spanner כדי להגדיר מילים נרדפות למונחים במערך הנתונים. האפשרות הזו שימושית לזיהוי מילים נרדפות, ראשי תיבות, מונחים מקבילים וגרסאות אחרות של מילים, כדי לשפר את השליפה של תוצאות החיפוש.
יצירת טבלת מילון בהתאמה אישית
מילון מותאם אישית הוא טבלה שנוצרה על ידי משתמש ומכילה צמדים של מפתח/ערך של מונחים והמילים הנרדפות שלהם. כדי ליצור כזה, צריך לכלול את האפשרות fulltext_dictionary_table = true בהצהרה CREATE TABLE. הטבלה צריכה לכלול שתי עמודות:
Key: עמודת מחרוזת שלא יכולה להכיל ערך null, שבה מופיע המונח שרוצים להרחיב עם מילים נרדפות.-
Value: עמודה של מערך מחרוזות שלא יכולה להכיל ערך null, שמייצגת מערך של מילים נרדפות למפתח.
בטבלה יכולות להיות רק העמודות Key ו-Value.
אם מונח חיפוש תואם לKey במילון, החיפוש מורחב כך שיכלול את כל המילים הנרדפות התואמות בValue יחד עם מונח המפתח עצמו.
בדוגמה הבאה נוצרת טבלת מילון בהתאמה אישית בשם MyCustomDictionary. במהלך היצירה, צריך להגדיר גם את אפשרות הטבלה fulltext_dictionary_table=true.
GoogleSQL
CREATE TABLE MyCustomDictionary (
Key STRING(MAX) NOT NULL,
Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (fulltext_dictionary_table = true);
PostgreSQL
CREATE TABLE mycustomdictionary (
key character varying NOT NULL,
value character varying [] NOT NULL,
PRIMARY KEY(key)
) WITH ( type = 'fulltext_dictionary')
אחרי שיוצרים את הטבלה, מוסיפים את המילים הנרדפות:
GoogleSQL
INSERT INTO MyCustomDictionary (Key, Value) VALUES
('album', ['vinyl', 'cassette']),
('edm', ['electronic dance music']);
PostgreSQL
INSERT INTO mycustomdictionary (key, value) VALUES
('album', ARRAY['vinyl', 'cassette']),
('edm', ARRAY['electronic dance music']);
כשממלאים את הטבלה, חשוב לזכור את הדברים הבאים:
- המפתחות צריכים להיות מילה אחת.
- הערכים יכולים להיות מילה אחת או ביטוי של כמה מילים. אם ערך מכיל כמה מילים, המערכת מתייחסת אליו כאל חיפוש של צירוף מילים במהלך הרחבת השאילתה.
- כל המפתחות והערכים צריכים להיות באותיות קטנות. כך אפשר לוודא שהן תואמות לטוקנים של החיפוש, שמומרים לאותיות קטנות על ידי הטוקנייזר שמוגדר כברירת מחדל.
הרחבת החיפוש מתרחשת רק כשמונח חיפוש תואם לKey. אם מונח חיפוש תואם למילה נרדפת ב-Value אבל לא ל-Key, החיפוש לא מורחב. אם אתם צריכים מיפוי דו-כיווני (למשל, כדי שחיפוש של vinyl או cassette ימצא גם את album), אתם צריכים להוסיף לטבלת המילון גם מיפויים הפוכים. בדוגמה הבאה מוצגות מיפויי דו-כיווניים של album, vinyl ו-cassette:
GoogleSQL
INSERT INTO MyCustomDictionary (Key, Value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ['album']
FROM UNNEST(['vinyl', 'cassette']) AS syn;
PostgreSQL
INSERT INTO mycustomdictionary (key, value)
-- 1. Insert album -> vinyl, cassette
SELECT 'album', ARRAY['vinyl', 'cassette']
UNION ALL
-- 2. Insert vinyl -> album and cassette -> album
SELECT syn, ARRAY['album']
FROM unnest(ARRAY['vinyl', 'cassette']) AS syn;
שימוש במילון מותאם אישית בשאילתות חיפוש
כדי להשתמש במילון מותאם אישית, מציינים את שם טבלת המילון בארגומנט dictionary של הפונקציה SEARCH.
אם מונח החיפוש הוא מפתח במילון, הפונקציה
SEARCHמחפשת גם את הערכים שלו. המונחalbumתואם להודעות שמכילות אתvinylאוcassette.GoogleSQL
SELECT MessageId, Body FROM Messages WHERE SEARCH(Body_Tokens, 'album', dictionary=>'MyCustomDictionary');PostgreSQL
SELECT messageid, body FROM messages WHERE spanner.search(body_tokens, 'album', dictionary=>'mycustomdictionary');כשערך במילון מכיל כמה מילים, כמו
electronic dance musicעבור המפתחedm, המערכת מתייחסת אליו כאל חיפוש של צירוף מילים. המשמעות היא שהמונחים צריכים להופיע זה לצד זה ובסדר המדויק שצוין כדי להיחשב כהתאמה. לדוגמה, השאילתה הבאה מחזירה תוצאות שמכילות את הביטוי המדויק 'מוזיקת דאנס אלקטרונית', אבל לא מתאימה לביטוי 'מוזיקה אלקטרונית של דאנס'. הוא שימושי בעיקר להרחבת ראשי תיבות, ואפשר להשתמש בו באופן הבא:GoogleSQL
SELECT MessageId, Body FROM Messages WHERE SEARCH(Body_Tokens, 'edm', dictionary=>'MyCustomDictionary');PostgreSQL
SELECT messageid, body FROM messages WHERE spanner.search(body_tokens, 'edm', dictionary=>'mycustomdictionary');
התיישנות של חיפוש במילון
כברירת מחדל, ערכים במילון בהתאמה אישית נקראים עם מקסימום של 15 שניות של נתונים לא עדכניים. כך מצטמצם העומס של פעולת הקריאה, כי קריאת נתונים עם מידת עדכניות מסוימת יעילה יותר מקריאת הנתונים העדכניים ביותר. כתוצאה מכך, יכול להיות שיחלפו עד 15 שניות עד שהשינויים בערכים במילון יבואו לידי ביטוי בשאילתות חיפוש. אפשר לשנות את שיטת הפעולה הזו בדרכים הבאות:
- באמצעות האפשרות
fulltext_dictionary_stalenessבטבלה. - שימוש ברמז לשאילתה
fulltext_dictionary_stalenessכדי לקבל שליטה מפורטת יותר.
אם משתמשים גם ברמז לשאילתה וגם באפשרות הטבלה, הרמז לשאילתה מבטל את האפשרות של הטבלה.
אפשרות טבלה fulltext_dictionary_staleness
אפשר להגדיר את האפשרות fulltext_dictionary_staleness לטבלת המילון. כל השאילתות שמשתמשות בטבלת המילון הזו משתמשות בערך הזה של טריות הנתונים, אלא אם הוא מוחלף על ידי רמז השאילתה.
GoogleSQL
בדוגמה הבאה אפשר לראות איך CREATE טבלה באמצעות האפשרות fulltext_dictionary_staleness:
CREATE TABLE MyCustomDictionary (
Key STRING(MAX) NOT NULL,
Value ARRAY<STRING(MAX)> NOT NULL,
) PRIMARY KEY(Key),
OPTIONS (
fulltext_dictionary_table = true,
fulltext_dictionary_staleness = '5s'
);
בדוגמה הבאה אפשר לראות איך משתמשים בטבלה ALTER כדי לשנות או להגדיר את האפשרות fulltext_dictionary_staleness:
ALTER TABLE MyCustomDictionary SET OPTIONS (
fulltext_dictionary_staleness = '60s'
);
PostgreSQL
בדוגמה הבאה אפשר לראות איך CREATE טבלה באמצעות האפשרות fulltext_dictionary_staleness:
-- Create with 5s staleness
CREATE TABLE mycustomdictionary (
key character varying NOT NULL,
value character varying[] NOT NULL,
PRIMARY KEY(key)
) WITH (
type = 'fulltext_dictionary',
fulltext_dictionary_staleness = '5s'
);
הממשק של PostgreSQL לא תומך בטבלה ALTER כדי לשנות או להגדיר את האפשרות fulltext_dictionary_staleness.
fulltext_dictionary_staleness רמז לשאילתה
כדי לקבל שליטה מדויקת יותר, אפשר להשתמש ברמז השאילתה fulltext_dictionary_staleness כדי לציין רמת עדכניות שונה לשאילתה ספציפית. ההערה הזו מבטלת את ההגדרה ברמת הטבלה.
בדוגמה הבאה נעשה שימוש ברמז כדי לבצע חיפושים בטבלת מילון ללא נתונים לא עדכניים. כך אפשר לוודא שייקראו הערכים העדכניים ביותר במילון. הגישה הזו יכולה להגדיל את זמן האחזור של השאילתה, כי קריאת הנתונים העדכניים ביותר פחות יעילה מאשר לאפשר מידה מסוימת של נתונים לא עדכניים.
GoogleSQL
@{fulltext_dictionary_staleness="0s"}
SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'Bill', dictionary=>'MyCustomDictionary');
PostgreSQL
/*@ fulltext_dictionary_staleness='0s' */
SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'Bill', dictionary=>'mycustomdictionary');
מגבלות ידועות בטבלאות מילון מותאמות אישית
- יש תמיכה מוגבלת בשימוש בייבוא ובייצוא של Spanner עם טבלאות מילון מותאמות אישית.
- צריך ליצור טבלאות מילון בהתאמה אישית בסכימה שמוגדרת כברירת מחדל, ואי אפשר ליצור אותן בסכימות עם שמות.
- טבלאות מילון בהתאמה אישית תומכות רק בניב השאילתות SEARCH שמוגדר כברירת מחדל.
שילוב מילונים מותאמים אישית עם שאילתות משופרות
אפשר לשלב מילים נרדפות ממילון מותאם אישית עם enhanced query על ידי הגדרה של dictionary וגם של enhance_query=>true בפונקציה SEARCH. התכונה 'שיפור שאילתות' יכולה להרחיב שאילתות באמצעות מילים נרדפות נפוצות או תיקוני איות, בעוד שמילונים מותאמים אישית מאפשרים לכם להגדיר הרחבות משלכם. לדוגמה, אם enhance_query מרחיב את album כך שיכלול את record, ו-MyCustomDictionary ממפה את album ל-['vinyl', 'cassette'], השאילתה הבאה תתאים להודעות שמכילות את album, record, vinyl או cassette:
GoogleSQL
SELECT MessageId, Body
FROM Messages
WHERE SEARCH(Body_Tokens, 'album', enhance_query=>true, dictionary=>'MyCustomDictionary');
PostgreSQL
SELECT messageid, body
FROM messages
WHERE spanner.search(body_tokens, 'album', enhance_query=>true, dictionary=>'mycustomdictionary');
כששני השיפורים מופעלים, הם פועלים באופן עצמאי על מונחי החיפוש המקוריים, והמונחים שנוצרים על ידי שיפור אחד לא משמשים כקלט לשיפור השני.