1. Idées de recherche de contenu de l'article
L'article précédent a expliqué comment intégrer ES 5 sur Spring Boot 2.0. Cet article parle des mesures pratiques spécifiques. Parlons brièvement de la façon de mettre en œuvre la mise en œuvre spécifique d'articles et de questions et réponses. L'idée de mise en œuvre est très simple:
Si vous appelez la recherche directement ici, vous pouvez facilement trouver des choses insatisfaisantes. Parce que la recherche de contenu se concentre sur la connectivité du contenu. La méthode de traitement ici est donc relativement faible, et j'espère obtenir une meilleure méthode de recherche avec plus de communication. Il s'agit d'obtenir de nombreuses phrases à travers le participe de mots, puis d'utiliser des phrases pour faire correspondre avec précision les phrases.
L'installation ES du plug-in IK Word Segmenter est très simple. La première étape consiste à télécharger la version correspondante https://github.com/medcl/elasticsearch-analysis-ik/releases. La deuxième étape consiste à créer un nouveau dossier IK dans le répertoire Elasticsearch-5.5.3 / Plugins, et à copier le fichier dézippé de Elasticsearch-Analysis-IK-5.5.3.zip dans le répertoire Elasticsearch-5.1.1 / Plugins / IK. Redémarrez enfin ES.
2. Rechercher le contenu participe
Installez IK, comment l'appeler?
La première étape est que lorsque je recherche du contenu ici, je vais le transmettre avec des virgules épisser. Les virgules seront donc divisées en premier
La deuxième étape consiste à s'ajouter aux termes de recherche, car certains mots sont partis après le participe IK ... c'est un bug
La troisième étape consiste à utiliser l'objet AnalyzeRequestBuilder pour obtenir la liste des objets de valeur de retour après le participe IK
Étape 4: Optimiser les résultats du mot participe. Par exemple, si tous sont des mots, alors gardez tout; S'il y a des mots et des mots, alors gardez les mots; S'il n'y a que des mots, alors gardez les mots.
Le code d'implémentation de base est le suivant:
/ ** * Rechercher le contenu participe * / List protégé <string> handLingSearchContent (String searchContent) {list <string> searchterMesultList = new ArrayList <> (); // Split par des virgules pour obtenir la liste des termes de recherche <string> searchterList = arrays.aslist (searchContent.split (searchConstant.string_token_split)); // Si le terme de recherche est supérieur à 1 mot, le participe ik word sera obtenu en obtenant le mot de participe de la liste des participants SearchterList.ForEach (searchterm -> {// Term tag tag Ajouter la liste de termes de recherche lui-même et résoudre le problème de la liste de recherche WillEarchResult.Add (searchTerm); // Obtenez le terme de recherche IK participe); return searchterSultList; } / ** * Appelez ES pour obtenir le résultat après IK participe * / Liste protégée <string> getikanalyzesearchterms (String SearchContent) {analyseRequestBuilder ikrequest = new AnalyzequestBuilder (elasticsearchTemplate.getClient (), analyseaction.instance, SearchConstant.Index_name, SearchContent); ikrequest.setTokenizer (searchConstant.Tokenizer_ik_max); Liste <AnalyserRessence.analyzetoken> ikTokenList = ikRequest.Execute (). ActionGet (). GetTokens (); // Liste d'attribution de boucle <string> searchterList = new ArrayList <> (); ikTokenList.ForEach (ikToken -> {SearchterList.add (ikToken.getterm ());}); return handingikResultterms (SearchterList); } / ** * Si le mot de participais du mot: shampooing (shampooing, cheveux, shampooing, cheveux, eau) * - sont tous des mots, gardez * - mots + mots, seulement des mots * - sont tous des mots, gardent les mots * / liste privée <string> haineikresultterms (list <string> searchterterList) {boolean isphrase = false; Booléen isword = false; for (String term: searchterList) {if (term.length ()> searchConstant.search_term_length) {isPhrase = true; } else {isword = true; }} if (isword & isPhrase) {list <string> phraselist = new ArrayList <> (); searchterList.ForEach (term -> {if (term.length ()> searchConstant.search_term_length) {phraselist.add (term);}}); retour phraséliste; } return searchterList; }3. Déclaration de requête de recherche
Construisez l'objet d'énumération de contenu et répertoriez les champs qui doivent être recherchés. Le code contenuearchTermenum est le suivant:
Importer Lombok.AllargStructructor; @AlLargSconstructorPublic Enum ContentsechTearchTermem {// Title Title ("Title"), // Content Content ("Content"); / ** * Champ de recherche * / nom de chaîne privée; public String getName () {Nom de retour; } public void setName (string name) {this.name = name; }}Faire du champ de recherche "Match de recherche de téléphone" et définissez la valeur de poids minimale sur 1. Le code de base est le suivant:
/ ** * Construire des conditions de requête * / private void buildMatchQuery (boolQueryBuilder QueryBuilder, list <string> searchterList) {for (String searchterter: searchterList) {for (conntentsearchTermem searchTermenum: ContentsEarchTermeMenum.Values ()) {# queryBuilder.Should (queryBuilders.matchPhraseQuery (SearchTermenum.getName (), searchterm)); }} querybuilder.minimumshouldmatch (searchConstant.minimum_should_match); }4. Conditions de filtre
Il y a plus d'une chose à rechercher, et parfois la demande est comme ça. Vous devez rechercher dans une certaine catégorie, comme le commerce électronique doit rechercher des produits sous une certaine marque. Ensuite, vous devez construire des tronçons pour le filtrage. Correspondant aux instructions SQL, ou et, sous où. Utilisez la méthode du filtre pour ajouter du filtrage dans ES. Le code est le suivant:
/ ** * Build Filters * / private void buildFilterQuery (boolQueryBuilder boolquerybuilder, type entier, catégorie de chaîne) {// Type de contenu filtre if (type! = Null) {boolQueryBuilder TypeFilterBuilder = QueryBuilders.BoolQuery (); typeFilterBuilder.Should (queryBuilders.matchQuery (searchConstant.type_name, type) .leient (true)); boolQueryBuilder.filter (TypeFilterBuilder); } // Catégorie de contenu filtre if (! StringUtils.isempty (catégorie)) {boolQueryBuilder catégorieFilterBuilder = queryBuilders.boolQuery (); catégorieFilterBuilder.Should (queryBuilders.matchQuery (searchConstant.category_name, catégorie) .leient (true)); boolquerybuilder.filter (catégorieFilterBuilder); }}Le type est une grande classe et la catégorie est une petite classe, afin qu'elle puisse prendre en charge la taille et le filtrage des classes. Mais que se passe-t-il si vous devez rechercher dans type = 1 ou type = 2? Le code d'implémentation spécifique est très simple:
TypeFilterBuilder .Should (queryBuilders.matchQuery (searchConstant.Type_name, 1) .Should (queryBuilders.matchQuery (searchConstant.Type_name, 2) .LenIent (true)));
Grâce aux expressions de chaîne, deux devraient mettre en œuvre ou, c'est-à-dire l'instruction ou correspondant à SQL. La mise en œuvre de l'instruction et correspondant à SQL est réalisée par le biais de deux BoolQueryBuilders.
5. Conditions de pagination et de tri
Le code de tri de pagination est très simple:
@Override Public PageBean SearchContent (ContentsSearchBean ContentsEartHeanBean) {Integer PageNumber = ContentSearchBean.getPageNumber (); Integer pagesize = tentalsearchbean.getPageSize (); PageBean <Condality> resultPageBean = new PageBean <> (); ResultPageBean.SetPageNumber (PageNumber); resultPageBean.SetPageSize (PageSize); // Construire une phrase de recherche String SearchContent = ContentSearchbean.getSearchContent (); List <string> searchterList = handLingSearchContent (searchContent); // Construire les conditions de requête BoolQueryBuilder BoolQueryBuilder = QueryBuilders.BoolQuery (); buildMatchQuery (boolquerybuilder, searchterlist); // Création des conditions de filtre BuildFilterQuery (boolQueryBuilder, ContentEarchBean.getType (), ContentSearchBean.getCategory ()); // Construire des conditions de pagination et de tri pagables pagables = pageRequest.of (pageNumber, pagesize); if (! StringUtils.Isempty (tentessearchbean.getOrderName ())) {pagable = pagerequest.of (pageNumber, pagesize, tri.direction.desc, contentsearchbean.getOrderName ()); } SearchQuery searchQuery = new NativesearchQueryBuIlder (). WithPagable (Pagable) .WithQuery (boolQueryBuilder) .Build (); // Search Logger.info ("/ n ContentServiceImpl.SearchContent () [" + SearchContent + "] / n dsl = / n" + searchQuery.Getquery (). ToString ()); Page <Condasentity> contentPage = contentRepository.Search (SearchQuery); resultPageBean.SetResult (contentPage.getContent ()); resultPageBean.SetTotalCount ((int) contentPage.getTotAlements ()); resultPageBean.SetTotalPage ((int) contentPage.getTotAlements ()); resultPageBean.SetTotalPage ((int) contentPage.getTotAlements () / resultPageBean.getPageSize () + 1); return resultPageBean; }Utilisez l'objet pagable pour construire des paramètres de pagination et spécifiez les champs de tri correspondants et l'ordre de tri (DESC ASC).
6. Résumé
Cette idée est relativement simple. J'espère que cela sera utile à l'apprentissage de tous, et j'espère que tout le monde soutiendra davantage Wulin.com.