ホームページ >データベース >mysql チュートリアル >MySQL 5.7 での中国語全文検索の詳細な分析

MySQL 5.7 での中国語全文検索の詳細な分析

黄舟
黄舟オリジナル
2017-01-18 11:48:212051ブラウズ

Mysql リレーショナル データベース管理システム

MySQL は、スウェーデンの MySQL AB 社によって開発された、オープンソースの小規模リレーショナル データベース管理システムです。 MySQL は、インターネット上の小規模および中規模の Web サイトで広く使用されています。 MySQL は、サイズが小さく、速度が速く、総所有コストが低く、特にオープンソースの特性により、Web サイトの総所有コストを削減するために、多くの中小規模の Web サイトが Web サイト データベースとして MySQL を選択しています。


InnoDB のデフォルトのフルテキスト インデックス パーサーは、ラテン語に非常に適しています。これは、ラテン語では単語の分割にスペースが使用されるためです。しかし、中国語、日本語、韓国語などの言語には、そのような区切り文字はありません。単語は複数の単語で構成される場合があるため、さまざまな方法で単語を処理する必要があります。 MySQL 5.7.6 では、新しいフルテキスト インデックス プラグインを使用してそれらを処理できます: n-gram パーサー。

はじめに

実は、全文検索は MySQL で長い間サポートされてきましたが、サポートされていたのは英語のみでした。その理由は、中国語の場合、スペースを使用するのは明らかに不適切であり、単語の分割は中国語の意味論に基づく必要があるためです。いいえ、MySQL 5.7 以降、MySQL には中国語の単語の分割をサポートする ngram 全文検索プラグインが組み込まれており、MyISAM および InnoDB エンジンに効果的です。

中国語検索単語分割プラグイン ngram を使用する前に、まず MySQL 構成ファイルで単語分割サイズを設定する必要があります。たとえば、

[mysqld]
ngram_token_size=2

ここでは単語分割サイズを 2 に設定します。単語分割の SIZE が大きいほどインデックスも大きくなるので、状況に応じて適切なサイズを設定する必要があることに注意してください。

テーブル構造の例:

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;

6 行のレコードを含むデータの例。

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)

全文検索テーブルのソースを明示的に指定

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

システムテーブルを通じて、記事内のデータがどのように分割されているかを確認できます。

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)

ここで、単語の分割長が 2 に設定されている場合、すべてのデータは 2 つのグループにのみ存在することがわかります。上記のデータには、行の位置、ID、その他の情報も含まれます。

次に、一連の検索デモを行います。使用方法は、本来の英語検索と同じです。

1. 自然言語モードでの検索:

1. 適合する項目の数を取得します、

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

2. ブール値モードでの検索、これは自然モード検索と比較されます。より複雑:


1. レコードを管理とデータベースの両方と照合する、

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. レコードをデータベースと照合する、ただし管理は行わない、

mysql> SELECT * FROM articles WHERE MATCH (title,body)
  ->  AGAINST ('+数据库 +管理' IN BOOLEAN MODE);
+----+------------+--------------------------------------+
| id| title  | body         |
+----+------------+--------------------------------------+
| 1 | 数据库管理 | 在本教程中我将向你展示如何管理数据库  |
+----+------------+--------------------------------------+
1 rowin set (0.00 sec)

3. MySQL を照合する、ただしデータベースの関連性を下げる、

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. クエリ拡張モード。たとえば、データベースを検索したい場合は、MySQL、oracle、DB2 も検索されます。

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

もちろん、ここでは機能のデモンストレーションを行っているだけです。皆さん、さらにパフォーマンス テストを行ってください。ご興味があれば、詳細なテストをご利用いただけます。 N-grmは中国語検索によく使われる単語分割アルゴリズムであり、インターネット上で広く使われているため、今回MySQLに統合されれば、その効果には大きな問題はないだろう。

上記は MySQL 5.7 の中国語全文検索の詳細な分析です。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。