mariadbとmroongaで作る 全言語対応 超高速全文検索システム ·...
TRANSCRIPT
![Page 1: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/1.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
MariaDBとMroongaで作る全言語対応
超高速全文検索システム
須藤功平 クリアコード
第一回 JPMUG DB勉強会2018-01-30
![Page 2: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/2.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索システム対象
大量のテキスト
例:Wikiのデータ
例:オフィス文書のテキスト
例:商品説明・口コミ
![Page 3: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/3.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索システム目的
必要な情報を
必要なときに
活用
![Page 4: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/4.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
必要な情報を活用
×探している情報が見つからない
○探している情報が見つかる
◎意識していなかったけど実は欲しかった情報も見つかる!
![Page 5: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/5.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
必要なときに活用
×なかなか見つからない
○すぐに見つかる
◎すでに見つかっていた
例:レコメンデーション
![Page 6: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/6.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
実装方法選択肢
全文検索サーバーを使う
MariaDBでLIKEを使う
![Page 7: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/7.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索サーバー案メリット
必要な機能が揃っている
+αの機能もある
速い
![Page 8: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/8.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索サーバー案デメリット
実装コスト大それぞれ独自の使い方だから
マスターデータの同期はどうする?
メンテナンスコスト大それぞれ独自の仕組みだから
![Page 9: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/9.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
MariaDBでLIKE案メリット
実装コスト小新しく覚えることが少ない
データの一元管理
メンテナンスコスト小既存の運用ノウハウを使える
データ少なら実用的な速度
![Page 10: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/10.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
MariaDBでLIKE案デメリット
機能不足それっぽい順のソート不可
全文検索ではソート順が重要
ユーザーは先頭n件しか見ない
SQLの表現力不足nクエリーで実現すると性能に影響
![Page 11: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/11.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
実現方法第3の選択肢
MariaDB経由(SQL)で全文検索エンジンを使う
![Page 12: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/12.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
メリット
高速で豊富な機能それっぽい順のソート可
実装コスト小
メンテナンスコスト小
![Page 13: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/13.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
デメリット
MariaDBに拡張機能が必要RDS・Azure databaseで使えない(Azure database for MariaDBはまだリリース前)
![Page 14: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/14.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オススメの選択肢全文検索の知識ナシ
まだ単純な機能で十分データ少:MariaDB単独でLIKE(数十万件とか)
データ中以上:MariaDB経由で全文検索エンジン
いまどきの全文検索機能が必要MariaDB経由で全文検索エンジン
![Page 15: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/15.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オススメの選択肢全文検索の知識アリ
カリカリにチューニングしたいMariaDBと全文検索サーバーを併用
それ以外MariaDB経由で全文検索エンジン
![Page 16: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/16.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
説明する選択肢
MariaDB経由で全文検索エンジン
![Page 17: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/17.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索エンジンGroonga(ぐるんが)
組込可能な全文検索エンジンMariaDB・MySQLに組込→Mroonga
PostgreSQLに組込→PGroonga
全文検索サーバーとして単独でも使用可能MariaDBと全文検索サーバーを併用もできる
![Page 18: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/18.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
Groongaの得意なこと
データの追加・更新新鮮な情報をすぐに検索可能に!
更新中も検索性能を落とさない!
日本語開発者が日本人
便利機能が組み込み
![Page 19: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/19.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
GroongaとUnicode
NFKCベースの正規化機能を組込
Unicode 5.1ベースで古い2008年の仕様
Unicode 10.0(最新)対応中正規化方式を変えるとインデックスの互換性がなくなる(=要インデックス再構築)のでデフォルトは変えない
![Page 20: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/20.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
Mroonga(むるんが)
MariaDBのストレージエンジンInnoDB・MyISAMなどと同じレイヤー
MariaDB 10.0.15から標準バンドル
使用方法
CREATE TABLE (...) ENGINE=Mroonga
![Page 21: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/21.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
照合順序:COLLATION
文字の並び順の規則文字が同一かどうかの判定にも利用
適切な日本語規則なしいわゆる = 問題
MySQL 8では適切な日本語規則が追加されるutf8mb4_ja_0900_as_csなど
![Page 22: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/22.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
Mroongaの照合順序
MariaDB互換のもの
utf8mb4_ja_0900_*互換は対応予定
MariaDB互換を微調整したもの日本語でもいい感じ
Groonga提供のものNFKCベースのもの
日本語でもいい感じ
![Page 23: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/23.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
Mroongaで照合順序
MariaDB互換がよい!互換正規化処理を使用:デフォルト
MariaDB互換は気にしないからいい感じに!Groonga提供のものを使用
![Page 24: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/24.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索性能計測データ
対象:Wikipedia日本語版
レコード数:約185万件
データサイズ:約7GB
メモリー4GB・SSD250GB(ConoHa)
![Page 25: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/25.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
検索性能1
キーワード:テレビアニメ(ヒット数:約2万3千件)
InnoDB ngram 3m2sInnoDB MeCab 6m20sMroonga:1 0.11s
![Page 26: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/26.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
検索性能2
キーワード:データベース(ヒット数:約1万7千件)
InnoDB ngram 36sInnoDB MeCab:1 0.03sMroonga:2 0.09s
![Page 27: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/27.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
検索性能3
キーワード:PostgreSQL OR MySQL(ヒット数:約400件)
InnoDB ngram N/A(Error)InnoDB MeCab:1 0.005sMroonga:2 0.028s
![Page 28: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/28.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
検索性能4
キーワード:日本(ヒット数:約63万件)
InnoDB ngram 1.3sInnoDB MeCab 1.3sMroonga:1 0.21s
![Page 29: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/29.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索性能まとめ
Mroonga:安定して速いSQLで使えて機能豊富で速い!
InnoDB FTS MeCabハマれば速い
InnoDB FTS ngram安定して遅い
![Page 30: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/30.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
普通の検索も速い
カラムストアを活かした最適化ポイント1:余計なI/Oを減らす
ポイント2:I/Oを局所化
![Page 31: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/31.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
カラムストア
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Mroonga
カラムごと
InnoDB他
カラム 行
値の管理単位 行ごと
高速なアクセス単位
![Page 32: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/32.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
必要なカラムのみアクセス
-- aのみにアクセスSELECT a FROM table-- cのみにアクセス WHERE c = XXX;-- bにはアクセスしない
![Page 33: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/33.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
減ったI/O
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Mroonga
カラムごと
InnoDB他
カラム 行
値の管理単位 行ごと
高速なアクセス単位
アクセスしない
![Page 34: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/34.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
行カウント
-- カラムの値は必要ないSELECT COUNT(*) FROM table-- cの全文検索インデックスにだけアクセス WHERE MATCH(c) AGAINST('+keyword' IN BOOLEAN MODE);-- a, b, cはアクセスしない
![Page 35: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/35.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
減ったI/O
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Mroonga
カラムごと
InnoDB他
カラム 行
値の管理単位 行ごと
高速なアクセス単位
アクセスしない
![Page 36: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/36.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ORDER BY LIMIT
SELECT a FROM table WHERE MATCH(c) AGAINST('+keyword' IN BOOLEAN MODE)-- MariaDBではなくMroongaがORDER BY LIMITを処理-- →Mroongaは10レコードだけMariaDBに返す-- マッチしたレコードすべては返さない ORDER BY a LIMIT 10;
![Page 37: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/37.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ORDER BY LIMITの最適化
Mroongaが検索カラム毎の処理でI/Oを局所化(索引非使用時)
Mroongaがソートカラム毎の処理でI/Oを局所化
MroongaがOFFSET/LIMITを処理
![Page 38: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/38.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
カラム毎の処理は速い
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
カラム
行
a b c
1
2
3
値 値 値
値 値 値
値 値 値
Mroonga
カラムごと
InnoDB他
カラム 行
値の管理単位 行ごと
高速なアクセス単位
![Page 39: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/39.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
condition push downの最適化
従来はMariaDBが処理していた検索条件をストレージエンジンが処理する仕組みストレージエンジンでの処理の方が高速なら全体として高速になる
Mroonga 7.10から実験的に対応デフォルトオフ
![Page 40: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/40.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
condition push downの効果
全文検索インデックスのみ等価条件:シーケンシャルスキャン
全文検索:インデックススキャン
データシカゴの犯罪データ(651万レコード)
詳細:https://github.com/kou/rabbit-slide-kou-jpmug-db-study-1/blob/master/memo.md
![Page 41: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/41.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
等価条件:数値1つ
26万件ヒットするケース
InnoDB 1.3sMroonga(デフォルト)
1.3s
Mroonga(最適化ON)
0.4s
![Page 42: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/42.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
等価条件:数値1つ+真偽値2つ
7000件ヒットするケース
InnoDB 1.6sMroonga(デフォルト)
2.3s
Mroonga(最適化ON)
0.4s
![Page 43: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/43.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索+等価条件
4000件ヒットするケース
InnoDB 18sMroonga(デフォルト)
0.4s
Mroonga(最適化ON)
0.4s
このパターンはデフォルトで最適化が効く
![Page 44: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/44.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
Mroongaの検索性能まとめ
最適化が効くと桁違いに速い全文検索のときはデフォルトで効く
7.10からさらなる最適化が!まだ実験的扱いなのでデフォルトオフ
OLAP用途にも使えるMariaDB ColumnStoreを補完する立ち位置も可
参考:http://mroonga.org/ja/docs/reference/server_variables.html#mroonga-condition-push-down-type
![Page 45: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/45.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索システムの実装
全文検索
キーワードハイライト
周辺テキスト表示
オートコンプリート
同義語展開
関連文書の表示
![Page 46: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/46.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索
![Page 47: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/47.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
テーブル定義
CREATE TABLE entries ( title text, content text, -- 全文検索用インデックス -- よくわからないならデフォルトのまま使うこと! FULLTEXT INDEX (title, content)) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
![Page 48: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/48.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
データ挿入
-- 普通に挿入するだけでよいINSERT INTO entries VALUES ('タイトル', '高速に全文検索したいですね!');
![Page 49: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/49.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索
SELECT title FROM entries WHERE -- MATCH AGAINSTで全文検索 MATCH (title, content) -- デフォルトORがMariaDBの仕様 -- 「検索」または「高速」を含むとマッチ AGAINST ('検索 高速' IN BOOLEAN MODE);
![Page 50: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/50.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
AND全文検索
MATCH (title, content)-- 各キーワードの前に「+」をつけるとAND-- 「検索」かつ「高速」を含むとマッチAGAINST ('+検索 +高速' IN BOOLEAN MODE);
![Page 51: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/51.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
使いやすいAND全文検索
MATCH (title, content)-- 最初に「*D+」をつけるとデフォルトAND-- Mroonga独自機能-- 「検索」かつ「高速」を含むとマッチAGAINST ('*D+ 検索 高速' IN BOOLEAN MODE);
![Page 52: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/52.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
それっぽい順のソート
SELECT title, -- ここのMATCH AGAINSTはスコアーを返す MATCH (title, content) AGAINST ('*D+ 検索 高速' IN BOOLEAN MODE) AS score FROM entries WHERE -- ... -- それっぽさでソート ORDER BY score DESC LIMIT 10;
![Page 53: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/53.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ハイライト
![Page 54: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/54.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ハイライト
SELECT mroonga_highlight_html( title, '*D+ 検索 高速' AS query) -- クエリーからハイライト対象のキーワードを抽出 FROM entries WHERE MATCH (title, content) AGAINST ('*D+ 検索 高速' IN BOOLEAN MODE);
![Page 55: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/55.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ハイライト結果例
<Groonga>で高速全文検索!↓<Groonga>で ← タグをエスケープ<span class="keyword">高速</span>全文 ↑↓キーワードはclass付け<span class="keyword">検索</span>!
![Page 56: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/56.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
周辺テキスト
![Page 57: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/57.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
周辺テキスト
SELECT mroonga_snippet_html( content, '*D+ 検索 高速' AS query) -- クエリーから対象のキーワードを抽出 FROM entries WHERE MATCH (title, content) AGAINST ('*D+ 検索 高速' IN BOOLEAN MODE);
![Page 58: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/58.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
周辺テキスト結果例
...<Groonga>で高速全文検索!...↓<div class="snippet"> ←1つ目ga>で ←タグをエスケープ<span class="keyword">高速</span>全文 ↑↓キーワードはclass付け<span class="keyword">検索/span>!</div><div class="snippet">...</div> ←2つ目
![Page 59: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/59.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート
![Page 60: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/60.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート:必要なもの
マスターテーブル候補(例:牛乳)
候補のヨミ(カタカナ・複数可)例1:ギュウニュウ
例2:ミルク
![Page 61: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/61.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート:実装方法
以下の検索のORヨミでの前方一致検索
候補を緩い全文検索
候補でソートして提示
![Page 62: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/62.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート:テーブル定義
CREATE TABLE terms ( term varchar(256), -- 補完候補 reading varchar(256), -- ヨミガナ PRIMARY KEY (term, reading), FULLTEXT INDEX (term) -- 候補全文検索用 -- 緩い全文検索用トークナイザー COMMENT 'tokenizer "TokenBigramSplitSymbolAlpha"', FULLTEXT INDEX (reading) -- ヨミガナ前方一致用 COMMENT 'normalizer "NormalizerAuto", tokenizer "off"' -- トークナイザー不要) ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
![Page 63: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/63.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート:データ例
INSERT INTO terms VALUES ( '牛乳', -- 補完候補 'ギュウニュウ' --ヨミガナはカタカナで指定);INSERT INTO terms VALUES ( '牛乳', 'ミルク' -- 「ミルク」でも補完できるように);
![Page 64: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/64.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリートデータ管理のポイント
普通のテーブルなので管理が楽追加・削除・更新が楽
ダンプ・リストアもいつも通り
レプリケーションもいつも通り
![Page 65: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/65.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート検索方法
SELECT DISTINCT(term) FROM terms WHERE MATCH (reading) -- ヨミガナ前方一致検索 AGAINST (CONCAT('*SS prefix_rk_search(reading, ', mroonga_escape(${入力} AS script), ')') IN BOOLEAN MODE) OR MATCH (term) -- 候補を緩く全文検索 AGAINST (CONCAT('*D+ ', mroonga_escape(${入力})) IN BOOLEAN MODE) ORDER BY term LIMIT 10; -- ソート
![Page 66: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/66.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート検索例:漢字1
-- ユーザーが「牛」を入力した場合SELECT DISTINCT(term) FROM terms WHERE MATCH (reading) -- ヨミガナ前方一致検索 AGAINST (CONCAT('*SS prefix_rk_search(reading, ', mroonga_escape('牛' AS script), ')') IN BOOLEAN MODE) OR MATCH (term) -- 候補を緩く全文検索(ヒット) AGAINST (CONCAT('*D+ ', mroonga_escape('牛')) IN BOOLEAN MODE) ORDER BY term LIMIT 10; -- ソート
![Page 67: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/67.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート検索例:漢字2
-- ユーザーが「乳」を入力した場合SELECT DISTINCT(term) FROM terms WHERE MATCH (reading) -- ヨミガナ前方一致検索 AGAINST (CONCAT('*SS prefix_rk_search(reading, ', mroonga_escape('乳' AS script), ')') IN BOOLEAN MODE) OR MATCH (term) -- 候補を緩く全文検索(ヒット) AGAINST (CONCAT('*D+ ', mroonga_escape('乳')) IN BOOLEAN MODE) ORDER BY term LIMIT 10; -- ソート
![Page 68: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/68.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート検索例:カタカナ
-- ユーザーが「ギュウ」を入力した場合SELECT DISTINCT(term) FROM terms WHERE MATCH (reading) -- ヨミガナ前方一致検索(ヒット) AGAINST (CONCAT('*SS prefix_rk_search(reading, ', mroonga_escape('ギュウ' AS script), ')') IN BOOLEAN MODE) OR MATCH (term) -- 候補を緩く全文検索 AGAINST (CONCAT('*D+ ', mroonga_escape('ギュウ')) IN BOOLEAN MODE) ORDER BY term LIMIT 10; -- ソート
![Page 69: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/69.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート検索例:ひらがな
-- ユーザーが「ぎゅう」を入力した場合SELECT DISTINCT(term) FROM terms WHERE MATCH (reading) -- ヨミガナ前方一致検索(ヒット) AGAINST (CONCAT('*SS prefix_rk_search(reading, ', mroonga_escape('ぎゅう' AS script), ')') IN BOOLEAN MODE) OR MATCH (term) -- 候補を緩く全文検索 AGAINST (CONCAT('*D+ ', mroonga_escape('ぎゅう')) IN BOOLEAN MODE) ORDER BY term LIMIT 10; -- ソート
![Page 70: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/70.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
オートコンプリート検索例:ローマ字
-- ユーザーが「gyu」を入力した場合SELECT DISTINCT(term) FROM terms WHERE MATCH (reading) -- ヨミガナ前方一致検索(ヒット) AGAINST (CONCAT('*SS prefix_rk_search(reading, ', mroonga_escape('gyu' AS script), ')') IN BOOLEAN MODE) OR MATCH (term) -- 候補を緩く全文検索 AGAINST (CONCAT('*D+ ', mroonga_escape('gyu')) IN BOOLEAN MODE) ORDER BY term LIMIT 10; -- ソート
![Page 71: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/71.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
同義語展開
同義語同じ意味だが表記が異なる語
例:「刺身」と「お造り」
どの表記でもヒットして欲しい同義語展開→同義語すべてでOR検索
![Page 72: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/72.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
同義語展開実装方法
同義語管理テーブルを作成
クエリー内の同義語を展開
展開後のクエリーで検索
![Page 73: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/73.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
同義語展開:Mroongaテーブル定義
CREATE TABLE synonyms ( term varchar(255), -- 展開対象の語 synonym varchar(255), -- 同義語 INDEX (term) -- 高速化と精度向上 COMMENT 'normalizer "NormalizerAuto"') ENGINE=Mroonga DEFAULT CHARSET=utf8mb4;
![Page 74: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/74.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
同義語展開データ例
INSERT INTO synonyms-- 「刺身」を「刺身 OR お造り」に展開 VALUES ('刺身', '刺身'), ('刺身', 'お造り'),-- 「お造り」を「お造り OR 刺身」に展開 ('お造り', 'お造り'), ('お造り', '刺身');
![Page 75: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/75.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
同義語展開データ管理のポイント
普通のテーブルなので管理が楽追加・削除・更新が楽
ダンプ・リストアもいつも通り
レプリケーションもいつも通り
![Page 76: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/76.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
同義語展開:Mroonga確認方法
SELECT mroonga_query_expand( 'synonyms', -- テーブル名 'term', -- 展開対象のカラム名 'synonym', -- 対応する同義語のカラム名 '居酒屋 刺身' -- クエリー);-- '居酒屋 ((刺身) OR (お造り))'
![Page 77: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/77.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
同義語展開:Mroonga検索方法
SELECT title FROM entries WHERE MATCH (title) -- '*D+ 居酒屋 OR ((刺身) OR (お造り))'になる AGAINST (mroonga_query_expand('synonyms', 'term', 'synonym', '*D+ 居酒屋 刺身') IN BOOLEAN MODE);
![Page 78: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/78.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
類似文書検索
検索クエリーは文書そのものキーワードではない
関連エントリーの提示に使えるメタデータがあるなら組み合わせる→精度向上
メタデータ:タグ・行動履歴など
![Page 79: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/79.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
類似文書検索:Mroongaインデックス定義
CREATE TABLE entries ( -- ... FULLTEXT INDEX (content) -- TokenMecabを使わないと精度がでない -- 必要なときだけカスタマイズ! COMMENT 'tokenizer "TokenMecab"') -- ...
![Page 80: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/80.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
類似文書検索:Mroonga検索方法
SELECT title FROM entries WHERE MATCH (content) -- ↓ 既存文書の内容をそのまま指定 AGAINST ('...Groongaで高速全文検索!...' IN NATURAL LANGUAGE MODE);
![Page 81: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/81.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
類似文書検索:Mroonga結果例
クエリー: ...Groongaで高速全文検索!...
ヒット例: ...Mroongaで高速全文検索!...
![Page 82: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/82.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索システムの実装まとめ
全文検索
キーワードハイライト
周辺テキスト表示
オートコンプリート
同義語展開
関連文書の表示
![Page 83: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/83.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
全文検索システムの実装次の一歩
構造化データ対応オフィス文書・HTMLなど
対応に必要な処理テキスト抽出
メタデータ抽出(例:タイトル・更新日時)
スクリーンショット作成(なおよい)
![Page 84: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/84.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
抽出ツール
Apache TikaApache Luceneのサブプロジェクト
対応フォーマット数が多い
ChupaTextGroongaのサブプロジェクト
スクリーンショット作成対応
![Page 85: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/85.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText
対応フォーマットWord/Excel/PowerPoint
ODT/ODS/ODP(OpenDocument)
PDF/HTML/XML/CSV/...
インターフェイスHTTPとコマンドライン
![Page 86: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/86.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:インストール
DockerかVagrantを使うのが楽https://github.com/ranguba/chupa-text-docker
https://github.com/ranguba/chupa-text-vagrant
![Page 87: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/87.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:Docker
% GITHUB=https://github.com% git clone \ ${GITHUB}/ranguba/chupa-text-docker.git% cd chupa-text-docker% docker-compose up --build
![Page 88: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/88.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:使い方
% curl \ --form [email protected] \ http://localhost:20080/extraction.json
![Page 89: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/89.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:結果例
{ "mime-type": "application/pdf", # 元データのMIMEタイプ "size": 147159, # メタデータ ..., "texts": [ # 抽出されたテキスト(N個) { "mime-type": "text/plain", # 抽出後のMIMEタイプ ..., "creator": "Adobe Illustrator CS3", # メタデータ "body": "This is sample PDF. ...", # 抽出したテキスト "screenshot": { "mime-type": "image/png", # スクリーンショットのMIMEタイプ "data": "iVBORw...", # Base64にした画像データ "encoding": "base64" # Base64であることを明記 } } ]}
![Page 90: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/90.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:Web UI
![Page 91: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/91.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:Web UI抽出例
![Page 92: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/92.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:Web UI抽出例
![Page 93: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/93.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:Vagrant
% GITHUB=https://github.com% git clone \ ${GITHUB}/ranguba/chupa-text-vagrant.git% cd chupa-text-vagrant% vagrant up
使い方はDocker版と同じ
![Page 94: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/94.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
ChupaText:活用例
抽出したテキストMroongaへ挿入
抽出したメタデータMroongaへ挿入
絞り込みに活用
作成したスクリーンショット検索結果表示時に掲載
![Page 95: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/95.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
まとめ
MariaDBの全文検索まわり
全文検索システム実装例を紹介
構造化データの対応方法を紹介ChupaText
![Page 96: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/96.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
扱わなかった話題
運用について障害対策・レプリケーション
チューニング
Groongaの機能を直接使う方法
![Page 97: MariaDBとMroongaで作る 全言語対応 超高速全文検索システム · MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2](https://reader030.vdocuments.net/reader030/viewer/2022040809/5e4f2d3205aad52abb2262c5/html5/thumbnails/97.jpg)
MariaDBとMroongaで作る 全言語対応 超高速全文検索システム Powered by Rabbit 2.2.2
サポートサービス紹介
導入支援(設計支援・性能検証・移行支援・…)
開発支援(サンプルコード提供・問い合わせ対応・…)
運用支援(障害対応・チューニング支援・…)
問い合わせ先:https://www.clear-code.com/contact/?type=groonga