חיפוש בטקסט מלא עם Solr

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

במאמר זה נחקור מושג בסיסי במנוע החיפוש Apache Solr - חיפוש טקסט מלא.

ה- Apache Solr הוא מסגרת קוד פתוח, שנועדה להתמודד עם מיליוני מסמכים. נעבור על יכולות הליבה שלו עם דוגמאות באמצעות ספריית Java - SolrJ.

2. תצורת Maven

לאור העובדה ש- Solr הוא קוד פתוח - אנו יכולים פשוט להוריד את הבינארי ולהפעיל את השרת בנפרד מהיישום שלנו.

כדי לתקשר עם השרת, נגדיר את התלות של Maven עבור לקוח SolrJ:

 org.apache.solr solr-solrj 6.4.2 

אתה יכול למצוא את התלות האחרונה כאן.

3. נתוני אינדקס

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

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

ישנן דרכים רבות ושונות בהן אנו יכולים להוסיף נתונים לאינדקס. אנו יכולים להשתמש במטפלים בייבוא ​​נתונים כדי לייבא נתונים ישירות ממאגרי מידע יחסיים, להעלות נתונים עם Solr Cell באמצעות Apache Tika או להעלות נתוני XML / XSLT, JSON ו- CSV באמצעות מטפלי אינדקס.

3.1. יצירת אינדקס של מסמך Solr

אנו יכולים להוסיף נתונים לאינדקס הליבה על ידי יצירה SolrInputDocument. ראשית, עלינו לאכלס את המסמך בנתונים שלנו ואז להתקשר רק לממשק ה- API של SolrJ כדי להוסיף את המסמך לאינדקס:

SolrInputDocument doc = SolrInputDocument חדש (); doc.addField ("id", id); doc.addField ("תיאור", תיאור); doc.addField ("קטגוריה", קטגוריה); doc.addField ("מחיר", מחיר); solrClient.add (doc); solrClient.commit ();

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

3.2. אינדקס שעועית

SolrJ מספקת ממשקי API לאינדקס שעועית ג'אווה. כדי להוסיף שעועית לאינדקס, עלינו להעלות עליה הערה באמצעות ה- @שדה ביאורים:

פריט בכיתה ציבורית {@Field מזהה מחרוזת פרטי; @Field תיאור מחרוזת פרטי; קטגוריית מחרוזת פרטית @Field; מחיר צף פרטי של שדה; }

ברגע שיש לנו את השעועית, האינדקס הוא ישר קדימה:

solrClient.addBean (פריט); solrClient.commit ();

4. שאילתות סולר

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

4.1. שאילתות בסיסיות

השרת חושף ממשק API לפעולות חיפוש. אנחנו יכולים להתקשר /בחר אוֹ /שאילתא מטפלים בבקשה.

בואו נעשה חיפוש פשוט:

שאילתת SolrQuery = SolrQuery חדשה (); query.setQuery ("brand1"); query.setStart (0); query.setRows (10); תגובה QueryResponse = solrClient.query (שאילתה); פריטי רשימה = response.getBeans (Item.class);

SolrJ ישתמש באופן פנימי בפרמטר השאילתה הראשי ש בבקשתו לשרת. מספר הרשומות שהוחזרו יהיה 10, באינדקס מאפס מתי הַתחָלָה ו שורות אינם מוגדרים.

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

בואו נסתכל על דוגמא אחרת. אנו רוצים לחפש כל מילה המכילה "ראנד", שמתחיל במספר תווים כלשהו ומסתיים בתו אחד בלבד. אנו יכולים להשתמש בתווים כלליים * ו ? בשאילתה שלנו:

query.setQuery ("* ראנד?");

שאילתות Solr תומכות גם במפעילים בוליאניים כמו ב- SQL:

query.setQuery ("brand1 AND (כביסה או מקרר)");

כל המפעילים הבוליאניים חייבים להיות בכל הכובעים; אלה המגובים על ידי מנתח השאילתות הם AND, או שלא, + ו -.

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

query.setQuery ("תיאור: מותג * וקטגוריה: * כביסה *");

4.2. שאילתות ביטוי

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

query.setQuery ("מכונת כביסה");

כשיש לנו ביטוי כמו “מכונת כביסה", מנתח השאילתות הסטנדרטי של סול מנתח אותו ל"כביסה או מכונה". כדי לחפש ביטוי שלם, אנו יכולים להוסיף רק את הביטוי בתוך מרכאות כפולות:

query.setQuery ("\" מכונת כביסה \ "");

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

query.setQuery ("\" ציוד כביסה \ "~ 2");

4.3. שאילתות טווח

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

נניח שאנחנו רוצים למצוא פריטים שמחירם נע בין 100 ל -300:

query.setQuery ("מחיר: [100 עד 300]");

השאילתה לעיל תמצא את כל האלמנטים שמחירם נע בין 100 ל -300, כולל. אנחנו יכולים להשתמש "}"ו"{"כדי לא לכלול נקודות סיום:

query.setQuery ("מחיר: {100 עד 300]");

4.4. שאילתות סינון

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

שאילתת SolrQuery = SolrQuery חדשה (); query.setQuery ("מחיר: [100 עד 300]"); query.addFilterQuery ("תיאור: Brand1", "קטגוריה: מכשירי חשמל ביתיים");

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

5. חיפוש פנים

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

5.1. פנים בשטח

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

query.addFacetField ("קטגוריה"); תגובה QueryResponse = solrClient.query (שאילתה); רשימת facetResults = response.getFacetField ("קטגוריה"). GetValues ​​();

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

5.2. פניית שאילתות

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

query.addFacetQuery ("כביסה או מקרר"); query.addFacetQuery ("Brand2"); תגובה QueryResponse = solrClient.query (שאילתה); מפה facetQueryMap = respons.getFacetQuery ();

כתוצאה מכך, facetQueryMap יהיו ספירות של שאילתות פנים.

5.3. היבט לטווח

רישוי פנים לטווח משמש כדי לקבל את ספירת הטווחים בתוצאות החיפוש. השאילתה הבאה תחזיר את ספירות המחירים שבין 100 ל -251, בהפרש של 25:

query.addNumericRangeFacet ("מחיר", 100, 275, 25); תגובה QueryResponse = solrClient.query (שאילתה); רשימת rangeFacets = response.getFacetRanges (). Get (0) .getCounts ();

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

6. הדגשת הכה

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

itemSearchService.index ("hm0001", "מכונת כביסה Brand1", "מכשירי חשמל ביתיים", 100f); itemSearchService.index ("hm0002", "מקרר Brand1", "מכשירי חשמל ביתיים", 300f); itemSearchService.index ("hm0003", "מאוורר תקרה Brand2", "מכשירי חשמל ביתיים", 200f); itemSearchService.index ("hm0004", "מדיח כלים Brand2", "ציוד כביסה", 250f); שאילתת SolrQuery = SolrQuery חדשה (); query.setQuery ("מכשירי חשמל"); query.setHighlight (נכון); query.addHighlightField ("קטגוריה"); תגובה QueryResponse = solrClient.query (שאילתה); מַפָּה> hitHighlightedMap = response.getHighlighting (); מַפָּה highlightedFieldMap = hitHighlightedMap.get ("hm0001"); רשימה highlightedList = highlightedFieldMap.get ("קטגוריה"); מחרוזת highLightedText = highlightedList.get (0);

נקבל את highLightedText כפי ש "בית מכשירים. שימו לב שמילת המפתח לחיפוש מכשירים מתויג עם . תג ברירת המחדל להדגשה המשמש Solr הוא , אך אנו יכולים לשנות זאת על ידי הגדרת ה- מִרֹאשׁ ו הודעה תגיות:

query.setHighlightSimplePre (""); query.setHighlightSimplePost ("");

7. הצעות חיפוש

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

7.1. בדיקת איות

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

בואו נחפש מילת מפתח עם שגיאת כתיב:

query.setQuery ("hme"); query.set ("בדיקת איות", "פועל"); תגובה QueryResponse = solrClient.query (שאילתה); SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse (); הצעת הצעה = spellCheckResponse.getSuggestions (). Get (0); רשימת חלופות = suggestion.getAlternatives (); אלטרנטיבה מחרוזת = חלופות. Get (0);

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

7.2. הצעה אוטומטית לתנאים

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

הגדרנו מטפל בקשות בשם /לְהַצִיעַ לטפל בהצעות. בואו נקבל הצעות למילת מפתח "הום":

שאילתת SolrQuery = SolrQuery חדשה (); query.setRequestHandler ("/ suggest"); query.set ("suggest", "true"); query.set ("suggest.build", "true"); query.set ("suggest.diction", "mySuggester"); query.set ("suggest.q", "Hom"); תגובה QueryResponse = solrClient.query (שאילתה); SuggesterResponse suggesterResponse = response.getSuggesterResponse (); מַפָּה suggestedTerms = suggesterResponse.getSuggestedTerms (); הצעות רשימה = suggestTerms.get ("mySuggester");

הרשימה הצעות צריך להכיל את כל המילים והביטויים. שים לב שהגדרנו סוגסטר בשם mySuggester בתצורה שלנו.

8. מסקנה

מאמר זה הוא מבוא מהיר ליכולות ותכונותיו של מנוע החיפוש ב- Solr.

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

הדוגמאות המשמשות כאן זמינות כתמיד, באתר GitHub.


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