1. Ide untuk mencari konten artikel
Artikel sebelumnya berbicara tentang cara mengintegrasikan ES 5 di Spring Boot 2.0. Artikel ini berbicara tentang langkah -langkah praktis spesifik. Mari kita bicara secara singkat tentang cara mengimplementasikan implementasi spesifik artikel dan pertanyaan dan jawaban. Ide implementasinya sangat sederhana:
Jika Anda menelepon pencarian langsung di sini, Anda dapat dengan mudah menemukan hal -hal yang tidak memuaskan. Karena pencarian konten berfokus pada konektivitas konten. Jadi metode pemrosesan di sini relatif rendah, dan saya berharap untuk mencapai metode pencarian yang lebih baik dengan lebih banyak komunikasi. Ini untuk mendapatkan banyak frasa melalui kata participle, dan kemudian menggunakan frasa untuk mencocokkan frasa secara akurat.
Instalasi ES dari plug-in Segmenter Word IK sangat sederhana. Langkah pertama adalah mengunduh versi yang sesuai https://github.com/medcl/elasticsearch-analysis-ik/releases. Langkah kedua adalah membuat folder baru IK di Direktori Elasticsearch-5.5.3/Plugins, dan menyalin file unzip elasticsearch-analysis-IK-5.5.3.zip ke direktori Elasticsearch-5.1.1/plugin/IK. Akhirnya restart es.
2. Pencarian konten participle
Instal IK, bagaimana menyebutnya?
Langkah pertama adalah ketika saya mencari konten di sini, saya akan meneruskannya dengan koma splicing. Jadi koma akan dibagi terlebih dahulu
Langkah kedua adalah menambahkan diri Anda ke istilah pencarian, karena beberapa kata hilang setelah IK participle ... ini adalah bug
Langkah ketiga adalah menggunakan objek analyzerequestBuilder untuk mendapatkan daftar objek nilai pengembalian setelah IK participle
Langkah 4: Mengoptimalkan Hasil Participle Kata. Misalnya, jika semuanya adalah kata -kata, maka simpan semua; Jika ada kata dan kata -kata, maka simpan kata -kata; Jika hanya ada kata -kata, maka simpan kata -katanya.
Kode implementasi inti adalah sebagai berikut:
/ *** Cari konten participle*/ Daftar Protected <string> HandlingsearchContent (String SearchContent) {List <String> SearchtermResultList = ArrayList baru <> (); // dibagi berdasarkan koma untuk mendapatkan daftar daftar istilah pencarian <string> searchtermlist = arrays.aslist (SearchContent.split (searchConsant.string_token_split)); // Jika istilah pencarian lebih besar dari 1 kata, kata IK participle akan diperoleh dengan memperoleh kata participle list hasil hasil searchterstter.foreach (searchterm -> {// tag istilah pencarian menambahkan daftar istilah pencarian itu sendiri dan menyelesaikan masalah pencarian northterlist (searchterm); // Dapatkan istilah pencarian IK daftar pencarian (digesullist. }); Kembalikan DISTERMRESULTLIST; } /** * Call ES to get the result after IK participle*/ protected List<String> getIkAnalyzeSearchTerms(String searchContent) { AnalyzeRequestBuilder ikRequest = new AnalyzeRequestBuilder(elasticsearchTemplate.getClient(), AnalyzeAction.INSTANCE, SearchConstant.INDEX_NAME, searchContent); IkRequest.settokenizer (SearchConsant.tokenizer_ik_max); Daftar <analyzeresponse.analyzetoken> iktokenlist = ikrequest.execute (). Actionget (). GetTokens (); // daftar penugasan loop <string> searchtermlist = new ArrayList <> (); IktokenList.foreach (ikToken -> {searchtermList.add (ikToken.getterm ());}); return handlingikResultTersms (SearchtermList); } / ** * Jika kata partisipan kata: sampo (sampo, rambut, sampo, rambut, air) * - semuanya kata, simpan * - kata + kata, hanya kata -kata * - semua kata, simpan kata * / daftar pribadi <string> handleikResultTers (daftar <string> searchtermlist) {boolean isphrase = false; Boolean isword = false; untuk (istilah string: searchtermlist) {if (term.length ()> searchConsant.search_term_length) {isPhrase = true; } else {isWord = true; }} if (isword & isPhrase) {list <string> phraseList = new ArrayList <> (); searchtermlist.foreach (term -> {if (term.length ()> searchConsant.search_term_length) {phraselist.add (term);}}); Kembalikan Distist; } mengembalikan Daftar Pencarian; }3. Pernyataan permintaan pencarian
Bangun objek enumerasi konten dan daftarkan bidang yang perlu dicari. Kode ContentSearchterMenum adalah sebagai berikut:
impor lombok.allArgsconstructor; @allArgsconstructorPublic enum ContentSearchtermenum {// judul judul ("title"), // konten konten ("konten"); / *** Bidang pencarian*/ nama string pribadi; public string getName () {return name; } public void setName (name string) {this.name = name; }}Loop bidang pencarian "pencarian telepon" dan atur nilai berat minimum ke 1. Kode inti adalah sebagai berikut:
/ *** Konstruksi Kondisi Kueri*/ Private Void BuildMatchQuery (BoolQueryBuilder QueryBuilder, Daftar <String> SearchtermList) {for (String Searchterm: SearchtermList) {for (ContentSearchterMenum SearchterMenum: ContentSearchterMenum.Values ()) querybuilder.should (querybuilders.matchphraseQuery (searchtermenum.getname (), searchterm)); }} querybuilder.minimumshouldmatch (SearchConsant.Minimum_Should_match); }4. Kondisi filter
Ada lebih dari satu hal yang harus dicari, dan kadang -kadang permintaan seperti ini. Anda perlu mencari di bawah kategori tertentu, seperti e-commerce perlu mencari produk dengan merek tertentu. Maka Anda perlu membangun beberapa Fitlers untuk disaring. Sesuai dengan pernyataan SQL, atau dan dan, di bawah di mana. Gunakan metode filter untuk menambahkan penyaringan di ES. Kodenya adalah sebagai berikut:
/ *** Bangun filter*/ private void buildfilterQuery (boolquerybuilder boolquerybuilder, tipe integer, kategori string) {// filter tipe konten if (type! = Null) {boolQueryBuilder typeFilterBuilder = querybuilders.boolQuery (); typefilterbuilder.should (querybuilders.matchQuery (SearchConsant.type_name, type) .lenient (true)); boolquerybuilder.filter (TypeFilterBuilder); } // Kategori Konten Filter if (! Stringutils.isempty (kategori)) {boolquerybuilder CategoryFilterBuilder = queryBuilders.boolQuery (); CategoryFilterBuilder.should (querybuilders.matchQuery (SearchConsant.category_name, kategori) .lenient (true)); boolquerybuilder.filter (CategoryFilterBuilder); }}Jenis adalah kelas dan kategori besar adalah kelas kecil, sehingga dapat mendukung ukuran dan penyaringan kelas. Tetapi bagaimana jika Anda perlu mencari di Type = 1 atau Type = 2? Kode implementasi spesifik sangat sederhana:
TypefilterBuilder .Should (QueryBuilders.MatchQuery (SearchConsant.type_name, 1) .Should (QueryBuilders.MatchQuery (SearchConsant.Type_Name, 2) .lenient (true));
Melalui ekspresi rantai, dua harus mengimplementasikan atau, yaitu, pernyataan atau yang sesuai dengan SQL. Implementasi dan pernyataan yang sesuai dengan SQL dicapai melalui dua pembuat boolquery.
5. Kondisi paging dan penyortiran
Kode penyortiran paging sangat sederhana:
@Override Pube PageBean SearchContent (ContentSearchBean ContentSearchBean) {Integer Pagenumber = ContentSearchBean.GetPagenumber (); Integer Pagesize = ContentSearchBean.getPagesize (); PageBean <ContentEntity> resultPageBean = new PageBean <> (); resultPagebean.setPagenumber (Pagenumber); resultPageBean.setPagesize (halaman); // Bangun Pencarian Frase String SearchContent = ContentSearchBean.GetSearchContent (); Daftar <String> SearchtermList = HandlingSearchContent (SearchContent); // Bangun Kondisi Kueri BoolQueryBuilder boolquerybuilder = querybuilders.boolQuery (); BuildMatchQuery (BoolQueryBuilder, SearchterMlist); // Bangun Kondisi Filter BuildFilterQuery (BoolQueryBuilder, ContentSearchBean.getType (), ContentSearchBean.getCategory ()); // Bangun Paging dan Kondisi Penyortiran Lampiran Pagable = pagerequest.of (Pagenumber, Halamanze); if (! stringutils.isempty (contentsearchbean.getOrderName ())) {pageable = pagerequest.of (pagenumber, pagesize, sort.direction.desc, contentsearchbean.getorderName ()); } SearchQuery SearchQuery = NEW NEW NEATESSEARCHQUERYBUILDER (). WithPageable (Pagable) .withquery (BoolQueryBuilder) .build (); // Cari Logger.info (" /n ContentServiceImpl.SearchContent () [" + SearchContent + "] /n dsl = /n" + SearchQuery.getQuery (). ToString ()); Halaman <ContentEntity> 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); pengembalian resultPagebean; }Gunakan objek yang dapat diadukan untuk membangun parameter paging dan menentukan bidang penyortiran yang sesuai dan urutan penyortiran (desc asc).
6. Ringkasan
Gagasan ini relatif sederhana. Saya berharap ini akan membantu untuk pembelajaran semua orang, dan saya harap semua orang akan lebih mendukung wulin.com.