L'index de texte intégral MySQL implémente une version simple du moteur de recherche

Préface

  • Seuls les moteurs de stockage Innodb et myisam peuvent utiliser l'indexation de texte intégral (innodb prend en charge l'indexation de texte intégral à partir de mysql5.6)
  • Les champs char, varchar, type de texte peuvent créer un index de texte intégral (type d'index de texte intégral)
  • L'index de recherche en texte intégral est basé sur des mots clés. Pour distinguer les différents mots clés, nous devons utiliser la segmentation des mots (mot-clé)
  • Les mots anglais sont séparés par des espaces et des virgules; la segmentation des mots chinois n'est pas pratique (une phrase ne sait pas distinguer les différents mots clés)
  • L'analyseur de segmentation de mots intégré prend en charge le chinois, le japonais et le coréen (expressions qui divisent les phrases en nombres fixes)
  • Lors de l'écriture d'une grande quantité de données dans une table, il est plus rapide de créer un index de texte intégral après avoir écrit les données (ce qui réduit les frais de gestion de l'index)
  • L'index inversé (une structure de données) du principe de l'indexation de texte intégral, qui utilise généralement un tableau associatif pour stocker le mappage entre les mots et l'emplacement du document dans la table auxiliaire

Pour utiliser

Utilisez MATCH ()… AGAINST pour rechercher

match () signifie que la colonne est recherchée, contre signifie que la chaîne à rechercher est

Affichez la segmentation des mots par défaut (utilisez ces mots pour distinguer différents mots-clés); vous pouvez également personnaliser la segmentation des mots pour utiliser ces mots pour distinguer différents mots-clés SELECT * FROM information_schema.INNODB_FT_DEFAULT_STOPWORD;

Comme

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

Trois types de méthodes de recherche en texte intégral

recherche en langage naturel

Vérifiez en passant une chaîne spécifique via MATCH AGAINST, la méthode par défaut

recherche booléenne

Ajouter des opérateurs à la chaîne récupérée, tels que "+" signifie qu'elle doit être incluse, "-" ne contient pas, "*" signifie un caractère générique, même si la chaîne passée est petite ou apparaît dans le mot d'arrêt, elle ne sera pas filtrée

recherche d'expansion de requête

La chaîne de recherche est utilisée pour effectuer une recherche en langage naturel, puis les mots de la ligne la plus pertinente renvoyés par la recherche sont ajoutés à la chaîne de recherche, et la recherche est effectuée à nouveau, la requête renvoie la ligne de la deuxième recherche

Paramètres associés

Configurer les paramètres associés

innodb_ft_min_token_size par défaut à 3, indiquant un minimum de 3 caractères comme mot-clé, l'augmentation de la valeur peut réduire la taille de l'index de texte intégral

innodb_ft_max_token_size par défaut à 84, ce qui signifie qu'un maximum de 84 caractères peut être utilisé comme mot-clé. La limitation de cette valeur peut réduire la taille de l'index de texte intégral

ngram_token_size par défaut à 2, ce qui signifie que 2 caractères sont utilisés comme mot-clé du tokenizer intégré. Par exemple, pour créer un index de texte intégral "abcd", les mots-clés sont 'ab', 'bc', 'cd'

Lors de l'utilisation de l'analyseur de segmentation de mots ngram, innodb_ft_min_token_size et innodb_ft_max_token_size ne sont pas valides

Notez qu'aucun de ces trois paramètres ne peut être modifié dynamiquement. Si vous modifiez ces paramètres, vous devez redémarrer le service MySQL et rétablir l'index de texte intégral

Tester le moteur innodb en utilisant l'index de texte intégral

Prêt

1. Objectif

  • Demander si un article contient un certain mot-clé; le nombre de fois qu'une série d'articles apparaît un certain mot-clé
  • Vérifiez si le titre de l'article contient un mot clé

2. Définissez les paramètres suivants pour réduire la pression d'E / S du disque

SET GLOBAL sync_binlog=100;
SET GLOBAL innodb_flush_log_at_trx_commit=2;

3. Importez des données de 1 kW pour tester l'index de texte intégral

La recherche en ligne de sources de données

https://pan.baidu.com/s/1aaB1R3bkBGZRMEx0o6T61w Code d'extraction: 60l7

4. La structure d'un tableau d'articles

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

Utiliser les données de test d'importation multithread myloader

-- 先把测试数据进行解压
tar -zxf mydumper_dump_article.tar.gz
time myloader -u $user -p $passwd -S $socket -t 32 -d /datas/dump_article -v 3

5. Après l'importation des données, le volume total de données et la taille du fichier de données et du fichier d'index

SELECT COUNT(*) FROM `article`;
+----------+
| COUNT(*) |
+----------+
| 10000000 |
+----------+
1 row in set (7.85 sec)

SELECT     table_name,   CONCAT(FORMAT(SUM(data_length) / 1024 / 1024,2),'M') AS dbdata_size,   CONCAT(FORMAT(SUM(index_length) / 1024 / 1024,2),'M') AS dbindex_size,   CONCAT(FORMAT(SUM(data_length + index_length) / 1024 / 1024 / 1024,2),'G') AS `db_size(G)`,   AVG_ROW_LENGTH,table_rows,update_time FROM   information_schema.tables WHERE table_schema = DATABASE() and table_name='article';
+------------+-------------+--------------+------------+----------------+------------+---------------------+
| table_name | dbdata_size | dbindex_size | db_size(G) | AVG_ROW_LENGTH | table_rows | update_time         |
+------------+-------------+--------------+------------+----------------+------------+---------------------+
| article    | 3,710.00M   | 1,003.00M    | 4.60G      |            414 |    9388739 | 2019-07-05 15:31:37 |
+------------+-------------+--------------+------------+----------------+------------+---------------------+

Utilisez la méthode par défaut pour créer un index de texte intégral

1. Le tableau possède déjà un champ de mot-clé (une brève description du contenu de l'article) et utilise "," comme tokenizer

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

2. Recherchez un mot-clé lorsque vous ne créez pas d'index de recherche en texte intégral

Analyse complète de la table requise

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

3. Créez un index de texte intégral sur le champ de mot-clé (avec, comme une segmentation de mot)

Définissez innodb_ft_min_token_size dans le fichier de configuration my.cnf et redémarrez le service MySQL (minimum deux caractères comme mot-clé, trois caractères par défaut comme mot-clé)

[mysqld]
innodb_ft_min_token_size=2

3.1 Définir des mots d'arrêt personnalisés (à savoir la segmentation des mots)

USE mysql;
CREATE TABLE my_stopwords(VALUE VARCHAR(30)) ENGINE = INNODB;
INSERT INTO my_stopwords(VALUE) VALUE (',');
SET GLOBAL innodb_ft_server_stopword_table = 'mysql/my_stopwords';

~

SHOW GLOBAL  VARIABLES WHERE Variable_name IN('innodb_ft_min_token_size','innodb_ft_server_stopword_table');
+---------------------------------+--------------------+
| Variable_name                   | Value              |
+---------------------------------+--------------------+
| innodb_ft_min_token_size        | 2                  |
| innodb_ft_server_stopword_table | mysql/my_stopwords |
+---------------------------------+--------------------+

3.2 Créer un index de texte intégral

alter table article add fulltext index idx_full_keyword(keywords);
* [ ] Query OK, 0 rows affected, 1 warning (1 min 27.92 sec)
* [ ] Records: 0  Duplicates: 0  Warnings: 1

3.3 L'espace disque restant doit être suffisant, la table d'origine est de 4,6 G et le disque 5,7 G restant, l'ajout d'index de texte intégral échouera également

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

3.4 Utilisez l'index de texte intégral créé pour interroger le nombre d'occurrences d'un mot clé

Le temps de réponse aux requêtes a été considérablement amélioré, seulement 0,05 s; l'utilisation de mots clés tels que «% Fashion%» prend 7,56 s. Lecture recommandée: pratiques d'optimisation des performances MySQL (très complètes et à collecter)

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

3.5 Si vous devez faire correspondre plusieurs mots clés en même temps, utilisez la recherche booléenne en texte intégral

Nombre d'enregistrements correspondant exactement à "Sanlitun, Beijing"

select count(*) from article where match(keywords)  against('+三里屯,北京' in boolean mode);
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.06 sec)

Indique le nombre d'enregistrements correspondant à "Sanlitun" ou "Beijing"

select count(*) from article where match(keywords)  against('三里屯,北京');
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.06 sec)

3.6 Après avoir créé un index de texte intégral, certains autres fichiers seront créés

96K 5 juillet 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_1.ibd96K 5 juillet 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_2.ibd96K 5 juillet 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_3.ibd96K 5 juillet 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_4.ibd128K 5 juillet 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_5.ibd256K 5 juillet 16:30 FTS_00000000000000a7_00000000000000c0_INDEX_6.ibd96K juillet 5 16:29 FTS_00000000000000a7_BEING_DELETED_CACHE.ibd96K 5 juil 16:29 FTS_00000000000000a7_BEING_DELETED.ibd96K 5 juil 16:30 FTS_00000000000000a7_CONFIG.ibd96K 5 juil 16:29 FTS_00000000000000aa__DELETE_TEDLE_DE

  • Les 6 premiers indiquent un index inversé (table d'index auxiliaire)
  • Les éléments 7 et 8 indiquent l'ID de document (DOC_ID) qui contient le document supprimé et ses données sont actuellement supprimées de l'index de texte intégral
  • La neuvième information indiquant l'état interne de l'index FULLTEXT
  • Les 10e et 11e documents contiennent des documents qui ont été supprimés mais leurs données n'ont pas été supprimées de l'index de texte intégral

Créer un index de texte intégral à l'aide de l'analyseur de segmentation de mots ngram

1. Établir un index de texte intégral sur le champ de titre (le champ n'a pas de segmentation de mots de mots vides fixe, utilisez l'analyseur de segmentation de mots ngram)

Vous devez définir ngram_token_size dans le fichier de configuration my.cnf (la valeur par défaut est 2, 2 caractères comme mots clés ngram) et redémarrer le service mysql

Utilisez le 2 par défaut ici

select title from article limit 10;
+------------------------------------------------------------------------------+
| title                                                                        |
+------------------------------------------------------------------------------+
| worth IT                                                                    |
|Launchpad 江南皮革厂小show                                                  |
|Raw 幕后罕见一刻 “疯子”被抬回后台                                           |
|Raw:公子大骂老爸你就是个绿茶  公子以一打四                                  |
|四组30平米精装小户型,海量图片,附户型图                                    |
|夜店女王性感烟熏猫眼妆                                                      |
|大秀哥重摔“巨石”强森                                                        |
|少女时代 崔秀英 服饰科普 林允儿 黄美英 金泰妍 郑秀晶                        |                                              
|德阳户外踏青,花田自助烧烤                                                  |
+------------------------------------------------------------------------------+

2. Créez un index de texte intégral dans le champ de titre

alter table article add fulltext index ft_index_title(title) with parser ngram;
Query OK, 0 rows affected (3 min 29.22 sec)
Records: 0  Duplicates: 0  Warnings: 0

3. Un index inversé sera créé (plus le champ de titre est long, plus l'index inversé créé sera grand)

112M 5 juillet 21h46 FTS_00000000000000a7_00000000000000cd_INDEX_1.ibd28M 5 juillet 21h46 FTS_00000000000000a7_00000000000000cd_INDEX_2.ibd20M 5 juillet 21h46 FTS_00000000000000a7_00000000000000cd_INDEX_3.ibd140M 5 juillet 21h46 FTS_00000000000000a7_00000000000000cd_INDEX_4.ibd128M 5 juillet 21h46 FTS_00000000000000a7_00000000000000cd_INDEX_5.ibd668M 5 juillet 21h46 FTS_00000000000000a7_00000000000000cd_INDEX_6.ibd

4. Recherchez un mot-clé de titre sans établir d'index de texte intégral

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

5. Utilisez un index de texte intégral pour rechercher un mot clé

Le temps de réponse est considérablement amélioré

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

6. Notez que lorsque le nombre de mots clés recherchés est supérieur à 2 (la taille définie par ngram_token_size), il y aura des incohérences

Recherche ordinaire, le nombre réel d'enregistrements où le mot-clé apparaît est 6

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

Recherche plein texte, le nombre d'enregistrements avec des mots-clés est 9443

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

Le nombre d'enregistrements où le mot clé apparaît réellement est 1

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

Le nombre d'enregistrements où le mot-clé apparaît dans la recherche en texte intégral est 3202

L'index de texte intégral MySQL implémente une version simple du moteur de recherche

 

Conclusion

Lorsqu'il y a un participe fixe de mot d'arrêt (caractère espace en anglais, "," "-", etc.) dans un champ de mysql, un index de texte intégral est établi pour le champ, qui peut rapidement rechercher les informations d'enregistrement pertinentes d'un certain mot-clé et réaliser une recherche simple Effet moteur

Lorsqu'un champ mysql n'a pas de segmentation de mot de mot d'arrêt fixe, utilisez l'analyseur intégré ngram pour diviser la valeur du champ en un nombre fixe de mots clés (la taille définie par ngram_token_size) pour une recherche rapide; lorsque le nombre de caractères du mot clé recherché n'est pas égal à la taille définie par ngram_token_size, Il y a un problème qui ne correspond pas à la situation réelle

L'index de recherche en texte intégral peut être recherché rapidement, et il y a aussi la surcharge de maintenance de l'index; plus la longueur du champ est grande, plus l'index de texte intégral créé est important, ce qui affectera le débit de l'instruction DML. Un moteur de recherche de texte intégral dédié ES peut être utilisé pour ce faire.                                              

Je suppose que tu aimes

Origine www.cnblogs.com/CQqfjy/p/12689863.html
conseillé
Classement