Ambiente experimental
En primer lugar, por supuesto, debe instalar el entorno Elasticsearch. Es mejor instalar la cabeza de Elasticsearch de Visual Plug-in para facilitarnos que veamos los datos intuitivamente.
Por supuesto, puede consultar mi publicación en esta parte: "Instalación de búsqueda elástica y pozos de llenado en CentOS7"
Mi ES está instalado en http://113.209.119.170:9200/ (esta dirección debe asignarse al proyecto SpringBoot)
Creación de proyectos de primavera
No hay una explicación especial para esta parte, pero hay algunas cosas de las que tener cuidado.
Tenga en cuenta que al crear un nuevo proyecto, recuerde verificar las dependencias de ElasticSearch en Web y NoSQL, y tomemos una foto para ilustrar:
Al crear un proyecto, verifique la opción de dependencia de ES en NoSQL.
Una vez que se genera automáticamente el proyecto, la dependencia de los datos de arranque de boot-boot-elasticsearch se agregará automáticamente a pom.xml:
<Spendency> <MoupRupid> org.springframework.boot </groupid> <artifactid> spring-boot-starter-data-elasticsearch </arfactid> </dependencia>
En este proyecto, utilizamos la broma de cliente ES Java de código abierto, por lo que también necesitamos agregar dependencias de broma en pom.xml:
<Spendency> <ProupId> io.searchbox </proupid> <artifactId> jest </artifactid> </pendency>
Además, debe agregar dependencias de JNA:
<Spendency> <ProupId> net.java.dev.jna </groupid> <artifactId> jna </artifactid> </pendency>
De lo contrario, al comenzar el proyecto de primavera, no se encuentra un error de JNA. Los métodos nativos estarán deshabilitados:
Jna no encontrado. Los métodos nativos estarán deshabilitados.
La dirección del servidor ES debe configurarse en el archivo de configuración del proyecto Application.yml
Servidor: Puerto: 6325Spring: Elasticsearch: Jest: URIS: - http://113.209.119.170:9200 # Dirección del servidor ES! Leer TimeOut: 5000
Organización del código
Mi código de proyecto está organizado de la siguiente manera:
Organización del código de proyecto
Cada parte del código se explica de la siguiente manera, y los comentarios son:
Entidad.java
paquete com.hansonwang99.springboot_es_demo.entity; import java.io.serializable; import org.springframework.data.elasticsearch.annotations.document; public class Entity implementa serializable {Vida final estatica final privada public static final String index_name = "index_entity"; public static final String type = "tstype"; ID de larga prudente; nombre de cadena privada; Entity public () {super (); } Entidad pública (ID de larga, nombre de cadena) {this.id = id; this.name = name; } public Long Long getId () {return id; } public void setid (ID long) {this.id = id; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; }} TestService.java
paquete com.hansonwang99.springboot_es_demo.service; import com.hansonwang99.springboot_es_demo.entity.entity; import java.util.list; pública interfaz testService {void saveentity (entidad entidad); Void SaveEntity (List <Entity> EntityList); List <Nontity> SearchEntity (String SearchContent);}TestServiceImpl.java
paquete com.hansonwang99.springboot_es_demo.service.impl; import java.io.ioException; import java.util.list; import com.hansonwang99.springboot_es_deme.entity.entity; import.hansonwang99.springboot_es_demo.service.Testservice; import.hansonwang99.springboot_es_demo.service.TestserSer; org.elasticsearch.index.Query.QueryBuilders; import org.elasticsearch.search.builder.searchsourceBuilder; import org.slf4j.logger; import og.slf4j.loggerFactory; import org.springfframework.beans.factory.annotation.autowired; import; org.springframework.stereotype.service; import io.searchbox.client.jestclient; import io.searchbox.client.jestresult; import io.searchbox.core.bulk; import io.searchbox.core.index; import io.searchbox.core.search; @ServicePeSerPeaticEmentEmpleMil Final logger logger = loggerFactory.getLogger (testServiceImpl.class); @AUTOWIREDIRDIRED JESTCLIENT JESTCLIENTE; @Override public void saveEntity (entidad entidad) {index index = new index.builder (entidad) .index (entity.index_name) .type (entity.type) .Build (); intente {jestClient.execute (index); Logger.info ("es insertar completo"); } catch (ioException e) {E.PrintStackTrace (); Logger.error (e.getMessage ()); }} / ** * Guardar contenido en lotes a ES * / @Override public void SaveEntity (List <N entity> EntityList) {bulk.builder bulk = new bulk.builder (); para (entidad entidad: entitylist) {index index = new index.builder (entidad) .index (entity.index_name) .type (entity.type) .Build (); bulk.addaction (índice); } try {jestClient.execute (bulk.build ()); Logger.info ("es insertar completo"); } catch (ioException e) {E.PrintStackTrace (); Logger.error (e.getMessage ()); }} / *** Búsqueda de contenido en ES* / @Override Public List <Nontity> SearchEntity (String SearchContent) {SearchSourceBuilder SearchSourceBuilder = new SearchSourceBuilder (); //SearchSourceBuilder.Query(QueryBuilders.QuerystringQuery(SearchContent)); //searchsourceBuilder.field("Name "); SearchSourceBuilder.Query (QueryBuilders.MatchQuery ("Nombre", SearchContent)); Search Search = New Search.Builder (SearchSourceBuilder.ToString ()) .addindex (entity.index_name) .addtype (entity.type) .build (); Pruebe {jestresult dulte = jestClient.Execute (búsqueda); return result.getSourCeAsObjectList (entity.class); } catch (ioException e) {logger.error (e.getMessage ()); E.PrintStackTrace (); } return null; }} EntityController.java
paquete com.hansonwang99.springboot_es_demo.controller; import java.util.arrayList; import java.util.list; import 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") Public Class EntityController {@aUtowired testService CityService; @RequestMapping (valor = "/guardar", método = requestmethod.get) public string save (long id, name de cadena) {system.out.println ("Guardar interfaz"); if (id> 0 && stringUtils.isnotempty (name)) {entity newEntity = new entity (id, nombre); Lista <NOTity> addList = new ArrayList <Entity> (); AddList.Add (NewEntity); cityesservice.saveEntity (AddList); regresar "OK"; } else {return "mal valor de entrada"; }} @RequestMapping (value = "/búsqueda", método = requestmethod.get) Lista pública <Entity> save (name de cadena) {list <entity> entityList = null; if (stringUtils.isnotempty (name)) {entityList = cityesservice.searchEntity (nombre); } return entityList; }}Experimentos reales
Para agregar varios datos, puede usar la herramienta Postman o puede ingresarlo directamente en el navegador, como agregar los siguientes 5 datos:
http: // localhost: 6325/entityController/save? id = 1 & name = nanjing sun yat-sen mausoleum http: // localhost: 6325/entityController/save? id = 2 & name = nanjing universitar Templo Confucio http: // localhost: 6325/entityController/save? Id = 4 & name = hangzhou también es muy bueno http: // localhost: 6325/entitycontroller/save? Id = 5 & name = parece que no hay ciudad llamada en el sur de China.
El efecto de inserción de datos es el siguiente (utilizando el complemento Visual Elasticsearch-Head):
Efecto de inserción de datos
Hagamos una prueba de búsqueda: por ejemplo, quiero buscar la palabra clave "nanjing"
Escribimos el navegador:
http: // localhost: 6325/entityController/search? name = nanjing
Los resultados de la búsqueda son los siguientes:
Resultados de búsqueda para la palabra clave "nanjing"
¡Los cuatro registros con la palabra clave "Nanjing" insertados se buscaron ahora!
Por supuesto, el método de segmentación de palabras estándar se usa aquí, y cada chino se usa como término. Se han buscado todos los registros que contienen la palabra clave "Sur" y "Beijing", pero los puntajes son diferentes. Por supuesto, hay otros métodos de segmentación de palabras. En este momento, se requiere el soporte de otros complementos de segmentación de palabras. Esto no está cubierto aquí, y lo exploraré más tarde.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.