Maison  >  Article  >  base de données  >  Analyse approfondie de la recherche en texte intégral chinois dans MySQL 5.7

Analyse approfondie de la recherche en texte intégral chinois dans MySQL 5.7

黄舟
黄舟original
2017-01-18 11:48:212013parcourir

Système de gestion de bases de données relationnelles MySQL

MySQL est un petit système de gestion de bases de données relationnelles open source développé par la société suédoise MySQL AB. MySQL est largement utilisé sur les sites Web de petite et moyenne taille sur Internet. En raison de sa petite taille, de sa vitesse rapide, de son faible coût total de possession et surtout des caractéristiques de l'open source, de nombreux sites Web de petite et moyenne taille choisissent MySQL comme base de données de site Web afin de réduire le coût total de possession d'un site Web.


L'analyseur d'index de texte intégral par défaut d'InnoDB est très adapté au latin, car le latin utilise des espaces pour segmenter les mots. Mais pour des langues comme le chinois, le japonais et le coréen, un tel séparateur n'existe pas. Un mot peut être composé de plusieurs mots, nous devons donc le traiter de différentes manières. Dans MySQL 5.7.6, nous pouvons utiliser un nouveau plug-in d'indexation en texte intégral pour les gérer : l'analyseur n-gram.

Avant-propos

En fait, la recherche en texte intégral est prise en charge dans MySQL depuis longtemps, mais elle ne prend en charge que l'anglais. La raison en est qu'il utilise toujours des espaces comme séparateurs pour la segmentation des mots. Pour le chinois, il est évidemment inapproprié d'utiliser des espaces, et la segmentation des mots doit être basée sur la sémantique chinoise. Non, à partir de MySQL 5.7, MySQL intègre un plug-in de recherche en texte intégral ngram pour prendre en charge la segmentation des mots chinois et est efficace pour les moteurs MyISAM et InnoDB.

Avant d'utiliser le plug-in de segmentation de mots de recherche chinois ngram, vous devez d'abord définir sa taille de segmentation de mots dans le fichier de configuration MySQL. Par exemple,

[mysqld]
ngram_token_size=2

Ici, définissez la segmentation de mots. taille à 2. N'oubliez pas que plus la TAILLE de la segmentation des mots est grande, plus l'index sera grand, vous devez donc définir la taille appropriée en fonction de votre propre situation.

Exemple de structure de tableau :

CREATE TABLE articles (
   id INTUNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
   titleVARCHAR(200),
   body TEXT,
   FULLTEXT (title,body) WITH PARSER ngram
  ) ENGINE=InnoDBCHARACTER SET utf8mb4;

Exemple de données, avec 6 lignes d'enregistrements.

mysql> select * from articles\G
***************************1. row ***************************
  id: 1
title: 数据库管理
 body: 在本教程中我将向你展示如何管理数据库
***************************2. row ***************************
  id: 2
title: 数据库应用开发
 body: 学习开发数据库应用程序
***************************3. row ***************************
  id: 3
title: MySQL完全手册
 body: 学习MySQL的一切
***************************4. row ***************************
  id: 4
title: 数据库与事务处理
 body: 系统的学习数据库的事务概论
***************************5. row ***************************
  id: 5
title: NoSQL精髓
 body: 学习了解各种非结构化数据库
***************************6. row ***************************
  id: 6
title: SQL 语言详解
 body: 详细了解如果使用各种SQL
6 rows inset (0.00 sec)

Spécifiez explicitement la source de la table de recherche en texte intégral

mysql> SETGLOBAL innodb_ft_aux_table="new_feature/articles";
Query OK, 0 rows affected (0.00 sec)

Grâce à la table système, vous pouvez voir comment les données dans les articles sont divisées.

mysql> SELECT *FROM information_schema.INNODB_FT_INDEX_CACHE LIMIT 20,10;
+------+--------------+-------------+-----------+--------+----------+
| WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID| POSITION |
+------+--------------+-------------+-----------+--------+----------+
| 中我 |   2 |   2 |   1 |  2 |  28 |
| 习m |   4 |   4 |   1 |  4 |  21 |
| 习了 |   6 |   6 |   1 |  6 |  16 |
| 习开 |   3 |   3 |   1 |  3 |  25 |
| 习数 |   5 |   5 |   1 |  5 |  37 |
| 了解 |   6 |   7 |   2 |  6 |  19 |
| 了解 |   6 |   7 |   2 |  7 |  23 |
| 事务 |   5 |   5 |   1 |  5 |  12 |
| 事务 |   5 |   5 |   1 |  5 |  40 |
| 何管 |   2 |   2 |   1 |  2 |  52 |
+------+--------------+-------------+-----------+--------+----------+
10 rows in set (0.00 sec)

Vous pouvez voir ici que lorsque la longueur de segmentation des mots est définie sur 2, toutes les données sont uniquement par groupes de deux. Les données ci-dessus incluent également l'emplacement de la ligne, l'ID et d'autres informations.

Ensuite, je procéderai à une série de démonstrations de recherche. La méthode d'utilisation est la même que la recherche originale en anglais.

1. Recherchez en mode langage naturel :

1. Obtenez le nombre d'éléments qualifiés,

mysql>SELECT COUNT(*) FROM articles
-> WHERE MATCH (title,body) AGAINST ('数据库' IN NATURALLANGUAGE MODE);
+----------+
| COUNT(*) |
+----------+
|  4 |
+----------+
1 row in set (0.05 sec)

2. >

mysql>SELECT id, MATCH (title,body) AGAINST ('数据库' IN NATURAL LANGUAGE MODE)
 AS score FROM articles;
+----+----------------------+
| id| score    |
+----+----------------------+
| 1 | 0.12403252720832825 |
| 2 | 0.12403252720832825 |
| 3 |     0 |
| 4 | 0.12403252720832825 |
| 5 | 0.062016263604164124|
| 6 |     0 |
+----+----------------------+
6rows in set (0.00 sec)
2. Recherche en mode booléen, qui est plus compliqué que la recherche en mode naturel :


1. Faire correspondre les enregistrements dans la gestion et dans la base de données,

2. Faire correspondre une base de données, mais pas d'enregistrements de gestion,
mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('+数据库 +管理' IN BOOLEAN MODE);
+----+------------+--------------------------------------+
| id| title  | body         |
+----+------------+--------------------------------------+
| 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库  |
+----+------------+--------------------------------------+
1 rowin set (0.00 sec)


3. Faire correspondre MySQL, mais réduire la pertinence de la base de données,
mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('+数据库 -管理' IN BOOLEAN MODE);
+----+------------------+----------------------------+
| id| title    | body      |
+----+------------------+----------------------------+
| 2 | 数据库应用开发  | 学习开发数据库应用程序   |
| 4 | 数据库与事务处理 | 系统的学习数据库的事务概论  |
| 5 | NoSQL 精髓  | 学习了解各种非结构化数据库  |
+----+------------------+----------------------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('>数据库 +MySQL' INBOOLEAN MODE);
+----+---------------+-----------------+
| id| title   | body   |
+----+---------------+-----------------+
| 3 | MySQL完全手册 |学习MySQL的一切 |
+----+---------------+-----------------+
1 rowin set (0.00 sec)


3. Mode d'expansion des requêtes. Par exemple, si vous souhaitez effectuer une recherche dans la base de données, MySQL, Oracle et DB2 seront également recherchés

Bien sûr, je viens de faire une démonstration de fonctions et. plus de tests de performances. Si vous êtes intéressé, vous pouvez effectuer des tests détaillés. Étant donné que N-grm est un algorithme de segmentation de mots couramment utilisé pour la récupération du chinois et qu'il a été largement utilisé sur Internet, s'il est intégré à MySQL cette fois, il n'y aura certainement pas beaucoup de problèmes avec l'effet.
mysql> SELECT * FROM articles
  ->  WHERE MATCH (title,body)
  ->  AGAINST ('数据库' WITH QUERY EXPANSION);
+----+------------------+--------------------------------------+
| id| title   | body         |
+----+------------------+--------------------------------------+
| 1 | 数据库管理  | 在本教程中我将向你展示如何管理数据库  |
| 4 | 数据库与事务处理 | 系统的学习数据库的事务概论    |
| 2 | 数据库应用开发  | 学习开发数据库应用程序     |
| 5 | NoSQL 精髓  | 学习了解各种非结构化数据库    |
| 6 | SQL 语言详解  | 详细了解如果使用各种SQL     |
| 3 | MySQL完全手册  | 学习MySQL的一切      |
+----+------------------+--------------------------------------+
6 rows in set (0.01 sec)

Ce qui précède est une analyse approfondie de la recherche en texte intégral chinois de MySQL 5.7. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

Déclaration:
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