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

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

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

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

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

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

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

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

2. נתוני אביב

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

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

המדריכים של Baeldung בנושא Spring Data מספקים את היסודות להתחלת הנושא.

2.1. תלות של Maven

Spring Data Elasticsearch מספק Java API עבור מנוע החיפוש. על מנת להשתמש בו עלינו להוסיף תלות חדשה ל- pom.xml:

 org.springframework.data spring-data-elasticsearch 4.0.0.RELEASE 

2.2. הגדרת ממשקי מאגר

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

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

בדוגמה שלנו נשתמש בתכונת ההחלפה בשיטות החיפוש המותאמות אישית שלנו:

ממשק ציבורי ArticleRepository מרחיב את ElasticsearchRepository {Page findByAuthorsName (שם מחרוזת, עמוד ניתן לעמוד); @Query ("{\" bool \ ": {\" must \ ": [{\" match \ ": {\" author.name \ ": \"? 0 \ "}}}}") דף findByAuthorsNameUsingCustomQuery (שם מחרוזת, דף ניתן לעמוד); }

עם ה findByAuthorsName שיטה, ה- proxy של המאגר ייצור יישום המבוסס על שם השיטה. אלגוריתם הרזולוציה יקבע שהוא צריך לגשת ל מחברים ולאחר מכן חפש ב- שֵׁם רכוש של כל פריט.

השיטה השנייה, findByAuthorsNameUsingCustomQuery, משתמש בשאילתת בוליאן מותאמת אישית של Elasticsearch, המוגדרת באמצעות @שאילתא ביאור, המחייב התאמה קפדנית בין שם הכותב לסיפוק שֵׁם טַעֲנָה.

2.3. תצורת Java

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

@Configuration @EnableElasticsearchRepositories (basePackages = "com.baeldung.spring.data.es.repository") @ComponentScan (basePackages = {"com.baeldung.spring.data.es.service"}) Config בכיתה {@Bean הציבור RestHighLevelClient client () {ClientConfiguration clientConfiguration = ClientConfiguration.builder () .connectedTo ("localhost: 9200") .build (); החזר RestClients.create (clientConfiguration) .rest (); } @Bean ElasticsearchOperations ציבוריים elasticsearchTemplate () {להחזיר ElasticsearchRestTemplate חדש (לקוח ()); }}

אנו משתמשים בביאור סטנדרטי סטנדרטי המותאם לאביב. @EnableElasticsearch מאגרים יגרום לחיפוש אלסטיקס של Spring Data לסרוק את החבילה שסופקה עבור מאגרי Spring Data.

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

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

3. מיפוי

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

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

@Document (indexName = "blog", type = "article") כיתה ציבורית מאמר {@ Id פרטי מחרוזת; כותרת מחרוזת פרטית; @Field (type = FieldType.Nested, includeInParent = true) מחברי רשימה פרטית; // סטרים וקובעים סטנדרטיים}

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

ה מחברים שדה מסומן כ FieldType. מקונן. זה מאפשר לנו להגדיר את מְחַבֵּר בכיתה בנפרד, אך מקורות הפרט של המחבר מוטמעים בתוכנה מאמר מסמך כאשר הוא באינדקס ב- Elasticsearch.

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

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

elasticsearchTemplate.indexOps (Article.class) .create ();

לאחר מכן נוכל להוסיף מסמכים לאינדקס:

מאמר מאמר = מאמר חדש ("Spring Data Elasticsearch"); article.setAuthors (asList (מחבר חדש ("ג'ון סמית"), מחבר חדש ("John Doe"))); articleRepository.save (מאמר);

5. שאילתות

5.1. שאילתת שמות מבוססת-שיטה

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

מחרוזת nameToFind = "ג'ון סמית"; עמוד ArticleByAuthorName = articleRepository.findByAuthorsName (nameToFind, PageRequest.of (0, 10));

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

5.2. שאילתה מותאמת אישית

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

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

צורך לחפש מאמרים עם הכיתוב "נתוניםבכותרת, נוכל פשוט ליצור NativeSearchQueryBuilder עם פילטר על כותרת:

Query searchQuery = new NativeSearchQueryBuilder () .withFilter (regexpQuery ("title", ". * Data. *")) .Build (); מאמרי SearchHits = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("בלוג");

6. עדכון ומחיקה

כדי לעדכן מסמך, ראשית עלינו לאחזר אותו:

מחרוזת articleTitle = "חיפוש נתונים אלסטיים באביב"; Query searchQuery = חדש NativeSearchQueryBuilder () .withQuery (matchQuery ("title", articleTitle) .minimumShouldMatch ("75%")) .build (); מאמרים ב- SearchHits = elasticsearchTemplate.search (searchQuery, Article.class, IndexCoordinates.of ("blog"); מאמר במאמר = articles.getSearchHit (0) .getContent ();

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

article.setTitle ("תחילת העבודה עם מנועי חיפוש"); articleRepository.save (מאמר);

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

articleRepository.delete (מאמר);

אנחנו יכולים גם למחוק אותו על ידי תְעוּדַת זֶהוּת כשזה ידוע:

articleRepository.deleteById ("article_id");

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

articleRepository.deleteByTitle ("כותרת");

7. מסקנה

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

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