検索エンジンのMySQLのフルテキストインデックスの単純なバージョン

序文

  • のみのInnoDB MyISAMストレージおよびフルテキストインデックスエンジンを使用して(InnoDBのサポートフルテキストインデックスがmysql5.6から開始されました)
  • CHAR、VARCHAR、テキスト型のフィールドは、フルテキストインデックス(フルテキストインデックス型)を作成することができます
  • フルテキストインデックスは、別のキーワードを区別するためにどのように、キーワードに基づいて、私たちは言葉(ストップワード)を使用する必要があります
  • 英語の単語は、スペース、カンマで単語であった。中国の言葉は便利ではありません(文は異なるキーワードを区別する方法を知りません)
  • 内蔵語パーサーnグラム韓国語、中国語、日本語、(フレーズの固定数に文)のサポート
  • テーブルの上に大量のデータを書き込み、その後、書き込みデータに高速のフルテキストインデックスを作成する場合(インデックスを維持するためのオーバーヘッドを低減し)
  • (データ構造)の原理の逆インデックスフルテキストインデックス、一般的に連想配列を使用して、マッピングは、ドキュメント内の単語と場所に格納される補助テーブル

使用

MATCH()... AGAINST検索する方法と
一致するものが()検索が表現に対して、その列であることを示し、それは、その文字列を意味し、

また、これらの言葉は、異なるキーワードを区別するために単語をカスタマイズすることができ、デフォルトの単語(これらの異なるキーワードを区別する単語)を参照してください
information_schema.INNODB_FT_DEFAULT_STOPWORD SELECT * FROM;
など

+-------+ 
| value | 
+-------+ 
| a     | 
| about | 
| an    | 
| are   | 
| as    | 
| at    | 
| be    | 
| by    | 
| com   | 
| de    | 
| en    | 
| for   | 
| from  | 

全文検索方法の三種類

自然言語検索(自然言語検索)
特定の文字列をチェックするMATCH AGAINSTを通過させ、デフォルト

ブール検索(ブール検索)
検索文字列には、「+」の手段として、オペレータは、含まれていなければならない増加として- 「*」、ワイルドカードを表し、小さいか、または単語でも、文字列の転送に表示されて停止する、ことを含んでいません。「」それは除外されることはありません

クエリ拡張検索(クエリ拡張検索)
自然言語検索の実装のための検索文字列、その後、ワード検索は、最も関連性の高いラインを再度検索文字列と検索に追加されます戻る、クエリは、2番目の検索から行を返します。

関連するパラメータ

構成パラメータ
innodb_ft_min_token_sizeの
デフォルト3,3をキーワードとして最低限の文字を表しは、フルテキストインデックス値はのサイズを小さくするために増加させることができます

innodb_ft_max_token_sizeの
限界値のキーワード、フルテキストインデックスとして最大84個の文字を表すデフォルト84は、小型化することができます

ngram_token_sizeの
デフォルト2は、そのような「ABCD」フルテキストインデックスが作成された、キーワードが「AB」で、「BC」として、キーワードを建てワードパーサーの2つの文字を表し、 「CD」
NGRAM単語パーサ、innodb_ft_min_token_size無効なinnodb_ft_max_token_size

ことに注意してください、これらのパラメータを変更MySQLサービスを再起動する必要があり、フルテキストインデックスを再構築これらの三つのパラメータを動的に変更されていません

フルテキストインデックスを使用してInnoDBエンジンテスト

レディ

1つのゴール

  • それはキーワード検索の記事が含まれている場合は、回数キーワードは、一連の記事に表示されます。
  • 記事のタイトルにキーワードが含まれているかどうかを照会します

図2は、ディスクIOの圧力を低減するために、以下のパラメータを設定します


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

フルテキストインデックステストするための3、1キロワットインポートデータ
のためのデータソースのWeb検索の
コードを抽出する:60l7

4、テーブルアーティクルの構造

CREATE TABLE `article` (
  `id` bigint(10) NOT NULL,
  `url` varchar(1024) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `title` varchar(256) NOT NULL DEFAULT '',
  `source` varchar(32) DEFAULT '' COMMENT '真实来源',
  `keywords` varchar(32) DEFAULT NULL,
  `publish_time` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `title_idx` (`title`)
) ENGINE=InnoDB

テストデータに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に示すように、データインポートファイル、インデックスファイルサイズ後のデータとデータの合計量

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 |
+------------+-------------+--------------+------------+----------------+------------+---------------------+

デフォルトモードを使用して、フルテキストインデックスを作成します。

1は、テーブルにはすでに単語の区切りとして「」(短い記事の内容)、およびキー・フィールドを持っています

select keywords from article limit 10;
+-------------------------------------------------+
| keywords                                        |
+-------------------------------------------------+
| NULL                                            |
| NULL                                            |
| ,婚姻,爱情                                      |
| 发型,偏分,化妆,时尚                             |
| 小A,                                            |
| ,服装搭配,女性,时尚                             |
| 漂亮,女性                                       |
| 情人节,东莞,女性                                |
| 皮肤,护肤,护肤,食品营养,美容,养生               |
| 三里屯,北京,时尚                                |
+-------------------------------------------------+

2、キーワードのフルテキストインデックス検索を構築していないが
、フルテーブルスキャンが必要です

select count(*) from article where keywords like '%时尚%';
+----------+
| count(*) |
+----------+
|      163 |
+----------+
1 row in set (7.56 sec)

3.(Wordなどで、)キーワードフィールドのフルテキストインデックスを作成します。

  • MySQLサービスのmy.cnf設定ファイルinnodb_ft_min_token_sizeを設定し、再起動します(キーワードとして最小2つの文字、デフォルトをキーワードとして3文字)
[mysqld]
innodb_ft_min_token_size=2
  • 3.1に設定したカスタムストップワード(すなわち単語)
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フルテキストインデックスを作成します。
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は失敗し、フルテキストインデックスを追加し、十分な空きディスク容量、元のテーブル4.6gの、5.7gの残りのディスクであること
df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1             7.8G  6.3G  1.2G  85% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm
/dev/mapper/vg_opt-lvol0
                       19G   12G  5.7G  68% /datas

会创建原表大小的临时文件
 8.6K Jul  5 16:19 #sql-5250_3533.frm
 4.4G Jul  5 16:20 #sql-ib117-1768830977.ibd


alter table article add fulltext index idx_full_keyword(keywords);
ERROR 1114 (HY000): The table 'article' is full
  • 3.4フルテキストインデックスは、キーワードがクエリに表示された回数使用して作成した
    「%%ファッション」のようなキーワードが7.56sを必要とする場所を使用しています。ただ0.05s、クエリの応答時間が大幅に改善されました
select count(*) from article where match(keywords) against('%时尚%');
+----------+
| count(*) |
+----------+
|      163 |
+----------+
1 row in set (0.05 sec)
  • 複数の同時完全一致キーワード、ブール全文検索のために3.5
表示完全匹配 "三里屯,北京" 的记录数
select count(*) from article where match(keywords)  against('+三里屯,北京' in boolean mode);
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.06 sec)

表示匹配“三里屯” 或者 “北京”的记录数
select count(*) from article where match(keywords)  against('三里屯,北京');
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.06 sec)
  • 3.6フルテキストインデックスが作成され、それはいくつかの他のファイルが作成されます
    96K 7月5日16時30分FTS_00000000000000a7_00000000000000c0_INDEX_1.ibd
    96K 7月5日16時30分FTS_00000000000000a7_00000000000000c0_INDEX_2.ibd
    96K 7月5日16時30分FTS_00000000000000a7_00000000000000c0_INDEX_3.ibd
    96K 7月5日16時30分FTS_00000000000000a7_00000000000000c0_INDEX_4.ibd
    128K 7月5日にFTS_00000000000000a7_00000000000000c0_INDEX_5.ibd 16:30
    256K 7月5日16時30 FTS_00000000000000a7_00000000000000c0_INDEX_6.ibd
    96K 7月5日16時29 FTS_00000000000000a7_BEING_DELETED_CACHE.ibd
    96K 7月5日16時29 FTS_00000000000000a7_BEING_DELETED.ibd
    96K 7月5日16時30 FTS_00000000000000a7_CONFIG.ibd
    96K 7月5日16時29 FTS_00000000000000a7_DELETED_CACHE。 IBD
    96K 7月5日16時29 FTS_00000000000000a7_DELETED.ibd
    -第6の逆索引(二次インデックステーブル)を表し
    -第7及び第8の文書ID(DOC_ID)は、データが現在フルテキストインデックスから削除され、ドキュメントを削除含む発現
    9 FULLTEXTインデックスが内部状態を表し、 -情報
    -第10,11は、それが削除されたデータが含まれて示したが、文書のフルテキストインデックスから削除しません

ワードパーサーを使用して、フルテキストインデックスを作成します。nグラム

1、タイトルフィールドのフルテキストインデックス(フィールドには何も固定ストップワードの言葉ではありません、NGRAM単語パーサーを使用)の確立
最初のmy.cnfの設定ファイルにngram_token_size設定する必要があります(デフォルトでは、キーワードとして2,2 nグラム文字である)、および再起動のMySQLサービス
ここでは、デフォルトの2を使用します

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

2.タイトルフィールドのフルテキストインデックスを作成します。

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、作成転置インデックス(長いタイトルフィールド、転置インデックスの大きい作成)
112M 7月5日21:46 FTS_00000000000000a7_00000000000000cd_INDEX_1.ibd
28M 7月5日21:46 FTS_00000000000000a7_00000000000000cd_INDEX_2.ibd
20M 7月5日21:46 FTS_00000000000000a7_00000000000000cd_INDEX_3.ibd
140M 5 21:46 FTS_00000000000000a7_00000000000000cd_INDEX_4.ibd 7月
128M 7月5日21時46分FTS_00000000000000a7_00000000000000cd_INDEX_5.ibd
668M 7月5日21時46分FTS_00000000000000a7_00000000000000cd_INDEX_6.ibd

4、フルテキストインデックス検索キーワードのタイトルを確立していません

select count(*) from article where title like '%户外%';
+----------+
| count(*) |
+----------+
|    22058 |
+----------+
1 row in set (8.60 sec)

select count(*) from article where title like '%后台%';
+----------+
| count(*) |
+----------+
|     1142 |
+----------+

キーワードのためのフルテキストインデックス検索用いて5、
応答時間が大幅に改善されています

select count(*) from article where match(title)  against('户外');
+----------+
| count(*) |
+----------+
|    22058 |
+----------+
1 row in set (0.07 sec)

select count(*) from article where title like '%后台%';
+----------+
| count(*) |
+----------+
|     1142 |
+----------+
1 row in set (8.31 sec)

検索キーワードは、2(ngram_token_size定義されたサイズ)よりも文字であるとき6、矛盾があるだろうに注意を払います

普通搜索,实际中出现该关键词的记录数为6
select count(*) from article where title like '%公子大%';
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (8.40 sec)

全文搜索,出现关键字的记录数为9443
select count(*) from article where match(title)  against('公子大');
+----------+
| count(*) |
+----------+
|     9443 |
+----------+
1 row in set (0.06 sec)

实际出现该关键字的记录数为1
select count(*) from article where title like '%花田自助%';
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (8.33 sec)

全文搜索出现该关键词的记录数为3202
select count(*) from article where match(title)  against('花田自助');
+----------+
| count(*) |
+----------+
|     3202 |
+----------+
1 row in set (0.06 sec)

結論

  • 固定されたストップワード・ワードを使用してMySQLのフィールド(英語のスペースでは、中国の「と」「 - 」など)場合は、フィールドのフルテキストインデックスの確立、キーワード検索に関連することができますすぐに情報を記録するには、単純な検索を表示されますエンジンの検索結果
  • 検索キーワードの文字数が等しくないngram_token_size定義された大きさをしたときに、意志;フィールドが構築NGRAMリゾルバフィールド値を使用して、MySQLのストップワードのワードを固定されていない場合、固定数(ngram_token_size定義されたサイズ)クイック検索キーワードに分割することができます問題の実際の状況と矛盾して表示されます
  • フルテキストインデックスはすぐにインデックスを維持するためのコストもあり、検索することができ、より大きなフィールドの長さは、より大きなフルテキストインデックスの作成は、DML文は、スループットが提供する専用のフルテキスト検索エンジンESはそれを行うに影響を与えます

リファレンス
のInnoDB FULLTEXTインデックス

おすすめ

転載: www.linuxidc.com/Linux/2019-07/159524.htm