שאילתות חיפוש אלסטיות עם נתוני אביב

1. הקדמה

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

2. מנתחים

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

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

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

לדוגמא, ב- מאמר נניח שאנחנו שומרים את שדה הכותרת כשדה מנותח סטנדרטי. אותו שדה עם הסיומת מִלָה בְּמִלָה יאוחסן כשדה שלא נותח:

@MultiField (mainField = @Field (type = Text, fielddata = true), otherFields = {@InnerField (סיומת = "מילולית", type = מילת מפתח)}) כותרת מחרוזת פרטית;

כאן, אנו מיישמים את @MultiField ביאור לספר ל- Spring Data שאנחנו רוצים שהשדה הזה יתווסף בכמה דרכים. השדה הראשי ישתמש בשם כותרת וינתח לפי הכללים שתוארו לעיל.

אך אנו מספקים גם הערה שנייה, @InnerField, המתאר אינדקס נוסף של ה- כותרת שדה. אנו משתמשים FieldType.keyword כדי לציין שאיננו רוצים להשתמש במנתח בעת ביצוע האינדקס הנוסף של השדה, וכי יש לאחסן ערך זה באמצעות שדה מקונן עם הסיומת מִלָה בְּמִלָה.

2.1. שדות מנותחים

בואו נסתכל על דוגמא. נניח מאמר עם הכותרת "Spring Data Elasticsearch" נוסף לאינדקס שלנו. מנתח ברירת המחדל יפרק את המחרוזת בתווי החלל ויפיק אסימונים קטנים: "אביב“, “נתונים", ו"חיפוש אלסטיות“.

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

NativeSearchQuery searchQuery = חדש NativeSearchQueryBuilder () .withQuery (matchQuery ("כותרת", "נתוני חיפוש אלסטיות")) .build ();

2.2. שדות שלא נותחו

שדה שאינו מנותח אינו מסומן, ולכן ניתן להתאים אותו בכללותו רק כאשר משתמשים בשאילתות התאמה או מונח:

NativeSearchQuery searchQuery = חדש NativeSearchQueryBuilder () .withQuery (matchQuery ("title.verbatim", "מאמר שני על חיפוש אלסטיקה")) .build ();

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

3. שאילתת התאמה

א שאילתת התאמה מקבל טקסט, מספרים ותאריכים.

ישנם שלושה סוגים של שאילתת "התאמה":

  • בוליאני
  • מִשׁפָּט ו
  • ביטוי_קידומת

בחלק זה נחקור את בוליאני שאילתת התאמה.

3.1. התאמה עם מפעילים בוליאניים

בוליאני הוא סוג ברירת המחדל של שאילתת התאמה; אתה יכול לציין באיזה אופרטור בוליאני להשתמש (אוֹ הוא ברירת המחדל):

NativeSearchQuery searchQuery = חדש NativeSearchQueryBuilder () .withQuery (matchQuery ("כותרת", "מנועי חיפוש"). אופרטור (Operator.AND)) .build (); מאמרים ב- SearchHits = elasticsearchTemplate () .search (searchQuery, Article.class, IndexCoordinates.of ("blog"));

שאילתה זו תחזיר מאמר עם הכותרת "מנועי חיפוש" על ידי ציון שני מונחים מהכותרת עם ו מַפעִיל. אבל מה יקרה אם נחפש עם ברירת המחדל (אוֹ) מפעיל כאשר רק אחד מהמונחים תואם?

NativeSearchQuery searchQuery = חדש NativeSearchQueryBuilder () .withQuery (matchQuery ("כותרת", "פתרונות מנועים")) .build (); מאמרים ב- SearchHits = elasticsearchTemplate () .search (searchQuery, Article.class, IndexCoordinates.of ("blog")); assertEquals (1, articles.getTotalHits ()); assertEquals ("מנועי חיפוש", articles.getSearchHit (0) .getContent (). getTitle ());

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

סכום הציונים של כל מונח תואם מסתכם בציון הכולל של כל מסמך שהתקבל.

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

3.2. חוֹסֶר בְּהִירוּת

כאשר המשתמש מבצע שגיאת הקלדה במילה, עדיין ניתן להתאים אותה לחיפוש על ידי ציון a חוֹסֶר בְּהִירוּת פרמטר, המאפשר התאמה לא מדויקת.

עבור שדות מחרוזת, חוֹסֶר בְּהִירוּת פירושו מרחק העריכה: מספר השינויים בתו אחד שיש לבצע במחרוזת אחת כדי להפוך אותו למחרוזת אחרת.

NativeSearchQuery searchQuery = חדש NativeSearchQueryBuilder () .withQuery (matchQuery ("כותרת", "חיפוש גמיש תאריך האביב"). מפעיל (Operator.AND) .fuzziness (Fuzziness.ONE). PrefixLength (3)). בניין ();

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

5. חיפוש ביטויים

חיפוש שלב הוא מחמיר, אם כי אתה יכול לשלוט בו באמצעות ה- סלופ פָּרָמֶטֶר. פרמטר זה מספר את ביטוי השאילתה כמה מונחים זה מזה יכולים להיות מונחים זה מזה תוך בחינת המסמך כהתאמה.

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

NativeSearchQuery searchQuery = חדש NativeSearchQueryBuilder () .withQuery (matchPhraseQuery ("title", "elasticsearch"). Slop (1)) .build ();

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

6. שאילתת Multi Match

כשתרצה לחפש במספר שדות אז תוכל להשתמש QueryBuilders # multiMatchQuery () שם אתה מציין את כל השדות להתאמה:

NativeSearchQuery searchQuery = חדש NativeSearchQueryBuilder () .withQuery (multiMatchQuery ("הדרכה"). שדה ("כותרת"). שדה ("תגים"). סוג (MultiMatchQueryBuilder.Type.BEST_FIELDS)). בניין ();

כאן אנו מחפשים את כותרת ו תגים שדות להתאמה.

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

7. צבירות

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

זכור כי מכיוון שהשדה אינו מנותח, התגים לא יסומנו:

תנאי צבירה של תנאי אגרה = אגרגציה בניינים ("top_tags"). שדה ("תגים"). סדר (Terms.Order.count (false)); בונה SearchSourceBuilder = SearchSourceBuilder חדש (). צבירה (צבירה); SearchRequest searchRequest = חדש SearchRequest (). מדדים ("בלוג"). סוגים ("מאמר"). מקור (בונה); תגובת SearchResponse = client.search (searchRequest, RequestOptions.DEFAULT); תוצאות מפה = response.getAggregations (). AsMap (); StringTerms topTags = (StringTerms) results.get ("top_tags"); מקשי רשימה = topTags.getBuckets () .stream () .map (b -> b.getKeyAsString ()) .collect (toList ()); assertEquals (asList ("חיפוש אלסטיקה", "נתוני קפיץ", "מנועי חיפוש", "הדרכה"), מקשים);

8. סיכום

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

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

Elasticsearch מספק סוגים רבים אחרים של שאילתות, כגון שאילתות גיאוגרפיות, שאילתות סקריפט ושאילתות מורכבות. אתה יכול לקרוא עליהם בתיעוד Elasticsearch ולחקור את ה- API של Spring Data Elasticsearch כדי להשתמש בשאילתות אלה בקוד שלך.

תוכל למצוא פרויקט המכיל את הדוגמאות המשמשות במאמר זה במאגר GitHub.


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