מבוא מהיר לחיפוש טקסט מלא עם ElasticSearch

עליון התמדה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. סקירה כללית

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

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

מאמר זה בוחן את ElasticSearch REST API ומדגים פעולות בסיסיות באמצעות בקשות HTTP בלבד.

2. התקנה

על מנת להתקין את ElasticSearch במחשב שלך, עיין במדריך ההתקנה הרשמי.

ה- API של RESTfull פועל ביציאה 9200. הבה נבדוק אם הוא פועל כראוי באמצעות פקודת התלתל הבאה:

תלתל -XGET '// localhost: 9200 /'

אם אתה צופה בתגובה הבאה, המופע פועל כהלכה:

{"name": "NaIlQWU", "cluster_name": "elasticsearch", "cluster_uuid": "enkBkWqqQrS0vp_NXmjQMQ", "version": {"number": "5.1.2", "build_hash": "c8c4c16", "build_date ":" 2017-01-11T20: 18: 39.146Z "," build_snapshot ": false," lucene_version ":" 6.3.0 "}," tagline ":" אתה יודע, לחיפוש "}

3. יצירת מסמכים לאינדקס

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

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

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

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

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

אנו הולכים לאחסן את המסמכים שלנו באמצעות התוכנית הבאה:

טֶקסט: שם האינדקס.

מאמר: שם הסוג.

תְעוּדַת זֶהוּת: המזהה של הזנת טקסט לדוגמה זו.

כדי להוסיף מסמך אנו נפעיל את הפקודה הבאה:

תלתל -XPUT 'localhost: 9200 / טקסט / מאמר / 1? יפה' -H 'סוג תוכן: יישום / json' -d '{"title": "הוא הלך", "random_text": "הוא הלך כל כך להעז טוב עובדה. שבעת הגילאים הצילה האיש הקטן. " } '

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

4. אחזור מסמכים

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

סלסול -XGET '// localhost: 9200 / _count? pretty' -d '{"query": {"match_all": {}}}' 

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

תלתל -XGET 'localhost: 9200 / טקסט / מאמר / 1? יפה' 

ועלינו לקבל את התשובה הבאה מחיפוש אלסטי:

{"_index": "text", "_type": "article", "_id": "1", "_version": 1, "found": true, "_source": {"title": "He went" , "אקראי_טקסט": "הוא הלך בעובדה כזו טובה ומעזה. שבעת הגברים הקטנה הצילה את הגבר." }}

כפי שניתן לראות תשובה זו מתכתבת עם הערך שנוסף באמצעות מזהה 1.

5. שאילתת מסמכים

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

סלסול -XGET 'localhost: 9200 / text / article / _search? pretty' -H 'סוג תוכן: application / json' -d '{"query": {"match": {"random_text": "his departure"} }} '

ואנחנו מקבלים את התוצאה הבאה:

{"לקח": 32, "timed_out": שקר, "_shards": {"סה"כ": 5, "מוצלח": 5, "נכשל": 0}, "hits": {"סה"כ": 2, "max_score ": 1.4513469," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" חינוך ישן "," אקראי_טקסט ":" השכלה ישנה לו עזיבת כל סידור גברה. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.28582606, "_source": {"title": "שאלות דוחה", "random_text ":" שאלות דוחות השפיעו עליו מעטים תומכים נרחבים. " }}]}}

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

התוצאה השנייה מתקבלת מאחר ומסמך היעד מכיל את המילה "אותו".

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

6. חיפוש מטושטש

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

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

  • 0 למחרוזות של תו אחד או שניים
  • 1 לחוטים של שלוש, ארבע או חמש תווים
  • 2 לחוטים של יותר מחמש תווים

יתכן שתגלה שמרחק העריכה של 2 מחזיר תוצאות שלא נראות קשורות.

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

בסדר בואו נבצע את החיפוש שלנו בתמיהה:

סלסול -XGET 'localhost: 9200 / text / article / _search? pretty' -H 'סוג תוכן: application / json' -d '{"query": {"match": {"random_text": {"query": "עזיבתו", "fuzziness": "2"}}}} '

והנה התוצאה:

{"לקח": 88, "timed_out": false, "_shards": {"סה"כ": 5, "מצליח": 5, "נכשל": 0}, "hits": {"סה"כ": 4, "max_score ": 1.5834423," hits ": [{" _index ":" text "," _type ":" article "," _id ":" 4 "," _score ": 1.4513469," _source ": {" title ":" חינוך ישן "," אקראי_טקסט ":" השכלה ישנה לו עזיבת כל סידור גברה. " }}, {"_index": "text", "_type": "article", "_id": "2", "_score": 0.41093433, "_source": {"title": "הוא מתנגד", "random_text ":" הוא מתנגד לתשוקה מושלכת של לא. \ הכרזה על רושם שלא הושפע ביום שלו פינוק ללא סייג. " }}, {"_index": "text", "_type": "article", "_id": "3", "_score": 0.2876821, "_source": {"title": "שאלות דוחה", "random_text ":" שאלות דוחות השפיעו עליו מעטים תומכים נרחבים. " }}, {"_index": "text", "_type": "article", "_id": "1", "_score": 0.0, "_source": {"title": "he went", "random_text ":" הוא הלך בעובדה כל כך מעזה. שבעת הגילאים הצילה האישים הקטנים. " }}]}} '

כפי שאנו רואים את הטשטוש תן לנו תוצאות נוספות.

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

7. מסקנה

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

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

תחתית התמדה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found