1. Ideen zum Suchen von Artikeln Inhalt
Im vorherigen Artikel wurde darüber gesprochen, wie ES 5 in Spring Boot 2.0 integriert werden kann. In diesem Artikel geht es um die spezifischen praktischen Maßnahmen. Lassen Sie uns kurz darüber sprechen, wie die spezifische Implementierung von Artikeln und Fragen und Antworten implementiert werden kann. Die Implementierungsidee ist sehr einfach:
Wenn Sie hier direkt die Suche anrufen, können Sie leicht unbefriedigende Dinge finden. Da sich die Inhaltssuche auf die Konnektivität von Inhalten konzentriert. Die Verarbeitungsmethode hier ist also relativ niedrig, und ich hoffe, eine bessere Suchmethode mit mehr Kommunikation zu erreichen. Es soll viele Phrasen durch Partizip -Wort erhalten und dann Phrasen verwenden, um die Phrasen genau zu entsprechen.
Die Installation des IK Word-Segmenters Plug-In ist sehr einfach. Der erste Schritt besteht darin, die entsprechende Version https://github.com/medcl/elasticsearch-analysis-ik/releases herunterzuladen. Der zweite Schritt besteht darin, einen neuen Ordner IK im Verzeichnis von Elasticsearch-5.5.3/Plugins zu erstellen und die unzippierte Datei von Elasticsearch-Analysis-IK-5.5.zip in das Verzeichnis elasticsearch-5.1.1/Plugins/IK zu kopieren. Schließlich starten Sie es neu.
2. Suchen Sie Inhalt Partizip
IK installieren, wie nenne ich es?
Der erste Schritt ist, dass ich, wenn ich hier nach Inhalten suche, ihn mit Commas -Spleißen weitergeben werde. Die Kommas werden also zuerst aufgeteilt
Der zweite Schritt besteht darin, sich den Suchbegriffen hinzuzufügen, da einige Wörter nach dem Partizip IK verschwunden sind ... Dies ist ein Fehler
Der dritte Schritt besteht
Schritt 4: Optimieren Sie das Wort Partizip -Ergebnisse. Wenn beispielsweise alle Wörter sind, behalten Sie alle; Wenn es Wörter und Worte gibt, behalten Sie die Wörter; Wenn es nur Wörter gibt, behalten Sie die Wörter.
Der Kernimplementierungscode lautet wie folgt:
/ *** Inhaltsinterparteis durchsuchen*/ Protected List <String> HandlingsarchContent (String SearchContent) {List <string> searchterMresultlist = new ArrayList <> (); // von Commas aufgeteilt, um die Liste der Suchbegriffe zu erhalten. // Wenn der Suchbegriff größer als 1 Wort ist, wird das IK -Wortpartizip erhalten, indem das Wort Partizip -Ergebnislisten -Suchterm. Rückgabe -SuchtermResultlist; } / *** Rufen Sie ES auf, um das Ergebnis nach IK -Partizip* / Protected List <String> Getikanalyzesearchterms (String SearchContent) {AnalyzERequestBuilder iKRequest = new AnalyzeRequestBuilder (ElasticSearchtemplate.GetClient.), Analyzaction.instance, SearchConstance.instance, Searchconstant.instant.instant.instant.instant.instant.instant.Name, SearchContent), zu erhalten. iKRequest.settokenizer (SearchConstant.Tokenizer_ik_max); Liste <AnalyzerResponse.AnalyzEToken> iktokenlist = ikRequest.execute (). ActionGet (). GetTokens (); // Loop -Zuweisungsliste <string> suchtermlist = new ArrayList <> (); iktokenlist.foreach (iktoken -> {suchtermlist.add (iktoken.getTerM ());}); return handlingikresultterms (Suchtermiste); } / ** * Wenn Wort Partizip -Ergebnis: Shampoo (Shampoo, Haar, Shampoo, Haar, Wasser) * - sind alle Wörter, halten * - Wörter + Wörter, nur Wörter * - sind alle Wörter, halten Wörter * / private Liste <string> HandleIkResultterms (List <string> Suchtermlist) {boolean isphrase = false; Boolean isword = false; für (String Term: SearchDterList) {if (Term.Length ()> SearchConstant.search_term_Length) {iSphrase = true; } else {isword = true; }} if (isWord & iSphrase) {list <string> phraselist = new ArrayList <> (); searchtermList.foreach (Term -> {if (Term.Length ()> SearchConstant.search_term_length) {Phraselist.Add (Term);}}); RückkehrphraSelist; } Rückgabe -Suche; }3.. Suchanweisung Anweisung
Konstruieren Sie das Inhaltsaufzählungobjekt und listen Sie die Felder auf, die durchsucht werden müssen. Der ContentSearchterMenum -Code lautet wie folgt:
importieren lombok.allargSconstructor; @AllargSconstructorPublic enum contentSearchterMenum {// title title ("title"), // content content ("content"); / *** Suchfeld*/ privater Zeichenfolge Name; public String getName () {return name; } public void setName (String -Name) {this.name = name; }}Schleifen Sie das Suchfeld "Telefonsuche Match" und setzen Sie den Mindestgewichtswert auf 1. Der Kerncode lautet wie folgt:
/** * Construct query conditions*/ private void buildMatchQuery(BoolQueryBuilder queryBuilder, List<String> searchTermList) { for (String searchTerm: searchTermList) { for (ContentSearchTermEnum searchTermEnum: ContentSearchTermEnum.values()) { queryBuilder.should(QueryBuilders.matchPhraseQuery(searchTermEnum.getName(), Suchterm)); }} queryBuilder.minimumshouldMatch (SearchConstant.minimum_should_match); }4. Filterbedingungen
Es gibt mehr als eine Sache zu suchen, und manchmal ist die Nachfrage so. Sie müssen unter einer bestimmten Kategorie suchen, wie z. B. E-Commerce muss nach Produkten unter einer bestimmten Marke suchen. Dann müssen Sie einige Fitler zum Filtern erstellen. Entsprechend SQL -Anweisungen oder und und unter wo. Verwenden Sie die Filtermethode, um die Filterung in ES hinzuzufügen. Der Code ist wie folgt:
/ *** bauen Filter*/ private void BuildFilterQuery (BoolqueryBuilder BoolqueryBuilder, Integer -Typ, String -Kategorie) {// Inhaltstyp Filter if (type! vortefilterbuilder.should (querybuilders.matchQuery (SearchConstant.Type_Name, Typ) .Lenient (true)); boolqueryBuilder.filter (vortefilterbuilder); } // Inhaltskategorie Filter if (! Stringutils.isempty (Kategorie)) {boolQueryBuilder categoryFilterBuilder = queryBuilders.boolQuery (); categoryFilterBuilder.SHOOLD (querybuilders.matchQuery (SearchConstant.Category_Name, Kategorie) .Lenient (true)); BoolqueryBuilder.filter (CategoryFilterBuilder); }}Typ ist eine große Klasse und eine Kategorie ist eine kleine Klasse, sodass sie die Größe und Klassenfilterung unterstützen kann. Aber was ist, wenn Sie in Typ = 1 oder Typ = 2 suchen müssen? Der spezifische Implementierungscode ist sehr einfach:
vortefilterbuilder .SHOOLD (querybuilders.matchQuery (SearchConstant.Type_Name, 1) .Should (querybuilders.matchQuery (SearchConstant.Type_Name, 2) .Lenient (true));
Durch Kettenausdrücke sollten zwei implementieren oder, dh die oder Anweisung, die SQL entspricht. Die Implementierung der und Erklärung, die SQL entspricht, wird durch zwei Boolquerybuilder erzielt.
5. Paging- und Sortierbedingungen
Der Paging -Sortiercode ist sehr einfach:
@Override public PageBean SearchContent (ContentSearchBean contentsarchbean) {Integer pagenumber = contentSearchbean.getPagenumber (); Integer pageSize = contentsSearchBean.getPageSize (); PageBean <AbhoresEntity> resultPageBean = new PageBean <> (); resultPageBean.setPagenumber (Pagenumber); resultPageBean.setPageSize (pageSize); // Suchphrase String searchContent = contentsarchbean.getSearchContent () konstruieren; List <String> suchtermlist = HandLingSearchContent (SearchContent); // Abfragebedingungen buolquerybuilder boolqueryBuilder = querybuilders.boolQuery (); BuildMatchQuery (BoolqueryBuilder, SuchtermList); // Filterbedingungen BuildFilterQuery (BoolqueryBuilder, Contentsarchbean.gettType (), ContentSearchbean.getCategory ()); // Bauen Sie Paging- und Sortierbedingungen vorlebbar. if (! Stringutils.isempty (contentSearchbean.getOrderName ())) {pagable = pageRequest.of (pageNumber, pageSize, sort.Direction.desc, contentsarchbean.getOrdername ()); } SearchQuery SearchQuery = new NativeSearchQueryBuilder (). Withpagable (lehnte) .WithQuery (boolQueryBuilder) .build (); // suche logger.info (" /n contentServiceImpl.searchContent () [" + searchContent + "] /n dsl = /n" + searchQuery.getQuery (). ToString ()); Seite <Thaltentity> 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); RückgabeergebnisPageBean; }Verwenden Sie das pagbare Objekt, um Paging -Parameter zu konstruieren und die entsprechenden Sortierfelder und Sortierreihenfolge (DASC ASC) anzugeben.
6. Zusammenfassung
Diese Idee ist relativ einfach. Ich hoffe, es wird für das Lernen aller hilfreich sein, und ich hoffe, jeder wird Wulin.com mehr unterstützen.