Un moteur de récupération et d'analyse de texte intégral hautement évolutif et open source qui peut rapidement stocker et rechercher dans en temps quasi réel, analysez des quantités massives de données.
La récupération de texte intégral signifie que le programme d'indexation informatique analyse chaque mot de l'article et crée un index pour chaque mot, indiquant le numéro et l'emplacement du mot dans l'article. Lorsque l'utilisateur interroge, le programme de récupération crée un index. sur la base de la recherche préétablie dans l'index et renvoyer les résultats de la recherche à la méthode de recherche de l'utilisateur. Ce processus est similaire au processus de recherche d'un mot dans la liste de mots de recherche dans un dictionnaire. Recherche en texte intégral des données dans la base de données du moteur de recherche
Mysql n'a que le terme couche de dictionnaire, qui est stocké sur le disque ? une manière de tri b-tree. La récupération d'un terme nécessite plusieurs opérations sur disque à accès aléatoire. Lucene ajoute un index de termes au dictionnaire de termes pour accélérer la récupération. L'index de termes est mis en cache en mémoire sous la forme d'une arborescence. Après avoir trouvé l'emplacement du bloc du dictionnaire de termes correspondant à partir de l'index des termes, nous allons ensuite sur le disque pour trouver le terme, ce qui réduit considérablement le nombre d'accès aléatoires au disque. De plus : le terme index est enregistré sous forme de FST (finite state transducers) en mémoire, ce qui est très économe en mémoire. Le terme dictionnaire est enregistré sur le disque en blocs. Un bloc est compressé à l'aide d'un préfixe commun. Par exemple, si tous les mots commencent par Ab, Ab peut être omis. De cette façon, le dictionnaire de termes peut économiser plus d'espace disque que le b-tree.
Nous utilisons le stockage de données MySQL, utilisons les fonctionnalités de transaction de MySQL pour maintenir la cohérence des données et utilisons ElasticSearch pour la collecte et les requêtes de données. et la base de données Le schéma de synchronisation est particulièrement important.
Processus
Ajoutez d'abord le produit dans la base de données. Une fois le produit ajouté avec succès, le produit est entré dans ES. Si l'entrée dans ES échoue, l'ID du produit ayant échoué est placé dans le. file d'attente du cache Redis et l'ID du produit défaillant Entrez le fichier journal (si Redis se bloque, vous pouvez obtenir l'ID du produit anormal à partir du journal, puis le saisir dans ES. La tâche actualise la file d'attente du cache Redis toutes les secondes). L'ID est obtenu à partir de la file d'attente du cache, l'ID du produit est récupéré de la base de données en fonction de l'ID du produit. Obtenez les données du produit, puis saisissez-les dans ES.
Utilisez le plug-in
logstash-input-jdbc pour synchroniser la base de données, l'installation, la configuration : créer un fichier .conf, configurer la base de données à synchroniser et l'instruction sql .sql pour l'exécution , et enfin mettre Un pilote jdbc est placé dans ce dossier pour se connecter à la base de données mysql
[Recommandations d'apprentissage associées : tutoriel mysql]
duplication des données elasticsearch et synchronisation incrémentielle
Dans la configuration par défaut, la valeur de tracking_column est @timestamp , la valeur _id qui existe dans elasticsearch est l'heure à laquelle logstash est stocké dans elasticsearch. La fonction principale de cette valeur est similaire à la clé primaire de mysql. Elle est unique, mais notre horodatage change tout le temps, nous l'utilisons donc. l'instruction select à interroger à chaque fois. Toutes les données seront stockées dans elasticsearch, ce qui entraînera une duplication des données.
Solution
Dans la table à interroger, recherchez la clé primaire ou le champ auto-incrémenté, et définissez-le sur la valeur de _id, car la valeur _id est unique, donc quand il y a is Lorsque le _id est répété, les données ne seront pas répétées
La synchronisation fréquente des données affecte les performances de la base de données mysql
L'instruction mysql que nous écrivons dans le fichier jdbc.sql est codée en dur, donc à chaque fois Il y a beaucoup de bases de données interrogées qui n'ont plus besoin d'être interrogées, surtout à chaque fois select * from table;, ce qui met beaucoup de pression sur la base de données mysql
Solution :
(1 ) Selon les besoins de l'entreprise, l'heure de synchronisation planifiée peut être modifiée de manière appropriée. J'ai ici des exigences en temps réel relativement élevées, j'ai donc défini un calendrier de 10 minutes => « */10 * * * * »
(2) Définir la plage de requêtes mysql Pour éviter qu'un grand nombre de requêtes ne bloquent la base de données, définissez select * from WHERE autoid > :sql_last_value;
la capacité de stockage d'elasticsearch continue d'augmenter
elasticsearch Pour la sécurité des données, après avoir reçu les données, définissez select * from WHERE autoid > :sql_last_value; , écrivez d'abord les données dans la mémoire et translogez-les, puis créez un index et écrivez-le sur le disque, même si. en cas de panne de courant soudaine, elle peut être restaurée via translog après le redémarrage. Cependant, comme il y a beaucoup de données en double dans chaque requête, ces données en double n'ont pas été écrites dans l'index elasticsearch, elles ont donc été accumulées, provoquant l'elasticsearch. capacité à continuer d'augmenter
Solution :
Le site officiel de la requête indique qu'elle sera actualisée régulièrement et que les anciens journaux seront automatiquement nettoyés, donc aucun traitement n'est requis
La synchronisation incrémentielle et la requête de plage MySQL entraînent l'impossibilité de synchroniser les données précédentes lorsque la base de données mysql est modifiée.
Résolu la requête MySQL à petite échelle à chaque fois, résolu le problème de la pression de la base de données, mais cela a causé le problème de l'impossibilité de synchroniser la modification des anciennes données
Solution :
Peut être basé sur l'entreprise Si votre base de données est fréquemment modifiée, vous ne pouvez effectuer que des mises à jour complètes. Cependant, l'indexation en analysant la base de données à haute fréquence et à large portée est pire que de ne pas faire d'indexation du tout (car l'indexation est également coûteuse), nous. effectuer l'indexation. Principalement pour les situations où la quantité de données est importante, n'est pas modifiée fréquemment et consomme les performances de la base de données. J'ai moins de modifications de données ici, et les modifications sont généralement des données récentes, car lors de la synchronisation, j'ai légèrement ajusté la plage mysql
php composer install composer nécessite elasticsearch/elasticsearch
Introduire le fichier es fichier autoload.php, définir l'adresse IP
Créer un index, l'index correspond à la base de données en données relationnelles (ci-après dénommée MySQL), plutôt que de correspondre à l'index dans MySQL
Il ne suffit pas d'avoir une base de données, il faut encore créer une table. Il en va de même pour ES. Le type dans ES correspond à la table dans MySQL. le type n'est pas défini séparément, mais est défini avec le champ, qui est défini dans le corps ; bien sûr, vous pouvez également utiliser la segmentation de mots ik dans le champ du corps
Utilisez EsClient->search () pour implémenter la recherche ; ;
Synonymes et utilisation de synonymes
[Recommandations d'apprentissage associées : programmation php (vidéo)]
Télécharger le package version ik de es
Créer le répertoire ik dans les plugins sous le répertoire es, et décompressez tous les fichiers du package zip ik téléchargé. Entrez.
Allez dans le répertoire de configuration de es, modifiez elasticsearch.yml et ajoutez index.analysis.analyzer.default.type : « ik » dans l'espace vide.
Configuration du segmenteur de mots Pinyin : utilisez celui compilé : elasticsearch-analysis-pinyin-1.3.0
Dans le répertoire plugins d'elasticsearch, créez un nouveau dossier Analysis-pinyin, décompressez le package compressé et placez le package jar. à l'intérieur du dossier analyse-pinyin.
Configurez le filtre du tokenizer Pinyin dans elasticsearch.yml
Configurez le filtre du tokenizer de synonyme dans elasticsearch.yml
Configurez le synonyme base de données et créez un nouveau sysnonym.txt dans le répertoire de configuration d'elasticsearch.
Configurez le tokenizer pour ik+pinying + synonymes, qui inclut principalement le nom, le type et les composants du tokenizer, ainsi que le traitement des dimensions segmentées : le pinyin et les synonymes sont utilisés ici
ES Lors de la requête, vous pouvez ajouter le champ de balise html aux données du champ après la requête, afin que le document soit affiché par couleur ou police lorsqu'il est affiché sur l'interface Web. Le format est de modifier le champ en surbrillance en surbrillance. Cette partie contient le fragment de texte correspondant à l'attribut name et est encapsulé dans des balises HTML
dans Elasticsearch Les données sont stockées. dans les fragments Lors d'une recherche, chaque fragment est recherché indépendamment, et les données sont ensuite intégrées et renvoyées.
Le processus de requête général est
1) La demande du client est envoyée à un certain nœud
2) Le nœud la transmet à chaque fragment et interroge les 10 principaux éléments de chaque fragment
3) Les résultats sont renvoyés au nœud, les données sont intégrées et les 10 premiers éléments sont extraits
4) Renvoyés au client demandeur
Lorsque nous interrogeons les données des éléments 10 à 20, il y a de deux manières, y compris la pagination profonde (à partir de la taille) et la pagination instantanée (défilement) ; événements actuellement retournés. La valeur par défaut de est 0 et la taille est 10, ce qui signifie que toutes les requêtes ne renvoient que les 10 premières données par défaut. Interrogez les 20 premiers éléments de données, puis tronquez les 10 premiers éléments et ne renvoyez que 10 à 20 éléments de données. Les 10 premières requêtes ont été vaines. Plus la pagination est éloignée, plus l'efficacité de l'exécution sera faible. Plus la valeur de décalage de la pagination est grande, plus il faudra de temps pour exécuter la requête de pagination
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!