Environnement expérimental
Tout d'abord, bien sûr, vous devez installer l'environnement Elasticsearch. Il est préférable d'installer le plug-in visuel Elasticsearch-head pour nous faciliter la visualisation des données intuitivement.
Bien sûr, vous pouvez vous référer à mon message dans cette partie: "Installation de recherche élastique et remplissage de fosses sur CentOS7"
Mon ES est installé sur http://113.209.119.170:9200/ (Cette adresse doit être affectée au projet Springboot)
Création du projet de printemps
Il n'y a aucune explication particulière à cette partie, mais il y a quelques choses à faire attention.
Notez que lors de la création d'un nouveau projet, n'oubliez pas de vérifier les dépendances Elasticsearch dans le Web et le NoSQL, et prenons une photo pour illustrer:
Lors de la création d'un projet, vérifiez l'option de dépendance ES dans NoSQL.
Une fois le projet généré automatiquement, la dépendance de Spring-Boot-Starter-Data-ElasticSearch sera automatiquement ajoutée à pom.xml:
<dependency> <proupId> org.springframework.boot </rombasid> <ArtefactId> printemp-boot-starter-data-elasticsearch </refatid> </dependency>
Dans ce projet, nous utilisons la plaisanterie Open Source RESTful ES Java Client, nous devons donc également ajouter des dépendances en plaisantage dans pom.xml:
<dependency> <proupId> io.searchbox </rombandid> <Artifactid> Jest </refactive> </Dependency>
De plus, vous devez ajouter des dépendances JNA:
<dependency> <proupId> net.java.dev.jna </rompuprid> <artifactId> jna </ artifactid> </dependency>
Sinon, lors du démarrage du projet Spring, une erreur de JNA n'est pas trouvée. Les méthodes natives seront désactivées.:
JNA introuvable. Les méthodes natives seront désactivées.
L'adresse du serveur ES doit être configurée dans le fichier de configuration du projet Application.yml
Serveur: Port: 6325Spring: Elasticsearch: Jest: URIS: - http://113.209.119.170:9200 # Adresse du serveur ES! lecture-temps: 5000
Organisation de code
Mon code de projet est organisé comme suit:
Organisation de code de projet
Chaque partie du code est expliquée comme suit, et les commentaires sont:
Entité.java
package com.hansonwang99.springboot_es_demo.entity; import java.io.serializable; import org.springframework.data.ellasticsearch.annotations.Document; entité publique entièrement implémente serializable {private static final serialversid = -76363835355517774166l; public static final String index_name = "index_entity"; Type de chaîne finale statique publique = "TSTYPE"; ID long privé; nom de chaîne privé; entité publique () {super (); } Entité publique (ID long, nom de chaîne) {this.id = id; this.name = name; } public long getID () {return id; } public void setid (long id) {this.id = id; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; }} TestService.java
package com.hansonwang99.springboot_es_demo.service; import com.hansonwang99.springboot_es_demo.entity.entity; import java.util.list; interface publique TestService {void Saveentity (entité entité); void Saveentity (list <tity> entityList); List <tity> Searchentity (String SearchContent);}TestServiceImpl.java
package com.hansonwang99.springboot_es_demo.service.impl; importer java.io.ioexception; import java.util.list; import com.hansonwang99.springboot_es_demo.entity.entity; import com.hansonwang99.springboot_es_demo.sservice.testService; org.ellasticsearch.index.query.querybuilders; import org.ellasticsearch.search.builder.searchsourcebuilder; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.beans.factory.annotation.Autowired; org.springframework.sterreotype.service; import io.searchbox.client.jestclient; import io.searchbox.client.jestreult; import io.searchbox.core.bulk; import io.searchbox.core.index; import io.searchbox.core. STATIC FINAL Logger Logger = LoggerFactory.getLogger (TestServiceImpl.Class); @Autowired JestClient privé JestClient; @Override public void wasentity (entité entité) {index index = new index.builder (entité) .Index (entity.index_name) .type (entity.type) .build (); essayez {jestClient.Execute (index); Logger.info ("ES INSERT complet"); } catch (ioException e) {e.printStackTrace (); Logger.Error (e.getMessage ()); }} / ** * Enregistrer le contenu en lots à es * / @Override public void Saveentity (list <tity> entityList) {bulk.builder bulk = new Bulk.builder (); for (Entity Entity: EntityList) {index index = new index.builder (entité) .Index (entity.index_name) .type (entity.type) .build (); bulk.addaction (index); } try {jestclient.execute (bulk.build ()); Logger.info ("ES INSERT complet"); } catch (ioException e) {e.printStackTrace (); Logger.Error (e.getMessage ()); }} / ** * Rechercher le contenu dans ES * / @Override public list <tity> searchentity (String searchContent) {searchSourceBuilder searchSourceBuilder = new SearchSourceBuilder (); //searchsourcebuilder.query(queryBuilders.QuerystringQuery(SearchContent)); //searchsourcebuilder.field("name "); SearchsourceBuilder.Query (queryBuilders.matchQuery ("Name", SearchContent)); Search search = new search.builder (SearchsourceBuilder.ToString ()) .AdDindex (entity.index_name) .addType (entity.type) .build (); essayez {jestResult result = jestclient.execute (search); return result.getsourceAbjectList (entity.class); } catch (ioException e) {logger.Error (e.getMessage ()); e.printStackTrace (); } return null; }} EntityController.java
package com.hansonwang99.springboot_es_demo.controller; import java.util.arraylist; import java.util.list; import com.hansonwang99.springboot_es_demo.entity.entity; import com.hansonwang99.springboot_es_demo.sservice.testService; org.apache.commons.lang.stringutils; import org.springframework.beans.factory.annotation.autowired; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.restController; @ restController @ requestMapping ("/ EntityController") Classe publique EntityController {@Autowired TestService CityesService; @RequestMapping (value = "/ sauve", méthode = requestMethod.get) public String Save (Long Id, String Name) {System.out.println ("Save Interface"); if (id> 0 && stringUtils.isnotempty (name)) {entité newentity = new Entity (id, name); List <tity> addList = new ArrayList <Stity> (); addList.add (newentity); CityesService.Saveentity (Addlist); retourner "ok"; } else {return "mauvaise valeur d'entrée"; }} @RequestMapping (value = "/ search", méthode = requestMethod.get) public list <tity> sauver (nom de chaîne) {list <tity> entityList = null; if (stringUtils.isnotempty (name)) {entityList = CityesService.SearchEntity (name); } return EntityList; }}Expériences réelles
Pour ajouter plusieurs données, vous pouvez utiliser l'outil Postman ou vous pouvez les saisir directement dans le navigateur, comme l'ajout des 5 données suivantes:
http: // localhost: 6325 / EntityController / Save? Id = 1 & name = nanjing Sun yat-Sen Mausoleum http: // localhost: 6325 / entityController / Save? Id = 2 & name = Nanjing Normal University en Chine HTTP: //nalhost: 6325 / entité Confucius Temple http: // localhost: 6325 / EntityController / Save? Id = 4 & name = hangzhou est également très bon http: // localhost: 6325 / entityController / Save? Id = 5 & name = Il semble qu'il n'y ait pas de ville appelée Jing dans le sud de la Chine.
L'effet d'insertion de données est le suivant (en utilisant le plug-in visuel elasticsearch-head):
Effet d'insertion de données
Faisons un test de recherche: par exemple, je souhaite rechercher le mot-clé "nanjing"
Nous tapons le navigateur:
http: // localhost: 6325 / EntityController / Search? name = nanjing
Les résultats de la recherche sont les suivants:
Résultats de la recherche pour les mots clés "nanjing"
Les quatre enregistrements avec le mot-clé "Nanjing" inséré à l'heure ont été recherchés!
Bien sûr, la méthode de segmentation des mots standard est utilisée ici, et chaque chinois est utilisé comme terme. Tous les enregistrements contenant le mot-clé "Sud" et "Pékin" ont été recherchés, mais les scores sont différents. Bien sûr, il existe d'autres méthodes de segmentation des mots. À l'heure actuelle, le support d'autres plug-ins de segmentation de mots est requis. Ce n'est pas couvert ici, et je l'explorerai plus tard.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.