מנגנון חיפוש יעיל במיוחד בקוד פתוח – הכרות קצרה עם Elasticsearch

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

צלם/תמונה: Thomas Trutschel/ Getty Images Israel

מאת רענן גונן, ארכיטקט תוכנה ב-Nice

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

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

לשניהם גם קיימות חבילות משלימות בתשלום – עבור Elasticsearch השירות מוצע על ידי חברת Elastic שהוקמה על ידי היוצרים של Elasticsearch; ועבור Solr קיימות כמה חברות שמספקות מוצרים משלימים.

סך הכל מדובר בשני מוצרים דומים מאוד מבחינת התכונות שלהם. את ההשוואה המפורטת אפשר לקרוא כאן. ההבדל המהותי ביניהם הוא שהטרנד היום נוטה לעבר Elasticsearch מכיוון שהוא קצת יותר פשוט לשימוש והתקנה ומבוסס על REST ו-JSON שמאוד פופולריים לאחרונה.

מבנה אינדקס Apache Lucene

כאמור, כל מנועי החיפוש המובילים היום מבוססים על ספריית Apache Lucene לאינדוקס וחיפוש של המסמכים עצמם. ולכן נתחיל בהסבר קצר על מבנה האינדקס של Apache Lucene.

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

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

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

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

1. חלוקה למילים

2. המרה לאותיות קטנות

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

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

מבנה Elasticsearch

למען הפשטות, נתרכז במבנה של Elasticsearch. עבור Apache Solr העקרונות ברובם דומים, אבל השמות והפרטים שונים לעיתים. המידע בתוך Elasticsearch נשמר במבנה היררכי שמתחיל ברמה הכי עליונה ב-Elasticsearch Cluster (או: אשכול), אשר מורכב מנקודות קצה (Elasticsearch nodes) שמספרן יכול לנוע בין אחת לאלפים. קיימים כמה סוגים של Elasticsearch nodes, אבל פה נתמקד בשניים החשובים ביותר: Data Node ו-Master Node.

Data Node מכיל את המידע עצמו, כלומר את חלקי ה-Apache Lucene אינדקס ומאפשר גישה למידע, כלומר אינדוקס וחיפוש.

Master Node מבצע את משימות ניהול ה-Elasticsearch Cluster, ודואג בין היתר לחלוקה מאוזנת של חלקי האינדקס בין ה-Data Node באשכול.

האינדקס עצמו מחולק למספר חלקים אשר מכונים Shards. וה-Shards מחולקים בין ה-Data Nodes. לכל אינדקס יכולים להיות אפס או יותר עותקים זהים, שהם בעצם עותקים של ה-Shards של האינדקס. השימוש בעותקים מאפשר גם יתירות כאשר העותקים נמצאים על שרת אחר (ועדיף בדאטה סנטר אחר) וגם ביצועים גבוהים בזמן חיפוש.

בתוך האינדקס המסמכים מקובצים לפי סוגים (types). סוג מסמך הוא הגדרה לוגית של קבוצת מסמכים באותו האינדקס אשר להם סכימה דומה. כך שההיררכיה היא:

שימוש ב-Elasticsearch

אחד מהיתרונות של Elasticsearch הוא שהשימוש בו מבוסס על תקשורת HTTP לפי עקרונות REST.
כדי לייצר אינדקס חדש פונים בקריאת PUT לכתובת של אחת מנקודות קצה של ה- Elasticsearch Cluster, עם שם האינדקס החדש, ואת המאפיינים שלו מעבירים בגוף הקריאה כ-JSON.

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

חיפוש מתבצע באמצעות קריאת GET לשם אינדקס/_search:

בדוגמאות אלה מוצגות רק האפשרויות הבסיסיות ביותר.
Elasticsearch מאפשר מורכבות עצומה וגמישות בכל האספקטים. להסבר מפורט ודוגמאות כנסו לתיעוד של Elastic.

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

הכתבה בחסות NICE

אנו גאים להיות חברת תוכנה ישראלית העומדת בחזית הטכנולוגיה והחדשנות, ומובילה בתחומי ה- Analytics, ה- Cloud וה-Big Data . מוצרי החברה מספקים פתרונות בתחומי ניהול ואופטימיזציה של מרכזי שירות לקוחות ובתחומי מעקב וניטור של תנועות הון חשודות והלבנות הון, ונמצאים בשימוש של יותר מ-25,000 ארגונים, במעל 150 מדינות (לרבות 80 מתוך 100 החברות הגדולות הנכללות ברשימת ה - Fortune 100). לפרטים נוספים לחצו כאן

כתב אורח

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

הגב

8 Comments on "מנגנון חיפוש יעיל במיוחד בקוד פתוח – הכרות קצרה עם Elasticsearch"

avatar
Photo and Image Files
 
 
 
Audio and Video Files
 
 
 
Other File Types
 
 
 
Sort by:   newest | oldest | most voted
רועי
Guest

אחלה מאמר! שבוע הבא אני הולך לממש את זה אצלנו.. זה סוגר לי הרבה מאוד פינות.
תודה

רענן גונן
Guest

תודה רועי. שמח שהמאמר שלי עוזר לך.
בהצלחה במימוש!

יצחק כהן
Guest

ב"ה

האם המנוע הזה הוא רק בניית אינדקסים יבשים, או שהוא יודע לבנות אינדקסים הכוללים חישובים ?

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

תודה רבה כתבה פצצה

רענן גונן
Guest

תודה יצחק על הפירגון.
לשאלתך, ל-Elasticsearch יכולות אנליזה מרשימות. למידע נוסף אני ממליץ להתחיל כאן: https://www.elastic.co/guide/en/elasticsearch/guide/current/_analytics.html

יוסי
Guest

כתוב טוב ומאוד רלוונטי, תודה!

רענן גונן
Guest

תודה רבה יוסי!

מאיה
Guest

מה לגבי יכולות של חיפוש מורפולוגי בפרט בעברית?

ארתור גימפל
Guest

אפשרי על ידי שימוש במנוע של חברת מורפיקס – הם יצרו Analyzer המבין את המורפולוגיה העברית.

wpDiscuz

תגיות לכתבה: