מחרוזות שאילתה

מחרוזת שאילתה מכילה תווים ביוניקוד. האורך המקסימלי של מחרוזת שאילתה הוא 2,000 תווים. כל מחרוזות השאילתה מכילות לפחות ערך שדה אחד. מומלץ לכתוב את ערכי השדות באותיות קטנות, כי החיפושים בשדות atom,‏ text ו-HTML לא תלויי-רישיות. מחרוזת שאילתה יכולה להכיל גם את האופרטורים הבוליאניים AND,‏ OR ו-NOT, שמזוהים אם כותבים אותם באותיות גדולות.

פסיק יכול להופיע במחרוזת שאילתה רק אם הוא משמש להפרדה בין הארגומנטים של פונקציה: distance(home, geopoint(35.2, 40.5)) > 100 או שהוא חלק ממחרוזת שמוקפת במירכאות.

מחרוזת שאילתה יכולה להיות בכמה פורמטים. יש שתי דרכים עיקריות ליצור שאילתה: עם שמות שדות או בלי שמות שדות. חיפוש גלובלי משתמש במחרוזת שאילתה שמכילה רק ערכי שדות:

query = "blue"
query = "NOT white"
query = "blue OR red"
query = "blue guitar"

חיפוש בשדה משתמש במחרוזת שאילתה שמכילה ביטוי אחד או יותר שמציינים שמות של שדות וערכים של שדות:

query = "model:gibson date < 1965-01-01"
query = "title:\"Harry Potter\" AND pages<500"
query = "beverage:wine color:(red OR white) NOT country:france"

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

מומלץ לרשום ביומן את מחרוזות השאילתה באפליקציה אם רוצים לשמור רשומה של השאילתות שהופעלו.

חיפוש גלובלי מאפשר לחפש מסמכים על ידי ציון ערכים שיכולים להופיע בכל שדה במסמך. כדי לבצע חיפוש גלובלי, צריך לכתוב מחרוזת שאילתה שמכילה ערך שדה אחד או יותר. אלגוריתם החיפוש מזהה את הסוג של כל ערך ומחפש בכל שדות המסמך שיכולים להכיל את הערך הזה.

שאילתות עם ערך אחד

חיפוש עם מחרוזת שאילתה שמכילה ערך יחיד מטופל לפי הכללים הבאים:

אם מחרוזת השאילתה היא מילה (red) או מחרוזת במירכאות ("red rose"), הפונקציה search מאחזרת את כל המסמכים באינדקס שכוללים:

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

אם מחרוזת השאילתה היא מספר (3.14159), הפונקציה search מאחזרת את כל המסמכים שכוללים:

  • שדה טקסט או HTML שמכיל טוקן שתואם למספר כפי שהוא מופיע בשאילתה (שדה הטקסט he took 5 minutes יתאים לשאילתה 5 אבל לא לשאילתה 5.0).
  • שדה אטום שתואם באופן מילולי למספר כפי שהוא מופיע בשאילתה.

אם מחרוזת השאילתה היא תאריך בפורמט yyyy-mm-dd, החיפוש יאחזר את כל המסמכים שבהם:

  • שדה תאריך שהערך שלו שווה לתאריך הזה (אפשר להוסיף אפסים מובילים במחרוזת השאילתה, למשל '2012-07-04' ו-'2012-7-4' הם אותו תאריך).
  • שדה טקסט או HTML שמכיל טוקן שתואם באופן מילולי לתאריך שמופיע בשאילתה.
  • שדה אטומי שתואם באופן מילולי לתאריך שמופיע בשאילתה.

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

יכול להיות ששמתם לב שלא הזכרנו שדות של נקודות גיאוגרפיות. בשלב הזה, אי אפשר לציין ערך גיאוגרפי גולמי כמחרוזת, ולכן נקודות גיאוגרפיות לא יכולות להופיע בחיפושים גלובליים.

שאילתות עם ערכים מרובים

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

query = "small red"
query = "small AND red"

כשמבצעים חיפוש גלובלי עם כמה ערכים, ההתאמה לשדה מתבצעת באופן עצמאי לכל ערך במחרוזת, וההתאמה לשדה אטומי מטופלת באופן שונה, במיוחד:

  • ערכי שאילתה יכולים להופיע בכל סדר בשדה טקסט או בשדה HTML.
  • ערכים שונים יכולים להופיע בשדות שונים.
  • החיפוש בשדות Atom מתבצע רק אם מחרוזת השאילתה לא מכילה אופרטורים בוליאניים (AND, ‏ OR, ‏ NOT). מחרוזת השאילתה כולה צריכה להתאים לשדה Atom.

שימו לב לכלל השלישי שמתייחס לשדות אטומיים. מחרוזת השאילתה 'red small' לא מכילה את הערך הבוליאני AND (גם אם הוא משתמע), ולכן החיפוש ינסה למצוא שדות אטומיים תואמים. המחרוזת 'red AND small' כן מכילה אופרטור בוליאני, ולכן החיפוש לא ינסה להתאים את מחרוזת השאילתה לשדות אטומיים.

בדוגמה הבאה מוצגים ארבעה מסמכים שאוחזרו באמצעות מחרוזת השאילתה rose bud. לכל מסמך יש שני שדות טקסט ושדה אטום אחד. בעמודת ההערות מוסבר למה כל מסמך עונה על השאילתה.

מזהה המסמך שדה טקסט 1 שדה טקסט 2 שדה אטום תגובה
1 mighty like a rose Bud אחד לכולם שיח עם קוצים ערכים תואמים יכולים להופיע בשדות שונים
2 רחב כמו נהר כמו ניצן על ורד עשב נסחף הערכים התואמים יכולים להופיע בכל סדר באותו שדה טקסט או HTML, עם טקסט ביניהם
3 עמוק כמו האוקיינוס הבנים עם ניצני הוורדים blue bonnet ערכים תואמים יכולים להופיע בכל סדר שהוא באותו שדה טקסט או HTML
4 גבוה כמו הר הגינה היפה ניצן ורד השדה Atom תואם כי הערך שלו זהה למחרוזת השאילתה כולה

שימו לב שאם הייתם מחליפים את הערכים בשאילתה ומחפשים את המחרוזת "bud rose" במקום זאת, עדיין היו מוחזרים מסמכים 1, 2 ו-3, אבל לא מסמך 4. כדי לחפש מחרוזת תווים מדויקת בשדות atom,‏ text ו-HTML, צריך להוסיף מרכאות למחרוזת בשאילתה. חיפוש של "rose bud" יחזיר רק את מסמכים 3 ו-4 בדוגמה.

אופרטורים בוליאניים

אפשר לציין חיפוש גלובלי מורכב יותר באמצעות האופרטור הבוליאני NOT לפני ערך, והאופרטורים AND ו-OR בין ערכים. שימו לב שאופרטורים אלה צריכים להיות כתובים באותיות רישיות. אם הם מופיעים בתוך מחרוזת במירכאות המערכת מתייחסת אליהם כאל חלק מערך השדה, ולא כאל אופרטורים. אפשר להשתמש בסוגריים במחרוזת שאילתה כדי להבהיר את הלוגיקה.

סדר העדיפות של האופרטורים הבוליאניים, מהגבוה לנמוך, הוא: NOT, ‏ OR, ‏ AND:

NOT cat AND dogs OR horses --> (NOT cat) AND (dogs OR horses)
NOT cat OR dogs AND horses --> ((NOT cat) OR dogs) AND horses

Stemming

כדי לחפש וריאציות נפוצות של מילה, כמו צורות רבות וסיומות של פעלים, צריך להשתמש באופרטור ~ stem (התו tilde). זהו אופרטור של קידומת שצריך להופיע לפני ערך ללא רווח ביניהם. הערך ~cat יתאים ל-cat או ל-cats, וכך גם ~dog יתאים ל-dog או ל-dogs. אלגוריתם ה-stemming לא חסין מפני טעויות. הערך ~care יתאים ל-care ול-caring, אבל לא ל-cares או ל-cared. נעשה שימוש ב-stemming רק כשמחפשים טקסט ושדות HTML.

יצירת טוקנים

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

"real-time" --> "real time"
"2001-12-15" --> "2001 12 15"
"1.5" --> "1 5"

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

query = "pet = dog"
query = "author = \"Ray Bradbury\""
query = "color:red"
query = "NOT color:red"
query = "price < 500"
query = "birthday>=2011-05-10"

שימו לב: השימוש ברווחים משני הצדדים של אופרטור היחס הוא אופציונלי. כמו במחרוזות של שאילתות חיפוש גלובלי, אפשר להוסיף מרכאות לערך של שדה טקסט, HTML או atom כדי לציין מחרוזת, ואפשר להוסיף NOT באותיות רישיות לפני ביטוי של ערך שדה כדי לשלול אותו.

שאילתות בשדות מסוג atom

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

מחרוזת השאילתה תגובות
"weather=stormy"
"weather: stormy"
אפשר להשתמש בכל אחת מהצורות של אופרטור השוויון. מאחזר מסמכים עם שדה מזג אוויר ששווה ל-"stormy".
"Title: \"Tom&Jerry\""
"Couple: \"Fred and Ethel\""
"Version = \"1HCP(21.3)\""
אם מחפשים שדה atom שמכיל רווחים או תווים מיוחדים, צריך להקיף את הערך במירכאות.
"Color = (red OR blue)"
"Color = (\"dark red\" OR \"bright blue\")"
אפשר להשתמש בסוגריים ובאופרטור הלוגי OR כדי לציין רשימה של ערכים חלופיים בשדות.

שאילתות בשדות טקסט ו-HTML

אופרטור היחסים התקף היחיד לשדות טקסט ו-HTML הוא שוויון. במקרה הזה, האופרטור מציין שהשדה כולל את הערך ולא שהשדה שווה לערך. אפשר להשתמש באופרטור הגזירה כדי לחפש וריאציות של מילה. אפשר גם להשתמש באופרטורים OR ו-AND כדי לציין ביטויים בוליאניים מורכבים לערך השדה. אם מופיע אופרטור בוליאני בתוך מחרוזת במירכאות, הוא לא מקבל יחס מיוחד, אלא נחשב לחלק נוסף מהמחרוזת שצריך להתאים לה. חשוב לזכור שכאשר מחפשים שדות HTML, המערכת מתעלמת מהטקסט בתוך תגי עיצוב של HTML. שאילתות בשדות טקסט ובשדות HTML הן לא תלויות-רישיות. כשמבצעים אינדוקס של השדות האלה, כל התווים המשולבים ב-Unicode והתווים עם סימני הטעמה שמופיעים בהם עוברים 'נורמליזציה' לתווים המקבילים ללא סימני הטעמה. גם תווים וסימני הטעמה משולבים עוברים נורמליזציה במחרוזות של שאילתות בשדות האלה, כך ששאילתה יכולה לכלול את הצורות עם סימני הטעמה או לא, והיא תתאים לשדות בכל מקרה.

מחרוזת השאילתהתגובות
"Comment = great"
"Comment: great"
שתי הצורות של אופרטור השוויון תקפות. האופרטור מאחזר מסמכים עם שדה הערה שמכיל לפחות מופע אחד של המילה 'great' בשדה Comment.
"Comment = (great big ball)"
"Comment = (great AND big AND ball)"
כדי לחפש שתי מילים או יותר בשדה, בכל סדר שהוא, מקיפים את המילים בסוגריים. מחרוזת השאילתה הזו מאחזרת מסמכים עם שדה הערה שכולל את שלוש המילים האלה בכל סדר, עם כל מספר של מילים אחרות ביניהן. הרווח בין המילים מרמז על פעולת AND לוגית, והצורה השנייה מבהירה את זה.
"Comment = \"insanely great\"" כדי לחפש מחרוזת טקסט ספציפית, מקיפים את המחרוזת במירכאות. השאילתה הזו תחזיר מסמכים שבהם השדה Comment מכיל את הביטוי insanely great (וגם insanely-great, שעובר טוקניזציה לאותו דבר).
"pet = ~dog" אופרטור הגזירה יתאים לגרסאות שונות של המילה dog בשדה pet.
"Color = (red OR blue)" כדי לחפש התאמה מתוך רשימה של חלופות, מקיפים את הרשימה בסוגריים ומוסיפים את מילת המפתח OR בין החלופות. השאילתה הזו מאחזרת מסמכים שבהם השדה Color כולל את הערך red או את הערך blue או את שניהם.
"weather = ((rain OR snow) AND cold)" אפשר להשתמש באופרטורים הלוגיים OR ו-AND, יחד עם סוגריים, כדי לציין ערך שדה מורכב יותר.
"weather = \"rain OR shine\"" הסיבה לכך היא שהאופרטור הלוגי OR מוטמע במחרוזת שמוקפת במירכאות, ולכן המערכת לא מתייחסת אליו כאופרטור יחסי. מחרוזת השאילתה הזו מאחזרת מסמכים עם שדה מזג אוויר שמכיל את המחרוזת rain or shine

שאילתות בשדות מספריים

ערך של שדה מספרי יכול להיות מספר שלם, מספר עשרוני או מספר אקספוננציאלי. האופרטורים הרלציוניים התקפים לשדות מספריים הם אופרטורי השוויון, יחד עם אופרטורי 'קטן מ'/'גדול מ' (<,‏ <=,‏ >,‏ >=). שימו לב שאין אופרטור של אי-שוויון (!=). הנה כמה דוגמאות למחרוזות של שאילתות לשדות מספריים:

"quantity = 10000"
"size: 4"
"price < 9.99"
"theta > 1.5E-2"

שאילתות בשדות תאריך

ערך של שדה תאריך צריך להיות כתוב בפורמט yyyy-mm-dd form. אפשר להוסיף אפסים מובילים לחודשים ולימים בני ספרה אחת. האופרטורים הרלציוניים התקפים לשדות תאריך הם אופרטורים של שוויון, יחד עם אופרטורים של קטן מ/גדול מ (<, ‏ <=, ‏ >, ‏ >=). שימו לב שאין אופרטור של אי-שוויון. אפשר להוסיף את האופרטור NOT לפני ביטוי כדי לשלול אותו. הנה כמה דוגמאות למחרוזות שאילתה לשדות תאריך:

"start_date: 2012-05-20"
"end_date: 2013-5-1"
"birthday >= 2000-12-31"
"NOT birthday = 2000-12-25"

שאילתות בשדות של נקודות גיאוגרפיות

אין אופרטורים יחסיים שפועלים עם שדות של נקודות גיאוגרפיות, ולכן אי אפשר לציין שדות של נקודות גיאוגרפיות ישירות במחרוזת שאילתה. ב-Search API יש שתי פונקציות מיוחדות שאפשר להשתמש בהן בשאילתות שכוללות שדות של נקודות גיאוגרפיות:

geopoint(lat,long)
מגדיר נקודה גיאוגרפית לפי קו רוחב וקו אורך.
distance(point1, point2)
חישוב המרחק במטרים בין שתי נקודות גיאוגרפיות. אפשר לציין כל נקודה באמצעות השם של שדה נקודה גיאוגרפית או באמצעות הפעלה של פונקציית הנקודה הגיאוגרפית. שימו לב שאי אפשר לספק שני שמות של שדות כארגומנטים לפונקציה הזו. לפחות אחד מהארגומנטים חייב להיות קבוע.

אפשר להשתמש בפונקציות האלה כדי ליצור שאילתות שמחזירות מיקומים ביחס למיקום קבוע. בדוגמאות הבאות מניחים שהאינדקס מכיל מסמכים עם שדות של נקודות גיאוגרפיות בשמות survey_marker ו-home.

מחרוזת השאילתה תגובות
"distance(survey_marker, geopoint(35.2, 40.5)) < 100" חיפוש סמנים במרחק של פחות מ-100 מטרים מנקודה גיאוגרפית נתונה.
"distance(home, geopoint(35.2, 40.5)) > 100" חיפוש בתים במרחק של יותר מ-100 מטרים מנקודה גיאוגרפית נתונה.

אפליקציות שמשתמשות במיקום גיאוגרפי מקבלות בדרך כלל מידע מהדפדפן. אם המשתמש מאשר, אפשר להסיק את המיקום שלו מכתובת ה-IP, או שהוא יכול להזין מיקוד. המיקום יכול להגיע גם מממשקי API אחרים, כמו Google Maps Geolocation API.

שאילתות בכמה שדות

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

מחרוזת השאילתה תגובות
"product=piano manufacturer=steinway"
"product=piano AND manufacturer=steinway"
השאילתות האלה מאחזרות את כל הפסנתרים של Steinway. הרווח בין המונחים מרמז על פעולת AND לוגית, והצורה השנייה מבהירה את זה.
"product=piano AND NOT manufacturer=steinway" מאחזר את כל הפסנתרים שאינם של Steinway.
"product=piano AND price<2000" השאילתה הזו מאחזרת פסנתרים לא יקרים.

שילוב של חיפושים גלובליים וחיפושים בשדות

מחרוזת שאילתה יכולה להכיל כל מספר של ביטויי חיפוש גלובליים וביטויי חיפוש בשדות. רווחים בין ביטויים נחשבים ל-AND. אפשר גם להשתמש ב-OR וב-AND באופן מפורש, יחד עם סוגריים. כל ביטוי יטופל בהתאם לכללים שמשויכים לסוג המונח הזה.

מחרוזת השאילתהתגובות
"keyboard great price<5000"
"keyboard AND great AND price<5000"
מאחזר מסמכים שבהם המילים great ו-keyboard מופיעות בשדות text,‏ HTML או atom, ויש שדה מחיר עם ערך נמוך מ-5000. הערך AND מובלע, והצורה השנייה שקולה.
"keyboard OR product=piano" שליפת מסמכים עם שדה מוצר שמכיל את המילה piano, או מסמכים עם שדה טקסט, HTML או atom שמכיל את המילה keyboard.