42
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | MySQL 5.7 InnoDB 日本語全文検索(その3) Yoshiaki Yamasaki / 山﨑 由章 MySQL Senior Sales Consultant, Asia Pacific and Japan updated: 2016/09/29

20160929 inno db_fts_jp

Embed Size (px)

Citation preview

Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |

MySQL 5.7 InnoDB 日本語全文検索(その3)

Yoshiaki Yamasaki / 山﨑 由章 MySQL Senior Sales Consultant, Asia Pacific and Japan

updated: 2016/09/29

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Safe Harbor Statement

以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。 また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことはできません。以下の事項は、マテリアルやコード、機能を提供することをコミットメントするものではない為、購買決定を行う際の判断材料になさらないで下さい。 オラクル製品に関して記載されている機能の開発、リリースおよび時期については、 弊社の裁量により決定されます。

2

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

少し復習します

4

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

全文検索機能の仕組み

5

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

全文検索インデックス

• トークンと文章の関係を表現した転置インデックス

6

This movie is about a boy going to war.

This movie is about a

girl starting an auto-

shop.

This movie is about

flowers.

a about an are as at be by com de en for from

how i in is it la of

on or that the this to

was what when where

who will with und

the www

Min Token Size

Max Token Size

Document 1

Document 2

Document 3

Stop Words Token Size

Full Text / Inverted Index

ID TOKEN DOCUMENT

1 movie 1,2,3

2 boy 1

3 girl 2

4 going 1

5 starting 2

6 war 1

7 auto-shop 2

8 flowers 3

Token Filters Documents

Tokenizer

Tokenizer

Indexer

Indexer

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

InnoDB全文検索機能の日本語対応

7

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

全文検索機能の日本語対応とは?

•日本語の文章を字句解析して、全文検索用のインデックスを作成できる –英語などは、スペースを区切り文字として字句解析できるが、 日本語には区切り文字が無いため、追加の字句解析機能が必要

8

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

MySQL 5.7でサポートされた日本語の字句解析方法

• N-gram: 一定の文字数で切りだして字句解析する手法 –デフォルトではbi-gram(2文字単位)

• MeCab:オープンソースの形態素解析エンジン –日本語の辞書をベースに字句解析する

9

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

MySQL 5.7での強化点

• N-gramによる日本語、中国語、韓国語サポート –N文字区切りでトークンを検出

10

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE ORDER BY doc_id, position LIMIT 10; +--------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION | +--------+--------------+-------------+-----------+--------+----------+ | ロー | 1 | 15 | 2 | 1 | 0 | | ール | 1 | 16 | 3 | 1 | 3 | | ルと | 1 | 1 | 1 | 1 | 6 | | とグ | 1 | 1 | 1 | 1 | 9 | | グル | 1 | 7 | 2 | 1 | 12 | | ルー | 1 | 16 | 3 | 1 | 15 | | ープ | 1 | 7 | 2 | 1 | 18 | | プベ | 1 | 1 | 1 | 1 | 21 | | 環境 | 1 | 1 | 1 | 1 | 21 | | ベー | 1 | 7 | 4 | 1 | 24 | +--------+--------------+-------------+-----------+--------+----------+ 10 rows in set (0.01 sec)c

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

MySQL 5.7での強化点

• MeCabによる日本語サポート –MeCab(オープンソースの日本語辞書)を使ってトークンを検出

11

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE ORDER BY doc_id, position LIMIT 10; +--------------------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION | +--------------------+--------------+-------------+-----------+--------+----------+ | ロール | 1 | 1 | 1 | 1 | 0 | | グループ | 1 | 7 | 2 | 1 | 12 | | 環境 | 1 | 1 | 1 | 1 | 21 | | ベース | 1 | 7 | 2 | 1 | 24 | | アクセス | 1 | 1 | 1 | 1 | 36 | | コントロール | 1 | 1 | 1 | 1 | 48 | | により | 1 | 1 | 1 | 1 | 66 | | mysql | 1 | 16 | 12 | 1 | 78 | | dba | 1 | 16 | 4 | 1 | 83 | | きめ細か | 1 | 1 | 1 | 1 | 91 | +--------------------+--------------+-------------+-----------+--------+----------+ 10 rows in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

その他

• InnoDB日本語全文検索機能の使用方法は、1回目の資料参照 –事前準備

–全文検索インデックス作成方法

–転置インデックス確認方法

• MySQL 5.7では、日本語全文検索がお手軽に使用できる

12

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

その他

•全文検索関数の使い方や関連性ランキングについては、 2回目の資料参照 –全文検索関数の構文

– AND、OR、NOT検索

–重みづけの変更方法

• MySQL 5.7の日本語全文検索は、一致するドキュメントを探すだけでなく、 検索ワードと関連の強いドキュメントを探す場合にも役立つ

13

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

復習終わり

14

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワードの設定

15

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワードとは?

•全文検索インデックスの対象から外す単語

•任意でストップワードを追加できる

•検索対象に含める必要のない単語をストップワードに指定することで、 インデックスサイズの縮小によるパフォーマンス向上が期待できる –検索ワードとして指定しない単語

–大半の文章に含まれていて、絞り込みの役に立たない単語

16

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワードの設定方法

1.ストップワードを格納するためのテーブルを作成する

2.必要なシステム変数を設定する

3.ストップワードを”1.”で作成したテーブルに格納する

※追加したストップワードを反映させるためには、 全文検索インデックスの再作成が必要

17

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

設定例:ストップワード用のテーブル作成

• varchar型のvalue列のみを持つテーブルを作成する

• テーブル名は任意でOK

18

CREATE TABLE mecab.stopwords(value varchar(255) PRIMARY KEY);

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

設定例: システム変数の設定

• my.cnfに以下を設定して再起動する – innodb_ft_enable_stopword (デフォルトでON)

– innodb_ft_server_stopword_table (SETコマンドで動的に変更も可能)

• innodb_ft_server_stopword_tableは、“スキーマ名/テーブル名”の 形式で指定する

19

character_set_server=utf8mb4

loose-mecab-rc-file=/usr/local/mysql/lib/mecab/etc/mecabrc

innodb_ft_min_token_size=2

innodb_ft_enable_stopword=ON

innodb_ft_server_stopword_table=mecab/stopwords

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

設定例:ストップワードの追加

• innodb_ft_server_stopword_tableで指定したテーブルに追加したい ストップワードをINSERTする

•追加したストップワードを反映させるためには、全文検索インデックスの 再作成が必要

20

INSERT INTO mecab.stopwords VALUES('など'),('および'),('こと'),('でき'),('ます'),('mysql');

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

補足

•特定のテーブルに独自のストップワードを設定したい場合には、innodb_ft_user_stopword_tableを利用する

• innodb_ft_user_stopword_tableはセッション単位で設定変更出来るため、 innodb_ft_user_stopword_tableの設定を変えてから全文検索インデックスを作成する

• innodb_ft_user_stopword_tableを設定した場合、 innodb_ft_server_stopword_tableは無視される

21

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワードの指定例

22

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

サンプルテーブル

•サンプルテーブルのテーブル定義 – description列にMeCabパーサーを使用して全文検索インデックスを作成

•サンプルテーブルに格納した文章 –MySQL Enterprise Monitorのページ(※)に記載されている説明文をtitle列、

description列に格納(2016年9月20日時点のもの)

※https://www-jp.mysql.com/products/enterprise/monitor.html

23

mysql> show create table articles¥G *************************** 1. row *************************** Table: articles Create Table: CREATE TABLE `articles` ( `FTS_DOC_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL, `description` text, PRIMARY KEY (`FTS_DOC_ID`), FULLTEXT KEY `mecab_idx` (`description`) /*!50100 WITH PARSER `mecab` */ ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

サンプルテーブルに格納した文章

24

※格納した文章の一覧を、資料後半のAppendix部分に掲載しています

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワード設定前

•転置インデックスは583件作成されている

25

mysql> SET GLOBAL innodb_ft_aux_table="mecab/articles";

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT count(*) FROM

INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;

+----------+

| count(*) |

+----------+

| 583 |

+----------+

1 row in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワード設定前

• 「ます」、「でき」、「する」など、検索で指定しないトークンや、ほとんどの 文章に含まれている単語(「mysql」)にも転置インデックスが作成されている

26

mysql> SELECT word,count(*) AS c FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE GROUP BY word ORDER BY c DESC LIMIT 10; +-----------------------+----+ | word | c | +-----------------------+----+ | ます | 33 | | mysql | 21 | | パフォーマンス | 13 | | でき | 12 | | 使用 | 11 | | する | 11 | | 監視 | 9 | | サーバー | 9 | | enterprise | 8 | | セキュリティ | 7 | +-----------------------+----+ 10 rows in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワードの設定

• ストップワードを設定するためのテーブルを作成し、 ストップワードを格納する

27

mysql> CREATE TABLE mecab.stopwords(value varchar(255) PRIMARY KEY); Query OK, 0 rows affected (0.03 sec) mysql> INSERT INTO mecab.stopwords VALUES('ます'),('でき'),('する'),('mysql'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM mecab.stopwords; +--------+ | value | +--------+ | mysql | | する | | でき | | ます | +--------+ 4 rows in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワードの設定

• my.cnfに以下を設定して再起動 – innodb_ft_enable_stopword=ON

– innodb_ft_server_stopword_table=mecab/stopwords

28

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワードの設定

•全文検索インデックスの再作成

29

mysql> ALTER TABLE mecab.articles DROP KEY mecab_idx; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE mecab.articles ADD FULLTEXT KEY mecab_idx(description) WITH PARSER mecab; Query OK, 0 rows affected (0.22 sec) Records: 0 Duplicates: 0 Warnings: 0

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワード設定後

•転置インデックスが減っている(583件⇒506件)

30

mysql> SET GLOBAL innodb_ft_aux_table="mecab/articles"; Query OK, 0 rows affected (0.00 sec) mysql> SELECT count(*) FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; +----------+ | count(*) | +----------+ | 506 | +----------+ 1 row in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

ストップワード設定後

• ストップワードで指定した「ます」、「でき」、「する」、「mysql」には 転置インデックスが作成されていない

31

mysql> SELECT word,count(*) AS c FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE GROUP BY word ORDER BY c DESC LIMIT 10;

+-----------------------+----+ | word | c | +-----------------------+----+ | パフォーマンス | 13 | | 使用 | 11 | | サーバー | 9 | | 監視 | 9 | | enterprise | 8 | | セキュリティ | 7 | | など | 6 | | 構成 | 6 | | 状況 | 6 | | および | 5 | +-----------------------+----+ 10 rows in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

Appendix

32

Copyright © 2016, Oracle and/or its affiliates. All rights reserved. 33

サンプルテーブルに格納した文章 mysql> SELECT * FROM mecab.articles¥G

*************************** 1. row ***************************

FTS_DOC_ID: 1

title: レプリケーション・ダッシュボード description: MySQL Enterprise Monitorは、自動的にレプリケーション・トポロジを検出し、パフォーマンス、可用性、マスター/スレーブの状態を表示します。MySQL 5.7にも対応済みで、レプリケーション・ダッシュボードからレプリケーションの各種指標を確認できます。また、トポロジ・ビューにより、レプリケーション・グループやレプリケーション構成、それぞれのノードの状態などを素早く確認できます。単純なレプリケーション構成だけでなく、マルチソース・レプリケーションや、循環型、階層型といった複雑な構成にも対応しています。 *************************** 2. row ***************************

FTS_DOC_ID: 2

title: アクセス制御リスト (ACLs) description: ロールとグループベースのアクセスコントロールにより、MySQL DBA にきめ細かなセキュリティポリシーを定義するための簡単な方法を提供します。アクセス制御リストは、MySQL Enterprise Monitor をマルチテナント環境やクラウド環境で使用している場合のアカウント管理を簡素化します。 *************************** 3. row ***************************

FTS_DOC_ID: 3

title: MySQL Enterprise Firewall 監視

description: グラフとレポートから MySQL Enterprise Firewall のアクティビティを容易に監視でき、MySQL Server を特定のデータベース攻撃から守ることに役立ちます。ベスト・プラクティス・アドバイザーは、潜在的なセキュリティの脅威を検知した時に警告を通知し、MySQL Enterprise Firewall や関連するセキュリティ設定の変更を推奨します。

Copyright © 2016, Oracle and/or its affiliates. All rights reserved. 34

サンプルテーブルに格納した文章 *************************** 4. row ***************************

FTS_DOC_ID: 4

title: MySQL Enterprise Audit 監視

description: 全てのMySQLサーバーにわたって、MySQL Enterprise Audit の状況を監視します。ベスト・プラクティス・アドバイザーは、HIPAA、SOX 法、および PCI データセキュリティ基準などの一般的なセキュリティポリシーにおいて、企業の法令遵守を支援します。 *************************** 5. row ***************************

FTS_DOC_ID: 5

title: MySQL パフォーマンスのリアルタイム監視およびアラート生成

description: MySQL Enterprise Monitor は MySQL クエリーとパフォーマンス関連のサーバー指標を継続的に監視します。基準となるパフォーマンスのトレンドから大きな逸脱があった場合にアラートを受信します。また、ベストプラクティス・アドバイザは、パフォーマンスを向上させるための構成やパラメータ設定の変更を提案します。 *************************** 6. row ***************************

FTS_DOC_ID: 6

title: MySQL の可用性に関するリアルタイム監視

description: 開発者および DBA は、データベース可用性の監視と測定によって、品質保証契約 (SLA) のコミットメントを満たしているかを把握できます。 *************************** 7. row ***************************

FTS_DOC_ID: 7

title: クラウドにおける MySQL のリモート監視

description: クラウドおよび VM に対応した設計になっており、リモート・エージェントを必要とせずに、MySQL サーバーをリモートで監視できます。

Copyright © 2016, Oracle and/or its affiliates. All rights reserved. 35

サンプルテーブルに格納した文章 *************************** 8. row ***************************

FTS_DOC_ID: 8

title: すべての MySQL サーバーを視覚的に管理

description: Visual Dashboard は Web ベースのインタフェースで、データベースのパフォーマンス、可用性、重大イベントなどを全体的に詳しく確認できます。1台のサーバー、カスタム・グループ、またはすべてのサーバーを視覚的に調べます。リアルタイム情報や履歴情報の豊富なグラフを使用して、サーバー統計の詳細情報にまでドリルダウンできます。 *************************** 9. row ***************************

FTS_DOC_ID: 9

title: 視覚的にクエリーを解析

description: クエリー・パフォーマンスのリアルタイム監視、実行時統計の確認、遅延の原因になっている SQL コードのフィルタリングと特定が可能です。 MySQL Server 5.6 のパフォーマンス・スキーマを使用すれば、ソフトウェアや構成を追加することなく、データが MySQL サーバーから直接収集されます。 *************************** 10. row ***************************

FTS_DOC_ID: 10

title: 負荷の大きいクエリーの発見と修正

description: 開発者および DBA は、相関グラフを使用して実行時パラメータ(サーバー負荷、スレッド統計、RAM 使用状況など)を、その時点で実行中であったクエリーと比較できます。グラフ上のタイムスライスを強調表示するだけで、もっとも負荷のかかるクエリーを発見し、より大きなパフォーマンス問題の潜在的な原因を特定します。

Copyright © 2016, Oracle and/or its affiliates. All rights reserved. 36

サンプルテーブルに格納した文章 *************************** 11. row ***************************

FTS_DOC_ID: 11

title: InnoDB の監視

description: MySQL のパフォーマンスに影響を及ぼす重要な InnoDB 指標を監視します。非効率な索引の使用、ロックの問題、InnoDB バッファ・プール の使用に関するアラートを受信して、現在のパフォーマンスや解析されたトレンドに基づいた InnoDB 構成を改善する方法についてのヒントを得ることができます。 *************************** 12. row ***************************

FTS_DOC_ID: 12

title: MySQL Cluster の監視

description: パフォーマンスと可用性に影響を及ぼす重要な MySQL Cluster 指標を監視します。グラフを通じて履歴情報を確認し、データ・ノードのキャッシュ・ヒット率が低い、データ・メモリが枯渇しそうである、ノード障害が発生しそうであるといった潜在的な問題に関するアラートを受信できます。 *************************** 13. row ***************************

FTS_DOC_ID: 13

title: バックアップの監視

description: MySQL ベストプラクティス・アドバイザは、オンライン・ホット・バックアップが想定どおり実行することを支援し、"前回の全体バックアップは古すぎるか?"、"増分バックアップは実行中か?"、"前回のバックアップ・ジョブは成功したか?"、"バックアップのロックの時間が長すぎるか?"などの疑問に回答します。

Copyright © 2016, Oracle and/or its affiliates. All rights reserved. 37

サンプルテーブルに格納した文章 *************************** 14. row ***************************

FTS_DOC_ID: 14

title: ディスクの監視

description: トレンドの解析と計画によって、今後必要になる容量を管理者が予測できるようにします。MySQL Enterprise Monitor は、"ディスク領域が12か月後に一杯になる場合に通知する"といったユーザーが定義したしきい値に基づいて、運用スタッフに予防的なアラートを送信します。 *************************** 15. row ***************************

FTS_DOC_ID: 15

title: オペレーティング・システムの監視

description: ロードアベレージ、CPU 使用状況、RAM 使用状況、スワップ使用状況、ファイルシステム使用状況、ディスク I/O など、オペレーティング・システムレベルのパフォーマンス指標を視覚的にリアルタイムで監視します。 *************************** 16. row ***************************

FTS_DOC_ID: 16

title: セキュリティ上のぜい弱性の特定

description: MySQL Enterprise Monitor は MySQL サーバーを保護し、開発者と DBA がセキュリティ・ホールを発見し、それに対応するための支援をします。アドバイザによって、 MySQL のセキュリティに関するベストプラクティスを実施するために設計された一連のルールが提供され、潜在的なぜい弱性がシステムに影響を及ぼす前にアラートを送信します。 *************************** 17. row ***************************

FTS_DOC_ID: 17

title: 開発中およびテスト中のチューニングを迅速化

description: 開発中およびテスト中のパフォーマンスに関する問題を発見するまでにかかる時間を大幅に短縮することで、アプリケーションをより迅速に本番運用できます。ユーザーよりも先にパフォーマンスの問題を特定して修正できます。 17 rows in set (0.00 sec)

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

イベント告知

38

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

今後のセミナー予定

• MySQL 最前線 ~ 2016年秋 最新アップデート –Oracle Open World 2016で発表された最新情報をフィードバックする セミナーです

•主なトピック –Oracle MySQL Cloud Service

–MySQL8.0 DMR(開発途上版)

–MySQL Cluster7.5 RC(リリース候補版)

–MySQL InnoDB Cluster(MySQL Group Replication + MySQL Router + MySQL Shell)

39

Copyright © 2016, Oracle and/or its affiliates. All rights reserved.

今後のセミナー予定

•日時 –東京:2016年10月3日(月) 14:00~17:30

–大阪:2016年10月11日(火) 14:00~17:30

–名古屋:2016年10月12日(水) 14:00~17:30

–福岡:2016年10月13日(木) 14:00~17:30

•申込ページ – 「mysql イベント」で検索

40

Copyright © 2016, Oracle and/or its affiliates. All rights reserved. 41