Hace un tiempo, planeaba crear un servicio de búsqueda simple para el proyecto. Aunque la base de datos empresarial MongoDB proporciona soporte de búsqueda de texto, cuando se debe colocar una gran cantidad de documentos a través de palabras clave, ES es obviamente más adecuado como motor de búsqueda (aunque la mayoría de nosotros hemos utilizado las funciones de análisis y visualización de Elk antes). Elasticsearch se basa en Lucene y admite consultas extremadamente rápidas y una rica sintaxis de consultas, y ocasionalmente sirve como un NoSQL liviano. Sin embargo, la capacidad de las operaciones complejas de consultas y agregación no es muy fuerte.
Este artículo no mencionará cómo construir un servicio de búsqueda simple, pero registrará varias dificultades encontradas durante las horas de trabajo de aproximadamente una semana. .
¿Por qué elegir Elasticsearch 5.x?
El nuevo servicio no tiene una carga histórica, y en teoría debería usar el último 6.x. Sin embargo, Spring-Data-ElasticSearch solo admite 5.x, y es difícil encapsular directamente una capa de API incluso si el tiempo es apretado. También se debe a que la versión anterior de las cosas de Elk estaba confundida, por lo que no tuvo más remedio que ir de 2.x a 5.x. Consulta la diferencia entre 5.x y 2.x. En pocas palabras, es espacio en disco -50%, tiempo de índice -50%, rendimiento de la consulta +25%.
Dado que Spring-Data-ElasticSearch debe actualizarse a 3.0.7, Spring debe actualizarse a 2.x, lo que conduce directamente a las trampas que se ponen más tarde.
Docker Installation ES instalará el complemento X-Path de forma predeterminada
Aunque los datos de primavera admiten ES5.x, sus funciones no son muy completas. Por lo tanto, si el complemento X-Path está instalado, org.elasticsearch.client: X-Pack-Transport: 5.5.0 debe introducirse. La versión debe ser la misma que la versión ES, y puede implementar TransportClient usted mismo, de la siguiente manera
@ComponentPublic Class Esconfig {@Bean TransportClient TransportClient () lanza desconocidaHosTexception {TransportClient Client = new PreBuiltxpackTransportClient (settings.builder () .put ("cluster.name", "cluster") .put ("xpack.seacurity.user", "elastic: changeMe"). .addtransportaddress (nuevo inetSocketTransportAddress (inetaddress.getByName ("0.0.0.0"), 9300)); devolver el cliente; }}Esta también es una solución más rápida elegida porque no quiero ir a Docker para lidiar con el complemento X-Path. Si es innecesario, no tengo que tocar algunas cosas en ES por el momento.
MQ guardará la información de clase del mensaje, causando que el deserializado falle
RabbitMQ en el título nunca se ha mencionado, porque solo se usa como una cola de mensajes. Cuando los datos cambian, la ID del mensaje se lleva a MQ y se consume el consumidor en el servicio de búsqueda.
El problema es que cuando el mensaje se arroja a MQ, se encapsula en su propio objeto, lo que hace que RabbittSplate.ReceiveAndConvert falle porque el mensaje llevará la información del paquete del objeto. En desesperación, el consumidor solo puede obtener directamente los bytes de mensaje en la cola y convertir el formulario JSON en un objeto utilizando el método ObjectMapper.ReadValue.
La configuración de Gradle puede usar -dloader.main para especificar la función de inicio
Es precisamente porque MQ se presenta que el servicio de búsqueda debe iniciar un consumidor. El método es implementar una aplicación que no inicie el servicio web y configure un SimpleMessageListenerContainer y MessageListenerAdapter de la siguiente manera:
@Bean SimpleMessageListenerContainer Container (ConnectionFactory ConnectionFactory, MessageListenerAdapter ListenerApter, MQConfig Properties) {SimpleMessAgelistenerContainer Container = new SimpleMessageListenerContainer (); Container.SetConnectionFactory (ConnectionFactory); Container.setqueueNames (Properties.getqueueName ()); Container.SetMessAgelistener (LOYERAdapter); contenedor de devolución; } @Bean MessageListenerAdapter LOYERAdapter () {MessageListenerAdapter LOWYERAdapter = new MessageListenerAdapter (itemConsumer, "consumen"); Return LOYERAdapter; } El problema es que cuando la configuración de graduación, busqué durante mucho tiempo para hacer que el paquete JAR se construya con el -dLoader especificado. Mayor para especificar la aplicación de inicio. La solución es la siguiente:
Agregue el archivo xxx.gradle
Bootjar {manifest {atributes 'Main-Class': 'org.springframework.boot.loader.propertieslauncher'}}En el proyecto SpringBoot 1.5.9, debe especificar la aplicación de inicio y debe agregarla
SpringBoot {Layout = "Zip"}La forma de verificar si es efectiva es descifrar directamente el paquete JAR después de construir y verificarlo en xxx (nombre del proyecto) /Meta-info/Manifest.mf.
Main-Class: org.springframework.boot.loader.propertieslauncher
Entonces correcta, si
Main-Class: org.springframework.boot.loader.jarlauncher
La clase de inicio en el archivo aún se iniciará
ES no puede modificar la asignación del índice
Debido a que simplemente usa la función de búsqueda de texto de ES, hay muchos resultados de búsqueda insatisfactorios en aplicaciones reales, como buscar "escritorio", y es imposible buscar contenido como "escritorio de computadora/escritorio de oficina" y otras tablas XX. Hay muchos casos de esta manera. Por lo tanto, se agrega el diccionario de sinónimo, y el segmento de palabras IK_SMART no se usa en los campos que requieren segmentación de palabras, por lo que la asignación de algunos campos debe cambiarse a
// Analyzer es su propio nombre de segmento de palabras @field (type = fieldType.Text, index = true, analzer = "Synconym") privado de cadena Descripción;
Dado que el mapeo de ES no se puede modificar, solo puede crear manualmente una nueva asignación y luego usar el método de Reindex para rellenar los datos (ES5.X viene con la API de Reindex). Hay un método en línea a través de alias. En algunos escenarios de modificación, puede modificar sin problemas sin reiniciar/implementar la aplicación. Puede consultar y comprender para obtener más detalles.
Lo anterior es casi las trampas que han sido tocadas por un servicio de búsqueda. Varios de ellos han consumido mucho tiempo y energía para resolver. Espero que sea de valor de referencia para esta lista. En el futuro, habrá algunas optimizaciones en el servicio de búsqueda y continuará actualizándose lentamente. También espero que todos apoyen más a Wulin.com.