אינדקסים מספריים לחיפוש

בנוסף לאינדוקס של טקסט, אינדקס החיפוש מספק דרך יעילה לאינדוקס של מספרים. הוא משמש בעיקר להוספת תנאים לשדות מספריים לשאילתות של חיפוש טקסט מלא. בדף הזה מתואר אינדוקס של מספרים לשאילתות שבודקות שוויון ואי-שוויון, ואינדוקס של מערך מספרים.

יצירת טוקנים למספרים

מנתחי טוקנים מספריים משמשים ליצירת קבוצה של טוקנים שמשמשים להאצת חיפושים של השוואות מספריות.

משתמשים בפונקציה TOKENIZE_NUMBER כדי ליצור אינדקס מספרי. ‫TOKENIZE_NUMBER תומך ב-INT64,‏ FLOAT32, ‏ FLOAT64 או ARRAY מהסוגים האלה.

ב-PostgreSQL, משתמשים בפונקציה spanner.tokenize_number כדי ליצור אינדקס מספרי. ‫spanner.tokenize_number תומך רק בסוג bigint.

מספרי אינדקס לשאילתות של שוויון ואי-שוויון

‫Spanner תומך באינדקס של מספרים לשוויון ולאי-שוויון. חיפושים של שוויון מתאימים למספר. חיפושים של טווחים ואי-שוויון מתאימים למספר שנמצא בטווח מסוים. מגדירים את הערך הזה בפרמטר TOKENIZE_NUMBER comparison_type:

  • שוויון: comparison_type=>"equality"
  • אי-שוויון ושוויון: comparison_type=>"all"

בשני המקרים, המספר המקורי (מספר שלם או מספר עם נקודה עשרונית) עובר תהליך של טוקניזציה, שדומה מבחינה קונספטואלית לטוקניזציה של טקסט מלא. היא יוצרת קבוצה של טוקנים שהשאילתה יכולה להשתמש בהם כדי לאתר מסמכים שתואמים לתנאי המספר.

אינדוקס שוויון יוצר רק טוקן אחד שמייצג את המספר. השימוש במצב הזה מומלץ אם השאילתות כוללות רק תנאים מהצורה field = @p בסעיף WHERE.

הוספה לאינדקס של אי-שוויון ושוויון יכולה להאיץ מגוון רחב יותר של תנאים בסעיף WHERE של השאילתה. הם כוללים את field < @p,‏ field <= @p,‏ field > @p,‏ field >= @p,‏ field BETWEEN @p1 and @p2 ו-field <> @p, בנוסף לתנאי שוויון. כדי להטמיע סוג כזה של יצירת אינדקס, Spanner יוצר טוקנים באינדקס החיפוש הבסיסי. ‫Spanner יכול להפיק הרבה טוקנים לכל מספר באינדקס, בהתאם לפרמטרים של הכוונון. מספר הטוקנים תלוי בפרמטרים שמוגדרים עבור TOKENIZE_NUMBER, כמו algorithm, ‏ min, ‏ max ו-granularity. לכן חשוב להעריך את פרמטרים ההתאמה בקפידה כדי להבטיח איזון מתאים בין אחסון בדיסק לבין זמן החיפוש.

המרה לטוקנים של מערך

בנוסף לערכים סקלריים, הפונקציה TOKENIZE_NUMBER תומכת בטוקניזציה של מערך מספרים.

כשמשתמשים ב-TOKENIZE_NUMBER עם העמודה ARRAY, צריך לציין את comparison_type=>"equality". אין תמיכה בשאילתות טווח עם מערך של מספרים.

  CREATE TABLE Albums (
    AlbumId STRING(MAX) NOT NULL,
    Ratings ARRAY<INT64>,
    Ratings_Tokens TOKENLIST
      AS (TOKENIZE_NUMBER(Ratings, comparison_type=>"equality")) HIDDEN
  ) PRIMARY KEY(AlbumId);

  CREATE SEARCH INDEX AlbumsIndex ON Albums(Ratings_Tokens);

השאילתה הבאה מוצאת את כל האלבומים שקיבלו דירוג של 1 או 2:

  SELECT AlbumId
  FROM Albums
  WHERE ARRAY_INCLUDES_ANY(Ratings, [1, 2])

השאילתה הבאה מוצאת את כל האלבומים שקיבלו דירוג של 1 ושל 5:

SELECT AlbumId
FROM Albums
WHERE ARRAY_INCLUDES_ALL(Ratings, [1, 5])

המאמרים הבאים