מחרוזת שאילתה מכילה תווי Unicode. האורך המקסימלי של מחרוזת שאילתה הוא 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 שמכיל את המילה או המחרוזת המצוטטת (ההתאמה לא תלויה באותיות רישיות או קטנות).
- שדה atom עם ערך שתואם למילה או למחרוזת במירכאות (ההתאמה לא תלויה באותיות רישיות או קטנות).
אם מחרוזת השאילתה היא מספר ('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.
שימו לב לכלל השלישי שמתייחס לשדות 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, טקסט ו-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. אלגוריתם הגזירה
לא חסין מפני טעויות. הערך ~care יתאים למילים care ו-caring, אבל לא למילים cares או cared. ההטיה משמשת רק כשמחפשים טקסט ושדות 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 או תווים עם הדגשה בשדה. אין תמיכה בגזירה של מילים בשדות אטומיים.
| מחרוזת השאילתה | תגובות |
|---|---|
"weather=stormy"
|
כל אחת מהצורות של אופרטור השוויון היא תקינה. מאחזר מסמכים עם שדה מזג אוויר ששווה ל-"stormy". |
"Title: \"Tom&Jerry\""
|
אם מחפשים שדה atom שמכיל רווחים או תווים מיוחדים, צריך להקיף את הערך במירכאות. |
"Color = (red OR blue)"
|
אפשר להשתמש בסוגריים ובאופרטור הלוגי OR כדי לציין רשימה של ערכים חלופיים בשדות. |
שאילתות בשדות טקסט ו-HTML
אופרטור היחסים התקף היחיד לשדות טקסט ו-HTML הוא שוויון. במקרה הזה, האופרטור מציין שהשדה כולל את הערך ולא שהשדה שווה לערך. אפשר להשתמש באופרטור הגזירה כדי לחפש וריאציות של מילה. אפשר גם להשתמש באופרטורים OR ו-AND כדי לציין ביטויים בוליאניים מורכבים לערך השדה. אם מופיע אופרטור בוליאני בתוך מחרוזת במירכאות, הוא לא מקבל יחס מיוחד, אלא נחשב לחלק נוסף במחרוזת התווים שצריך להתאים לה. חשוב לזכור שכאשר מחפשים שדות HTML, המערכת מתעלמת מהטקסט בתוך תגי סימון HTML. שאילתות בשדות טקסט ובשדות HTML הן לא תלויות-רישיות. כשמבצעים אינדוקס של השדות האלה, כל התווים המשולבים ב-Unicode והתווים עם סימני הניקוד שבהם עוברים 'נרמול' לתווים המקבילים ללא סימני הניקוד. גם שילוב של תווים וסימני הטעמה עובר נורמליזציה במחרוזות של שאילתות בשדות האלה, כך ששאילתה יכולה לכלול את הצורות עם סימני הטעמה או לא, והיא תתאים לשדות בכל מקרה.
| מחרוזת השאילתה | תגובות |
|---|---|
"Comment = great" |
כל אחת מהצורות של אופרטור השוויון היא תקינה. שליפת מסמכים עם שדה תגובה שמכיל לפחות מופע אחד של המילה 'great' בשדה התגובה. |
"Comment = (great big ball)"
|
כדי לחפש שתי מילים או יותר בשדה, בכל סדר שהוא, מקיפים את המילים בסוגריים. מחרוזת השאילתה הזו מאחזרת מסמכים עם שדה Comment שכולל את כל שלוש המילים בכל סדר, עם כל מספר של מילים אחרות ביניהן. הרווח בין המילים מרמז על פעולת 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)
- חישוב המרחק במטרים בין שתי נקודות גיאוגרפיות. אפשר לציין כל נקודה באמצעות השם של שדה של נקודה גיאוגרפית או באמצעות הפעלה של הפונקציה geopoint. שימו לב שאי אפשר לספק שני שמות של שדות כארגומנטים לפונקציה הזו. לפחות אחד מהארגומנטים צריך להיות קבוע.
אפשר להשתמש בפונקציות האלה כדי ליצור שאילתות שמחזירות מיקומים ביחס למיקום קבוע. בדוגמאות הבאות מניחים שהאינדקס מכיל מסמכים עם שדות של נקודות גיאוגרפיות בשמות 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"
|
מאחזר מסמכים שבהם המילים great ו-keyboard מופיעות בשדות text, HTML או atom, ויש שדה מחיר עם ערך נמוך מ-5000.
הערך AND מובלע, והצורה השנייה שקולה.
|
"keyboard OR product=piano" |
שליפת מסמכים עם שדה מוצר שמכיל את המילה piano, או מסמכים עם שדה טקסט, HTML או atom שמכיל את המילה keyboard. |