Heim  >  Artikel  >  Datenbank  >  Eingehende Analyse der chinesischen Volltextsuche in MySQL 5.7

Eingehende Analyse der chinesischen Volltextsuche in MySQL 5.7

黄舟
黄舟Original
2017-01-18 11:48:212025Durchsuche

Relationales MySQL-Datenbankverwaltungssystem

MySQL ist ein kleines relationales Open-Source-Datenbankverwaltungssystem, das von der schwedischen Firma MySQL AB entwickelt wurde. MySQL wird häufig auf kleinen und mittelgroßen Websites im Internet verwendet. Aufgrund der geringen Größe, der hohen Geschwindigkeit, der niedrigen Gesamtbetriebskosten und insbesondere der Eigenschaften von Open Source wählen viele kleine und mittlere Websites MySQL als Website-Datenbank, um die Gesamtbetriebskosten der Website zu senken.


Der Standard-Volltextindex-Parser von InnoDB eignet sich sehr gut für Latein, da Latein Leerzeichen zum Segmentieren von Wörtern verwendet. Für Sprachen wie Chinesisch, Japanisch und Koreanisch gibt es jedoch kein solches Trennzeichen. Ein Wort kann aus mehreren Wörtern bestehen, daher müssen wir auf unterschiedliche Weise damit umgehen. In MySQL 5.7.6 können wir ein neues Volltextindex-Plug-in verwenden, um sie zu verarbeiten: den N-Gramm-Parser.

Vorwort

Tatsächlich wird die Volltextsuche in MySQL schon seit langem unterstützt, jedoch nur Englisch. Der Grund dafür ist, dass er bei der Wortsegmentierung immer Leerzeichen als Trennzeichen verwendet. Für Chinesisch ist die Verwendung von Leerzeichen offensichtlich unangemessen, und die Wortsegmentierung muss auf der chinesischen Semantik basieren. Nein, ab MySQL 5.7 verfügt MySQL über ein integriertes Ngram-Volltextsuch-Plug-in zur Unterstützung der Segmentierung chinesischer Wörter und ist für MyISAM- und InnoDB-Engines wirksam.

Bevor Sie das chinesische Suchwortsegmentierungs-Plug-in ngram verwenden, müssen Sie zunächst seine Wortsegmentierungsgröße in der MySQL-Konfigurationsdatei festlegen.

[mysqld]
ngram_token_size=2

Stellen Sie hier die Wortsegmentierung ein Größe auf 2. Denken Sie daran, dass der Index umso größer ist, je größer die Größe der Wortsegmentierung ist. Sie sollten daher die entsprechende Größe entsprechend Ihrer eigenen Situation festlegen.

Beispieltabellenstruktur:

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;

Beispieldaten mit 6 Datensatzzeilen.

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)

Geben Sie explizit die Quelle der Volltextsuchtabelle an

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

Über die Systemtabelle können Sie sehen, wie die Daten in Artikeln aufgeteilt sind.

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)

Hier können Sie sehen, dass bei einer Wortsegmentierungslänge von 2 alle Daten nur in Zweiergruppen vorliegen. Zu den oben genannten Daten gehören auch Zeilenposition, ID und andere Informationen.

Als nächstes werde ich eine Reihe von Suchdemonstrationen durchführen. Die Verwendungsmethode ist die gleiche wie bei der ursprünglichen englischen Suche.

1. Suche im natürlichen Sprachmodus:

Ermitteln Sie die Anzahl der qualifizierten Elemente,

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

2. Ermitteln Sie das Übereinstimmungsverhältnis >

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. Suche im Booleschen Modus, der komplizierter ist als die Suche im natürlichen Modus:


1. Datensätze sowohl in der Verwaltung als auch in der Datenbank abgleichen,

mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('+数据库 +管理' IN BOOLEAN MODE);
+----+------------+--------------------------------------+
| id| title  | body         |
+----+------------+--------------------------------------+
| 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库  |
+----+------------+--------------------------------------+
1 rowin set (0.00 sec)
2. Übereinstimmung mit einer Datenbank, aber ohne Verwaltungsdatensätze,


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)
3. Übereinstimmung mit MySQL, aber Reduzierung der Relevanz der Datenbank,

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. Wenn Sie beispielsweise die Datenbank durchsuchen möchten, werden auch MySQL, Oracle und DB2 durchsucht.

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)
Natürlich nur Funktionsdemonstration Weitere Leistungstests können Sie bei Interesse gerne durchführen. Da N-grm ein häufig verwendeter Wortsegmentierungsalgorithmus für den chinesischen Abruf ist und im Internet weit verbreitet ist, wird es bei der Integration in MySQL dieses Mal definitiv keine großen Probleme mit dem Effekt geben.

Das Obige ist eine ausführliche Analyse der chinesischen Volltextsuche von MySQL 5.7. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn