L'utilisation d'ES dans MySQL et PHP

coldplay.xixi
Libérer: 2023-04-09 14:48:01
avant
4328 Les gens l'ont consulté

L'utilisation d'ES dans MySQL et PHP

Introduction à ES

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

Pourquoi ES est-il plus rapide que MySQL

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.

Synchroniser la base de données

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]

Problèmes possibles

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 en utilisant ES

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)]

Configurer le segmenteur de mots : configurer IK

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

Configuration du tokenizer de synonymes

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 Mise en surbrillance des mots clés

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

pagination de requête ES

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

Pagination instantanée (défilement)

Par rapport à la pagination à partir de et à la taille, utiliser le défilement peut simulez un curseur de données traditionnel et enregistrez la position des informations du document actuellement lues. L'utilisation de cette pagination n'est pas d'interroger des données en temps réel, mais d'interroger une grande quantité de données (voire toutes les données) en même temps. Étant donné que ce défilement équivaut à conserver des informations d'instantané du segment d'index actuel, ces informations d'instantané constituent l'instantané lorsque vous exécutez cette requête de défilement. Aucune nouvelle donnée indexée après cette requête ne sera interrogée dans cet instantané. Mais par rapport à from et à la taille, il n'interroge pas toutes les données et n'élimine pas les parties inutiles, mais enregistre une position de lecture pour garantir que la lecture suivante puisse se poursuivre rapidement. Processus :

  • Appel : index/type/_search?pretty&scroll=2m, renvoie une valeur de défilement
  • Utilisez directement scroll_id pour interroger.
  • Effacez le parchemin. Lorsque nous configurons le parchemin, nous définissons une durée de survie du parchemin. Cependant, si nous pouvons le fermer après utilisation, nous pouvons libérer des ressources plus tôt et réduire la charge sur ES. >Si vous souhaitez en savoir plus sur la programmation, faites attention à la rubrique
  • formation php
!

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal