Il y a quelque temps, je prévoyais de créer un service de recherche simple pour le projet. Bien que la base de données commerciale MongoDB fournit une prise en charge de la recherche de texte, lorsqu'un grand nombre de documents doivent être positionnés via des mots clés, ES est évidemment plus approprié en tant que moteur de recherche (bien que la plupart d'entre nous aient déjà utilisé des fonctionnalités d'analyse et de visualisation d'Elk). Elasticsearch est construit sur Lucene et prend en charge des requêtes extrêmement rapides et une syntaxe de requête riche, et sert parfois de nosql léger. Cependant, la capacité de complexer des opérations de requête et d'agrégation n'est pas très forte.
Cet article ne mentionnera pas comment créer un service de recherche simple, mais enregistrera plusieurs pièges rencontrés pendant les heures de travail d'une semaine environ. .
Pourquoi choisir Elasticsearch 5.x?
Le nouveau service n'a aucun fardeau historique et, en théorie, il devrait utiliser le dernier 6.x. Cependant, le printemps-data-elasticsearch ne prend en charge que 5.x, et il est difficile de résumer directement une couche d'API même si le temps est serré. C'est aussi parce que la version précédente des trucs d'Elk était confus, il n'avait donc pas d'autre choix que de passer de 2.x à 5.x. Interrogez la différence entre 5.x et 2.x. En termes simples, c'est l'espace disque -50%, le temps d'index -50%, les performances de requête + 25%.
Étant donné que le printemps-data-elasticsearch doit être mis à niveau à 3.0.7, le printemps doit être mis à niveau vers 2.x, ce qui conduit directement aux pièges qui sont frappés plus tard.
Docker Installation ES installera le plugin X-Path par défaut
Bien que les données de printemps prennent en charge ES5.x, ses fonctions ne sont pas très complètes. Par conséquent, si le plug-in x-path est installé, org.ellasticsearch.client: x-pack-transport: 5.5.0 doit être introduit. La version doit être la même que la version ES, et vous pouvez implémenter TransportClient vous-même, comme suit
@ComponentPublic class Esconfig {@Bean Public TransportClient TransportClient () lève UnknownHostException {TransportClient Client = new PrebuiltXpackTransportClient (Settings.Builder () .put ("Cluster.name", "Docker-Cluster") .put ("xpack.security.user", "elastic: elasse"). .AddTransportAddress (New InetsocketTransportAddress (InetAddress.getByName ("0.0.0.0"), 9300)); RETOUR Client; }}Il s'agit également d'une solution plus rapide choisie parce que je ne veux pas aller à Docker pour gérer le plug-in X-chemin. Si ce n'est pas nécessaire, je n'ai pas à toucher certaines choses en elle-même pour le moment.
MQ enregistrera les informations de classe du message, provoquant l'échec désérialisé
RabbitMQ dans le titre n'a jamais été mentionné, car il est simplement utilisé comme file d'attente de messages. Lorsque les données changent, l'ID de message est jeté dans MQ et le consommateur sur le service de recherche est consommé.
Le problème est que lorsque le message est jeté dans MQ, il est encapsulé dans son propre objet, ce qui provoque l'échec du lapin. En désespoir de cause, le consommateur ne peut obtenir directement les octets du message dans la file d'attente et convertir la forme JSON en un objet en utilisant la méthode objectMapper.readvalue.
Gradle Configuration peut utiliser -Dloader.main pour spécifier la fonction de démarrage
C'est précisément parce que MQ est introduit que le service de recherche doit démarrer un consommateur. La méthode consiste à implémenter une application qui ne démarre pas le service Web et à configurer un SimpleMessageListenerContainer et MessageListEnerAdapter comme suit:
@Bean SimpleMessageListenerContainer Container (ConnectionFactory ConnectionFactory, MessageListEnerAdapter AUVERNERADAPTER, MQCONFIG Properties) {SimpleMesSageListenderContainer Container = new SimpleMessageListenConainer (); contener.setConnectionFactory (ConnectionFactory); contener.setQueUenames (propriétés.getQueUename ()); contener.setMessageListener (audinerAdapter); conteneur de retour; } @Bean MessageListEnerAdapter audinerAdapter () {MessageListeRedapter audinerAdapter = new MessageListEnerAdapter (itemConsumer, "Consume"); Renvoie auditerAdapter; } Le problème est que lorsque la configuration de Gradle, j'ai recherché longtemps pour que le package JAR soit construit avec le -dloader spécifié pour spécifier l'application de démarrage. La solution est la suivante:
Ajouter le fichier xxx.gradle
bootjar {manifest {attributs 'Main-Class': 'org.springframework.boot.loader.propertieslauncher'}}Dans le projet Springboot 1.5.9, vous devez spécifier l'application de démarrage et l'ajouter
Springboot {Layout = "Zip"}La façon de vérifier s'il faut en vigueur est de décompresser directement le package JAR après la construction et de le vérifier en xxx (nom du projet) /Meta-info/manifest.mf.
Classe principale: org.springframework.boot.loader.propertieslauncher
Alors corrige, si
Classe principale: org.springframework.boot.loader.jarlauncher
La classe de démarrage dans le fichier sera toujours démarrée
ES ne peut pas modifier le mappage de l'index
Parce qu'il utilise simplement la fonction de recherche de texte de l'ES, il existe de nombreux résultats de recherche insatisfaisants dans des applications réelles, telles que la recherche de "bureau", et il est impossible de rechercher des contenus tels que "Office Desk / Office Desk" et d'autres tables XX. Il y a de nombreux cas de cette manière. Par conséquent, le dictionnaire synonyme est ajouté, et le segmentateur de mots ik_smart n'est pas utilisé sur les champs qui nécessitent une segmentation des mots, de sorte que la cartographie de certains champs doit être modifiée en
// Analyzer est son propre nom de segment de mot @field (type = fieldType.Text, index = true, analyzer = "synconym") String privé Description;
Étant donné que le mappage d'Es ne peut pas être modifié, vous ne pouvez créer manuellement qu'un nouveau mappage, puis utiliser la méthode Reindex pour remplir les données (ES5.x est livré avec l'API Reindex). Il existe une méthode en ligne via un alias. Dans certains scénarios de modification, vous pouvez modifier en douceur le mappage sans redémarrer / déployer l'application. Vous pouvez interroger et comprendre pour plus de détails.
Ce qui précède est presque les pièges qui ont été touchés par un service de recherche. Plusieurs d'entre eux ont consommé beaucoup de temps et d'énergie à résoudre. J'espère que ce sera la valeur de référence pour cette liste. À l'avenir, il y aura des optimisations dans le service de recherche et continuera d'être mis à jour lentement. J'espère également que tout le monde soutiendra davantage Wulin.com.