1. แนวคิดสำหรับการค้นหาเนื้อหาบทความ
บทความก่อนหน้านี้พูดคุยเกี่ยวกับวิธีการรวม ES 5 ใน Spring Boot 2.0 บทความนี้พูดถึงมาตรการปฏิบัติเฉพาะ พูดคุยสั้น ๆ เกี่ยวกับวิธีการใช้งานบทความและคำถามและคำตอบโดยเฉพาะ แนวคิดการใช้งานนั้นง่ายมาก:
หากคุณโทรหาการค้นหาโดยตรงที่นี่คุณสามารถค้นหาสิ่งที่ไม่น่าพอใจได้อย่างง่ายดาย เนื่องจากการค้นหาเนื้อหามุ่งเน้นไปที่การเชื่อมต่อของเนื้อหา ดังนั้นวิธีการประมวลผลที่นี่ค่อนข้างต่ำและฉันหวังว่าจะได้วิธีการค้นหาที่ดีขึ้นด้วยการสื่อสารที่มากขึ้น มันคือการได้รับวลีมากมายผ่านคำที่เป็นคำและจากนั้นใช้วลีเพื่อให้ตรงกับวลีที่แม่นยำ
การติดตั้งปลั๊กอิน segmenter IK Word Segmenter นั้นง่ายมาก ขั้นตอนแรกคือการดาวน์โหลดเวอร์ชันที่เกี่ยวข้อง https://github.com/medcl/elasticsearch-analysis-ik/releases ขั้นตอนที่สองคือการสร้างโฟลเดอร์ใหม่ IK ในไดเรกทอรี ElasticSearch-5.5.3/ปลั๊กอินและคัดลอกไฟล์คลายซิปของ ElasticSearch-Analysis-IK-5.5.3 Zip ไปยัง ElasticSearch-5.1.1/ปลั๊กอิน/IK ในที่สุดรีสตาร์ท es
2. การค้นหาเนื้อหาของเนื้อหา
ติดตั้ง IK เรียกมันอย่างไร?
ขั้นตอนแรกคือเมื่อฉันค้นหาเนื้อหาที่นี่ฉันจะส่งผ่านด้วยเครื่องหมายจุลภาค ดังนั้นเครื่องหมายจุลภาคจะถูกแบ่งก่อน
ขั้นตอนที่สองคือการเพิ่มตัวเองลงในคำค้นหาเพราะคำบางคำหายไปหลังจากการมีส่วนร่วมของ IK ... นี่คือข้อผิดพลาด
ขั้นตอนที่สามคือการใช้วัตถุ AnalyzerequestBuilder เพื่อรับรายการวัตถุค่าผลตอบแทนหลังจากคำนาม IK
ขั้นตอนที่ 4: เพิ่มประสิทธิภาพคำว่าคำนาม ตัวอย่างเช่นหากทุกคำเป็นคำพูดทั้งหมด หากมีคำและคำพูดให้เก็บคำ หากมีเพียงคำเดียวให้เก็บคำ
รหัสการใช้งานหลักมีดังนี้:
/ *** การค้นหาเนื้อหาโดยเฉพาะ*/ รายการที่ได้รับการป้องกัน <String> HandlingSearchContent (String SearchContent) {รายการ <String> SearchTermResultList = new ArrayList <> (); // แยกด้วยเครื่องหมายจุลภาคเพื่อรับรายการคำศัพท์รายการ <string> searchtermList = array.aslist (searchContent.split (searchConstant.string_token_split)); // ถ้าคำค้นหามากกว่า 1 คำคำนามของคำ IK จะได้รับโดยการได้รับคำว่าคำศัพท์รายการผลการค้นหา ttermList.foreach (searchterm -> {// แท็กคำค้นหาเพิ่มรายการคำค้นหาเอง - ส่งคืน SeelchTermResultList; } / *** การโทรหา ES เพื่อรับผลลัพธ์หลังจาก IK materiPle* / รายการที่ได้รับการป้องกัน <string> getIkanalyzesearchTerms (สตริงค้นหา) {AnalyzerequestBuilder ikrequest = new AnalyzerequestBuilder (elasticSearchTemplate.getClient ikrequest.settokenizer (searchConstant.tokenizer_ik_max); list <analyzeresponse.analyzetoken> iktokenlist = ikrequest.execute (). actionget (). getTokens (); // รายการการกำหนดลูป <String> searchTermList = new ArrayList <> (); iktokenlist.foreach (iktoken -> {searchtermlist.add (iktoken.getterm ());}); ส่งคืน handlingikresultterms (รายการค้นหา); } / ** * ถ้าคำศัพท์คำศัพท์: แชมพู (แชมพู, ผม, แชมพู, ผม, น้ำ) * - เป็นคำทั้งหมด, ให้ * - คำ + คำ, คำเท่านั้น * - เป็นคำทั้งหมด, เก็บคำ * / รายการส่วนตัว <String> HandleIkResultterms บูลีน ISWORD = FALSE; สำหรับ (สตริงเทอม: searchtermList) {if (term.length ()> searchConstant.search_term_length) {isphrase = true; } else {isword = true; }} if (isword & isphrase) {list <string> phraselist = new ArrayList <> (); searchtermlist.foreach (คำ -> {if (term.length ()> searchConstant.search_term_length) {phraselist.add (เทอม);}}); ส่งคืนวลี; } return searchtermlist; -3. คำสั่งค้นหา
สร้างวัตถุการแจงนับเนื้อหาและแสดงรายการฟิลด์ที่จำเป็นต้องค้นหา รหัส contentSearchTermenum มีดังนี้:
นำเข้า lombok.allargSconstructor; @AllArgSconstructorPublic enum contentSearchTermenum {// ชื่อเรื่อง ("ชื่อ"), // เนื้อหาเนื้อหา ("เนื้อหา"); / *** ฟิลด์ค้นหา*/ ชื่อสตริงส่วนตัว; สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; -ลูปฟิลด์ "การค้นหาการค้นหาโทรศัพท์" และตั้งค่าน้ำหนักขั้นต่ำเป็น 1 รหัสหลักมีดังนี้:
/ *** สร้างเงื่อนไขการสืบค้น*/ โมฆะส่วนตัว buildMatchQuery (boolQueryBuilder queryBuilder, รายการ <String> SearchTermList) {สำหรับ (String SearchTerm: SearchTermList) {สำหรับ (contentSearchTermenum selektermenum: contentSearchTermenum.values ()) querybuilder.should (querybuilders.matchphraseQuery (searchtermenum.getName (), searchterm)); }} queryBuilder.minimumshouldMatch (SearchConstant.minimum_should_match); -4. เงื่อนไขตัวกรอง
มีมากกว่าหนึ่งสิ่งที่จะค้นหาและบางครั้งความต้องการก็เป็นเช่นนี้ คุณต้องค้นหาภายใต้หมวดหมู่ที่แน่นอนเช่นอีคอมเมิร์ซจำเป็นต้องค้นหาผลิตภัณฑ์ภายใต้แบรนด์บางอย่าง จากนั้นคุณต้องสร้าง fitlers บางตัวสำหรับการกรอง สอดคล้องกับคำสั่ง SQL หรือและและภายใต้ที่ ใช้วิธีการกรองเพื่อเพิ่มการกรองใน ES รหัสมีดังนี้:
/ *** สร้างตัวกรอง*/ โมฆะส่วนตัว buildFilterQuery (boolQueryBuilder boolQueryBuilder, ประเภทจำนวนเต็ม, หมวดหมู่สตริง) {// ตัวกรองประเภทเนื้อหาถ้า (พิมพ์! typeFilterBuilder.should (queryBuilders.MatchQuery (searchConstant.type_name, ประเภท) .Lenient (จริง)); boolQueryBuilder.filter (typeFilterBuilder); } // ตัวกรองหมวดหมู่เนื้อหาถ้า (! stringUtils.isEmpty (หมวดหมู่)) {boolQueryBuilder หมวดหมู่ FilterBuilder = queryBuilders.boolQuery (); CategoryFilterBuilder.should (queryBuilders.MatchQuery (SearchConstant.Category_name, หมวดหมู่) .Lenient (จริง)); boolQueryBuilder.filter (CategoryFilterBuilder); -Type เป็นคลาสขนาดใหญ่และหมวดหมู่เป็นคลาสขนาดเล็กเพื่อให้สามารถรองรับขนาดและการกรองคลาส แต่ถ้าคุณต้องการค้นหาใน type = 1 หรือ type = 2 รหัสการใช้งานเฉพาะนั้นง่ายมาก:
TypeFilterBuilder. ควร (queryBuilders.MatchQuery (SearchConstant.type_name, 1). ควร (queryBuilders.MatchQuery (SearchConstant.type_name, 2) .Lenient (จริง));
ผ่านการแสดงออกของห่วงโซ่สองควรใช้หรือนั่นคือคำสั่งหรือที่สอดคล้องกับ SQL การดำเนินการตามคำสั่งและคำสั่งที่สอดคล้องกับ SQL นั้นทำได้ผ่าน BoolQueryBuilders สองคน
5. เงื่อนไขการเพจและการเรียงลำดับ
รหัสการเรียงลำดับเพจนั้นง่ายมาก:
@Override Public Pagebean SearchContent (ContentSearchBean ContentSearchBean) {จำนวนเต็ม pagenumber = contentSearchBean.getPagenumber (); จำนวนเต็ม pageSize = contentSearchBean.getPagesize (); PageBean <ContentEntity> resultPagebean = new PageBean <> (); ResultPagebean.setPagenumber (Pagenumber); ResultPageBean.setPagesize (Pagesize); // สร้างวลีการค้นหาสตริง searchContent = contentSearchBean.getSearchContent (); รายการ <String> searchTermList = handlingSearchContent (searchContent); // สร้างเงื่อนไขการสืบค้น boolQueryBuilder boolQueryBuilder = queryBuilders.boolQuery (); BuildMatchQuery (BoolQueryBuilder, SearchTermList); // สร้างเงื่อนไขตัวกรอง buildFilterQuery (boolQueryBuilder, contentSearchBean.getType (), contentSearchBean.getCategory ()); // สร้างเงื่อนไขการเพจและการเรียงลำดับที่สามารถจัดทำ page ได้ = pageRequest.of (pagenumber, pageSize); if (! stringUtils.isEmpty (contentSearchBean.getOrderName ())) {pageable = pageRequest.of (pagenumber, pagesize, sort.direction.desc, contentSearchBean.getOrderName ()); } SearchQuery SearchQuery = ใหม่ NativeSearchQueryBuilder (). withpageable (pageable). withQuery (boolQueryBuilder) .build (); // search logger.info (" /n contentserviceimpl.searchContent () [" + searchContent + "] /n dsl = /n" + searchQuery.getQuery (). toString ()); Page <pontentEntity> ContentPage = ContentRepository.Search (SearchQuery); ResultPageBean.setResult (ContentPage.getContent ()); ResultPagebean.settotalcount ((int) ContentPage.getTotalelements ()); ResultPageBean.settotalPage ((int) ContentPage.getTotalelements ()); ResultPagebean.settotalPage ((int) ContentPage.getTotalElements () / resultPageBean.getPagesize () + 1); Return ResultPagebean; -ใช้วัตถุที่สามารถ pageable เพื่อสร้างพารามิเตอร์การเพจและระบุฟิลด์การเรียงลำดับที่สอดคล้องกันและลำดับการเรียงลำดับ (DESC ASC)
6. สรุป
ความคิดนี้ค่อนข้างง่าย ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น