מדריך לחיפוש אלסטיקה בג'אווה

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

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

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

2. התקנה

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

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

docker run -d --name es762 -p 9200: 9200 -e "discovery.type = single-node" elasticsearch: 7.6.2

כברירת מחדל, Elasticsearch מאזין ביציאת 9200 לשאילתות HTTP עתידיות. אנו יכולים לאמת שהוא הושק בהצלחה על ידי פתיחת ה- // localhost: 9200 / כתובת אתר בדפדפן המועדף עליך:

{"name": "M4ojISw", "cluster_name": "docker-cluster", "cluster_uuid": "CNnjvDZzRqeVP-B04D3CmA", "version": {"number": "7.6.2", "build_flavor": "default "," build_type ":" docker "," build_hash ":" 2f4c224 "," build_date ":" 2020-03-18T23: 22: 18.622755Z "," build_snapshot ": false," lucene_version ":" 8.4.0 " , "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.8.0-beta1"}, "tagline": "אתה יודע, לחיפוש"}

3. תצורת Maven

כעת, לאחר שהאשכול הבסיסי שלנו לחיפושי אלסטיקה מופעל, בואו נקפוץ ישר ללקוח Java. קודם כל, עלינו להכריז על התלות הבאה של מייבן pom.xml קוֹבֶץ:

 org.elasticsearch elasticsearch 7.6.2 

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

4. API של Java

לפני שנקפוץ ישר לשימוש בתכונות הראשיות של Java API, עלינו ליזום את ה- RestHighLevelClient:

ClientConfiguration clientConfiguration = ClientConfiguration.builder (). ConnectedTo ("localhost: 9200"). Build (); לקוח RestHighLevelClient = RestClients.create (clientConfiguration) .rest ();

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

ה אינדקס() פונקציה מאפשרת לאחסן מסמך JSON שרירותי ולהפוך אותו לחיפוש:

@ מבחן חלל ציבורי שניתןJsonString_whenJavaObject_thenIndexDocument () {String jsonObject = "{\" age \ ": 10, \" dateOfBirth \ ": 1471466076564," + "\" fullName \ ": \" John Doe \ "}"; בקשת IndexRequest = IndexRequest חדש ("אנשים"); request.source (jsonObject, XContentType.JSON); תגובת IndexResponse = client.index (בקשה, RequestOptions.DEFAULT); אינדקס מחרוזות = respons.getIndex (); גרסה ארוכה = response.getVersion (); assertEquals (Result.CREATED, response.getResult ()); assertEquals (1, גרסה); assertEquals ("אנשים", אינדקס); }

שימו לב שאפשר להשתמש כל ספריית JSON Java כדי ליצור ולעבד את המסמכים שלך. אם אינך מכיר אף אחד מאלה, תוכל להשתמש בעוזרי Elasticsearch כדי ליצור מסמכי JSON משלך:

XContentBuilder בונה = XContentFactory.jsonBuilder () .startObject (). שדה ("fullName", "מבחן"). שדה ("dateOfBirth", תאריך חדש ()). שדה ("גיל", "10"). EndObject () ; IndexRequest indexRequest = IndexRequest חדש ("אנשים"); indexRequest.source (בונה); תגובת IndexResponse = client.index (indexRequest, RequestOptions.DEFAULT); assertEquals (Result.CREATED, response.getResult ());

4.2. שאילתת מסמכים באינדקס

עכשיו שיש לנו אינדקס מסמך JSON הניתן לחיפוש שהוקלד, אנו יכולים להמשיך ולחפש באמצעות ה- לחפש() שיטה:

SearchRequest searchRequest = SearchRequest חדש (); תגובת SearchResponse = client.search (searchRequest, RequestOptions.DEFAULT); SearchHit [] searchHits = response.getHits (). GetHits (); תוצאות רשימה = Arrays.stream (searchHits) .map (hit -> JSON.parseObject (hit.getSourceAsString (), Person.class)) .collect (Collectors.toList ());

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

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

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

בונה SearchSourceBuilder = SearchSourceBuilder חדש () .postFilter (QueryBuilders.rangeQuery ("גיל"). מ (5). אל (15)); SearchRequest searchRequest = SearchRequest חדש (); searchRequest.searchType (SearchType.DFS_QUERY_THEN_FETCH); searchRequest.source (בונה); תגובת SearchResponse = client.search (searchRequest, RequestOptions.DEFAULT);

4.3. אחזור ומחיקה של מסמכים

ה לקבל() ולמחוק() שיטות מאפשרות לקבל או למחוק מסמך JSON מהאשכול באמצעות המזהה שלו:

GetRequest getRequest = GetRequest חדש ("אנשים"); getRequest.id (id); GetResponse getResponse = client.get (getRequest, RequestOptions.DEFAULT); // שדות תהליך DeleteRequest deleteRequest = DeleteRequest חדש ("אנשים"); deleteRequest.id (id); DeleteResponse deleteResponse = client.delete (deleteRequest, RequestOptions.DEFAULT);

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

5. QueryBuilders דוגמאות

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

הנה רשימה של השימושים הנפוצים ביותר ב- QueryBuilders ממשק API.

ה matchAllQuery () שיטה מחזירה א QueryBuilder אובייקט שתואם את כל המסמכים באשכול:

QueryBuilder matchAllQuery = QueryBuilders.matchAllQuery ();

ה rangeQuery () תואם למסמכים כאשר ערך השדה נמצא בטווח מסוים:

QueryBuilder matchDocumentsWithinRange = QueryBuilders .rangeQuery ("price"). From (15) .to (100)

מתן שם שדה - למשל. שם מלא, והערך המקביל - למשל פלוני אלמוני, ה matchQuery () השיטה תואמת את כל המסמכים לערך השדה המדויק:

QueryBuilder matchSpecificFieldQuery = QueryBuilders .matchQuery ("fullName", "John Doe");

אנחנו יכולים גם להשתמש ב- multiMatchQuery () שיטה לבניית גרסה מרובת שדות של שאילתת ההתאמה:

QueryBuilder matchSpecificFieldQuery = QueryBuilders.matchQuery ("טקסט שאני מחפש", "field_1", "field_2 ^ 3", "* _field_wildcard");

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

בדוגמה שלנו ה שדה_2 יש ערך דחיפה מוגדר לשלושה, מה שהופך אותו לחשוב יותר משאר התחומים. שים לב שאפשר להשתמש בתווים כלליים ובשאילתות regex, אך מבחינה ביצועית, היזהר מצריכת זיכרון ועיכוב זמן תגובה כאשר מתמודדים עם כרטיסי בר, ​​מכיוון שמשהו כמו * _apples עלול לגרום להשפעה עצומה על הביצועים.

מקדם החשיבות משמש להזמנת קבוצת התוצאות של הלהיטים שהוחזרו לאחר ביצוע ה- sחיפוש () שיטה.

אם אתה מכיר יותר את תחביר השאילתות של Lucene, אתה יכול להשתמש ב- simpleQueryStringQuery () שיטה להתאמה אישית של שאילתות חיפוש:

QueryBuilder simpleStringQuery = QueryBuilders .simpleQueryStringQuery ("+ John -Doe OR Janette");

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

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

6. מסקנה

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

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