SlideShare a Scribd company logo
Copyright © 2016 NTT DATA Corporation
2016年2月9日
株式会社NTTデータ 澤田雅彦
PostgreSQLでpg_bigmを使って日本語全文検索
~pg_bigmで全文検索するときに知っておくべき8のこと~
@MySQLとPostgreSQLの日本語全文検索勉強会
2Copyright © 2016 NTT DATA Corporation
PostgreSQL 9.5 リリース!
1/7にリリース
されました!
3Copyright © 2016 NTT DATA Corporation
PostgreSQL 開発者@ NTT データ
社内 PostgreSQL 営業・技術支援
PostgreSQL のコア機能を開発
レプリケーション運用性向上
REINDEX SCHEMA / VERBOSE
pg_bigm(全文検索モジュール)
コア機能へのパッチレビューア
澤田 雅彦 @sawada_masahiko
4Copyright © 2016 NTT DATA Corporation
「PostgreSQL 全文検索 日本語」で検索
pg_bigm
textsearch_ja
pg_trgm
pgroonga
5Copyright © 2016 NTT DATA Corporation
PostgreSQLで使える日本語全文検索モジュールはいろいろ
• pgroonga
• pg_bigm
• pg_trgm
• unigram
• textsearch_ja
• textsearch_groonga
• textsearch_senna
など
6Copyright © 2016 NTT DATA Corporation
形態素解析 N-gram
分類すると
• textsearch_ja
• pgroonga
• textsearch_
groonga
• pg_bigm
• pg_trgm
• unigram
• textsearch_senna
Copyright © 2016 NTT DATA Corporation 7
pg_bigmで全文検索するときに知っておくべき8のこと
8Copyright © 2016 NTT DATA Corporation
1.
全文検索インデックスが
必要ない検索と
必要ある検索
9Copyright © 2016 NTT DATA Corporation
全文検索インデックスが必要ない/ある検索
全文検索インデックスが必要ない検索
• テーブル件数が少ない → シーケンシャルスキャンでOK
• 前方一致検索だけ (‘東京%’) → BtreeインデックスでOK
• 後方一致検索だけ (‘%東京’) → Btree(式)インデックスでOK
全文検索インデックスが必要ある検索
• 大きいテーブルで中間一致検索を使う (‘%東京%’)
• 前方、後方、中間一致検索をする可能性がある
10Copyright © 2016 NTT DATA Corporation
2.
なぜpg_bigmを開発したか
11Copyright © 2016 NTT DATA Corporation
昔、PostgreSQLで全文検索したい時
○ PostgreSQL 8系で日本語全文検索が可能
× 全文検索インデックスは、リカバリ未対応
× クラッシュ後、REINDEXが必要
× 8.3以降のVACUUMに未対応
× PostgreSQL9系には未対応
12Copyright © 2016 NTT DATA Corporation
PostgreSQL本体でもN-gram全文検索の利用が可能に
○ PostgreSQL付属モジュール
○ インデックスはPostgreSQLが管理
× 日本語(マルチバイト文字)に未対応
× 1,2文字検索が低速
13Copyright © 2016 NTT DATA Corporation
N-gramで日本語対応
pg_bigmはpg_trgmを日本語検索に強化・最適化したモジュール
pg_bigm
(バイグラム)
pg_trgm
(トライグラム)
インデックスの
作成方法
2-gram 3-gram
日本語対応 ○ ×
1,2文字検索 高速 低速
14Copyright © 2016 NTT DATA Corporation
3.
1,2文字検索に対応
15Copyright © 2016 NTT DATA Corporation
1,2文字の検索に対応
• pg_trgmでは検索キーワードが3文字以上でないと、インデックスを使った高速な検索ができない。
• pg_bigmでは1,2文字(本、学校など)の検索でもインデックスを使用した高速な検索が可能。
検索例 pg_bigm pg_trgm
col LIKE ‘%駅%’ 高速 低速
col LIKE ‘%東京%’ 高速 低速
col LIKE ‘%東京駅%’ 高速 高速
16Copyright © 2016 NTT DATA Corporation
4.
性能情報
17Copyright © 2016 NTT DATA Corporation
検索キーワード 取得件数 pg_bigm pg_trgm SeqScan
町 17万件 0.4 秒 504 秒
15 秒
東京 16万件 0.3 秒 407 秒
東京都 4万件 0.2 秒 0.2 秒
東京と京都 150件 0.004 秒 0.001 秒
昭和四十四年度以降 150件 0.08 秒 0.02 秒
性能情報
日本語データを全文検索(サイズ:6GB、データ件数:1300万件)
18Copyright © 2016 NTT DATA Corporation
5.
pg_bigmを使うために
必要な4ステップ
19Copyright © 2016 NTT DATA Corporation
pg_bigmを使うために必要な4ステップ
1. RPMインストール
• PostgreSQLのバージョンに合ったRPMをダウンロードし、インストール
• https://osdn.jp/projects/pgbigm/releases/p13634
2. 設定ファイルに追記
• postgresql.confに「shared_preload_libraries = ‘pg_bigm’」を追記
3. pg_bigmをPostgreSQLに登録
• CREATE EXTENSION pg_bigm;
4. 全文検索インデックスを作成
• CREATE INDEX hoge_idx ON hoge USING gin (col gin_bigm_ops);
20Copyright © 2016 NTT DATA Corporation
6.
PostgreSQLの
GINインデックスを利用
21Copyright © 2016 NTT DATA Corporation
PostgreSQLのGINインデックスを利用
• 全文検索インデックス自体はPostgreSQLが管理。
• pg_bigmはGINインデックスへのアクセス方法のみを提供
• リカバリ、PITR、レプリケーションはPostgreSQLに任せることが可能。
WAL
pg_bigm
GIN
インデックス
テーブル
サーバ
プロセス
WALを書く
アクセス
PostgreSQL内部
アクセス
22Copyright © 2016 NTT DATA Corporation
7.
PostgreSQL 9.4以降
との組み合わせがおすすめ
23Copyright © 2016 NTT DATA Corporation
PostgreSQL9.4以降がおすすめ
PostgreSQL9.4でGINインデックスのサイズ、検索性能が改善されました。
検索
キーワード
PG9.3
+
pg_bigm
PG9.4
+
pg_bigm
東京 0.8 秒 0.3 秒
東京都 0.5 秒 0.2 秒
東京と京都 0.03秒 0.004 秒
昭和四十四
年度以降
0.3秒 0.08 秒
6.5 GB
10 GB
3.7 GB
■GINインデックスの圧縮 ■検索性能の向上
24Copyright © 2016 NTT DATA Corporation
8.
“文字の種類を意識しない”
全文検索が可能
25Copyright © 2016 NTT DATA Corporation
“文字の種類を意識しない”全文検索が可能
=# SELECT * FROM hoge WHERE pgs2norm(col) LIKE likequery(pgs2norm('%ポスグレ%‘));
col
--------------------------
半角文字でポスグレ
全角文字でポスグレ
半角、全角を混ぜてポスグレ
(3 rows)
=# SELECT * FROM hoge WHERE pgs2norm(col) LIKE likequery(pgs2norm('%1番目%‘));
col
--------
1番目
1番目
①番目
半角文字で全角文字を、全角文字で半角文字を検索。
26Copyright © 2016 NTT DATA Corporation
「ludia_funcs」を使用
• 正規化関数を使用した関数インデックスを作成
• GINインデックスには正規化された文字情報が格納される
• 依然、GINインデックスはPostgreSQLが管理
pg_bigm
「1番」
「番目」
ludia_funcs
「①番目」 「1番目」
入力データ
「①番目」
正規化関数
=# CREATE INDEX … USING gin (pg2norm(col) gin_bigm_ops);
GIN
インデックス
=# SELECT * FROM hoge WHERE pgs2norm(col) LIKE likequery(pgs2norm('%ポスグレ%’));
27Copyright © 2016 NTT DATA Corporation
最後に
1. 全文検索インデックスが必要ない検索と必要ある検索
2. なぜpg_bigmを開発したか
3. 1,2文字検索に対応
4. 性能情報
5. pg_bigmを使うまでに必要な4ステップ
6. PostgreSQLのGINインデックスを利用
7. PostgreSQL9.4以降との組み合わせがおすすめ
8. “文字の種類を意識しない”全文検索が可能
Copyright © 2011 NTT DATA Corporation
Copyright © 2016 NTT DATA Corporation
29Copyright © 2016 NTT DATA Corporation
(参考)N-gramと形態素解析
N-gram
• 文章を文字単位で分割 (‘夜景が綺麗’ → ‘夜景’, ‘景が’, ‘が綺’, ‘綺麗’)
• 漏れがなく全文検索することが可能 (造語、新出語も対応)
• 採用モジュール : pg_bigm, pg_trgm, pgroonga, unigram,
textsearch_senna
形態素解析
• 文章を単語単位で分割 (‘夜景が綺麗’ → ‘夜景’, ‘綺麗’)
• 検索ノイズの少ない全文検索することが可能 (京都で「東京都庁」がヒットし
ない)
• 採用モジュール : pgroonga, textsearch_ja, textsearch_groonga
pg_bigmは
2-gramを採用

More Related Content

What's hot (20)

PPTX
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
PDF
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA OSS Professional Services
 
PDF
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
 
PDF
PostgreSQLの範囲型と排他制約
Akio Ishida
 
PPTX
SQLチューニング入門 入門編
Miki Shimogai
 
PDF
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
NTT DATA Technology & Innovation
 
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
初心者向けMroonga・PGroonga情報
Kouhei Sutou
 
PDF
MroongaとPGroonga
Kouhei Sutou
 
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
NTT DATA Technology & Innovation
 
PDF
pg_bigmを触り始めた人に伝えたいこと
Masahiko Sawada
 
PDF
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PDF
TIME_WAITに関する話
Takanori Sejima
 
PDF
PostgreSQLの運用・監視にまつわるエトセトラ
NTT DATA OSS Professional Services
 
VSCodeで作るPostgreSQL開発環境(第25回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
NTT DATA Technology & Innovation
 
YugabyteDBの実行計画を眺める(NewSQL/分散SQLデータベースよろず勉強会 #3 発表資料)
NTT DATA Technology & Innovation
 
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQL 15 開発最新情報
Masahiko Sawada
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA OSS Professional Services
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
 
PostgreSQLの範囲型と排他制約
Akio Ishida
 
SQLチューニング入門 入門編
Miki Shimogai
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
NTT DATA Technology & Innovation
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
 
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
初心者向けMroonga・PGroonga情報
Kouhei Sutou
 
MroongaとPGroonga
Kouhei Sutou
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
 
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
NTT DATA Technology & Innovation
 
pg_bigmを触り始めた人に伝えたいこと
Masahiko Sawada
 
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
 
TIME_WAITに関する話
Takanori Sejima
 
PostgreSQLの運用・監視にまつわるエトセトラ
NTT DATA OSS Professional Services
 

Similar to PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料) (20)

PDF
PostgreSQLによるデータ分析ことはじめ
Ohyama Masanori
 
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Satoshi Nagayasu
 
PDF
PostgreSQL 9.6 新機能紹介
Masahiko Sawada
 
PDF
KOF2015 PostgreSQL 9.5
Toshi Harada
 
PDF
Pgunconf 20121212-postgeres fdw
Toshi Harada
 
PDF
PostgreSQL13 新機能紹介
Satoshi Hirata
 
PPTX
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
PDF
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
kasaharatt
 
PDF
10大ニュースで振り返るPGCon2015
NTT DATA OSS Professional Services
 
PDF
使ってみませんか?pg hint_plan
Masao Fujii
 
PDF
Pgunconf14 pg13-psql
Toshi Harada
 
PDF
PostgreSQL 9.5 新機能紹介
NTT DATA OSS Professional Services
 
PPTX
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
PDF
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
Insight Technology, Inc.
 
PDF
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
Kouhei Sutou
 
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
Toshi Harada
 
PDF
JSONBはPostgreSQL9.5でいかに改善されたのか
NTT DATA OSS Professional Services
 
PDF
Extending PostgreSQL - PgDay 2012 Japan
Shigeru Hanada
 
PDF
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
NTT DATA OSS Professional Services
 
PDF
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
Insight Technology, Inc.
 
PostgreSQLによるデータ分析ことはじめ
Ohyama Masanori
 
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
Satoshi Nagayasu
 
PostgreSQL 9.6 新機能紹介
Masahiko Sawada
 
KOF2015 PostgreSQL 9.5
Toshi Harada
 
Pgunconf 20121212-postgeres fdw
Toshi Harada
 
PostgreSQL13 新機能紹介
Satoshi Hirata
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
 
20140531 JPUGしくみ+アプリケーション分科会 勉強会資料
kasaharatt
 
10大ニュースで振り返るPGCon2015
NTT DATA OSS Professional Services
 
使ってみませんか?pg hint_plan
Masao Fujii
 
Pgunconf14 pg13-psql
Toshi Harada
 
PostgreSQL 9.5 新機能紹介
NTT DATA OSS Professional Services
 
押さえておきたい、PostgreSQL 13 の新機能!!(Open Source Conference 2021 Online/Hokkaido 発表資料)
NTT DATA Technology & Innovation
 
[B23] PostgreSQLのインデックス・チューニング by Tomonari Katsumata
Insight Technology, Inc.
 
MySQL・PostgreSQLだけで作る高速でリッチな全文検索システム
Kouhei Sutou
 
MyNA JPUG study 20160220-postgresql-json-datatype
Toshi Harada
 
JSONBはPostgreSQL9.5でいかに改善されたのか
NTT DATA OSS Professional Services
 
Extending PostgreSQL - PgDay 2012 Japan
Shigeru Hanada
 
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
NTT DATA OSS Professional Services
 
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
Insight Technology, Inc.
 
Ad

More from NTT DATA OSS Professional Services (20)

PDF
Global Top 5 を目指す NTT DATA の確かで意外な技術力
NTT DATA OSS Professional Services
 
PDF
Spark SQL - The internal -
NTT DATA OSS Professional Services
 
PDF
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
PDF
Hadoopエコシステムのデータストア振り返り
NTT DATA OSS Professional Services
 
PDF
HDFS Router-based federation
NTT DATA OSS Professional Services
 
PDF
Apache Hadoopの新機能Ozoneの現状
NTT DATA OSS Professional Services
 
PDF
Distributed data stores in Hadoop ecosystem
NTT DATA OSS Professional Services
 
PDF
Structured Streaming - The Internal -
NTT DATA OSS Professional Services
 
PDF
Apache Hadoopの未来 3系になって何が変わるのか?
NTT DATA OSS Professional Services
 
PDF
Apache Hadoop and YARN, current development status
NTT DATA OSS Professional Services
 
PDF
HDFS basics from API perspective
NTT DATA OSS Professional Services
 
PDF
SIerとオープンソースの美味しい関係 ~コミュニティの力を活かして世界を目指そう~
NTT DATA OSS Professional Services
 
PDF
20170303 java9 hadoop
NTT DATA OSS Professional Services
 
PPTX
ブロックチェーンの仕組みと動向(入門編)
NTT DATA OSS Professional Services
 
PDF
Application of postgre sql to large social infrastructure jp
NTT DATA OSS Professional Services
 
PDF
Application of postgre sql to large social infrastructure
NTT DATA OSS Professional Services
 
PDF
Apache Hadoop 2.8.0 の新機能 (抜粋)
NTT DATA OSS Professional Services
 
PDF
データ活用をもっともっと円滑に! ~データ処理・分析基盤編を少しだけ~
NTT DATA OSS Professional Services
 
PDF
商用ミドルウェアのPuppet化で気を付けたい5つのこと
NTT DATA OSS Professional Services
 
PPTX
今からはじめるPuppet 2016 ~ インフラエンジニアのたしなみ ~
NTT DATA OSS Professional Services
 
Global Top 5 を目指す NTT DATA の確かで意外な技術力
NTT DATA OSS Professional Services
 
Spark SQL - The internal -
NTT DATA OSS Professional Services
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
NTT DATA OSS Professional Services
 
Hadoopエコシステムのデータストア振り返り
NTT DATA OSS Professional Services
 
HDFS Router-based federation
NTT DATA OSS Professional Services
 
Apache Hadoopの新機能Ozoneの現状
NTT DATA OSS Professional Services
 
Distributed data stores in Hadoop ecosystem
NTT DATA OSS Professional Services
 
Structured Streaming - The Internal -
NTT DATA OSS Professional Services
 
Apache Hadoopの未来 3系になって何が変わるのか?
NTT DATA OSS Professional Services
 
Apache Hadoop and YARN, current development status
NTT DATA OSS Professional Services
 
HDFS basics from API perspective
NTT DATA OSS Professional Services
 
SIerとオープンソースの美味しい関係 ~コミュニティの力を活かして世界を目指そう~
NTT DATA OSS Professional Services
 
20170303 java9 hadoop
NTT DATA OSS Professional Services
 
ブロックチェーンの仕組みと動向(入門編)
NTT DATA OSS Professional Services
 
Application of postgre sql to large social infrastructure jp
NTT DATA OSS Professional Services
 
Application of postgre sql to large social infrastructure
NTT DATA OSS Professional Services
 
Apache Hadoop 2.8.0 の新機能 (抜粋)
NTT DATA OSS Professional Services
 
データ活用をもっともっと円滑に! ~データ処理・分析基盤編を少しだけ~
NTT DATA OSS Professional Services
 
商用ミドルウェアのPuppet化で気を付けたい5つのこと
NTT DATA OSS Professional Services
 
今からはじめるPuppet 2016 ~ インフラエンジニアのたしなみ ~
NTT DATA OSS Professional Services
 
Ad

Recently uploaded (8)

PDF
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
PDF
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
PDF
2023年版Web3技術の理想と現実
Syuhei Hiya
 
PDF
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
PPTX
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
PDF
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
PPTX
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
 
生成AIパネルトーク(Interop25Tokyo APPS JAPAN M1-07,M2-07 嶋ポジショントーク)
嶋 是一 (Yoshikazu SHIMA)
 
2023年版Web3技術の理想と現実
Syuhei Hiya
 
20250630_aws_reinforce_2025_aws_sheild_network_security_director
uedayuki
 
オープンソース界隈の利用者や技術者から見たオープンソースEDAとは? What is open source EDA from the perspecti...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
 
SIG-AUDIO 2025 Vol.02 オンラインセミナー SIG-Audioプレゼン資料_オーディオプラグイン開発_塩澤達矢.pdf
IGDA Japan SIG-Audio
 
go tool と Minimal Version Selection アルゴリズム
Keisuke Ishigami
 
新卒・中途採用者向け採用ピッチ資料2025年7月版(20250702).pptx
Official74
 

PostgreSQLでpg_bigmを使って日本語全文検索 (MySQLとPostgreSQLの日本語全文検索勉強会 発表資料)

  • 1. Copyright © 2016 NTT DATA Corporation 2016年2月9日 株式会社NTTデータ 澤田雅彦 PostgreSQLでpg_bigmを使って日本語全文検索 ~pg_bigmで全文検索するときに知っておくべき8のこと~ @MySQLとPostgreSQLの日本語全文検索勉強会
  • 2. 2Copyright © 2016 NTT DATA Corporation PostgreSQL 9.5 リリース! 1/7にリリース されました!
  • 3. 3Copyright © 2016 NTT DATA Corporation PostgreSQL 開発者@ NTT データ 社内 PostgreSQL 営業・技術支援 PostgreSQL のコア機能を開発 レプリケーション運用性向上 REINDEX SCHEMA / VERBOSE pg_bigm(全文検索モジュール) コア機能へのパッチレビューア 澤田 雅彦 @sawada_masahiko
  • 4. 4Copyright © 2016 NTT DATA Corporation 「PostgreSQL 全文検索 日本語」で検索 pg_bigm textsearch_ja pg_trgm pgroonga
  • 5. 5Copyright © 2016 NTT DATA Corporation PostgreSQLで使える日本語全文検索モジュールはいろいろ • pgroonga • pg_bigm • pg_trgm • unigram • textsearch_ja • textsearch_groonga • textsearch_senna など
  • 6. 6Copyright © 2016 NTT DATA Corporation 形態素解析 N-gram 分類すると • textsearch_ja • pgroonga • textsearch_ groonga • pg_bigm • pg_trgm • unigram • textsearch_senna
  • 7. Copyright © 2016 NTT DATA Corporation 7 pg_bigmで全文検索するときに知っておくべき8のこと
  • 8. 8Copyright © 2016 NTT DATA Corporation 1. 全文検索インデックスが 必要ない検索と 必要ある検索
  • 9. 9Copyright © 2016 NTT DATA Corporation 全文検索インデックスが必要ない/ある検索 全文検索インデックスが必要ない検索 • テーブル件数が少ない → シーケンシャルスキャンでOK • 前方一致検索だけ (‘東京%’) → BtreeインデックスでOK • 後方一致検索だけ (‘%東京’) → Btree(式)インデックスでOK 全文検索インデックスが必要ある検索 • 大きいテーブルで中間一致検索を使う (‘%東京%’) • 前方、後方、中間一致検索をする可能性がある
  • 10. 10Copyright © 2016 NTT DATA Corporation 2. なぜpg_bigmを開発したか
  • 11. 11Copyright © 2016 NTT DATA Corporation 昔、PostgreSQLで全文検索したい時 ○ PostgreSQL 8系で日本語全文検索が可能 × 全文検索インデックスは、リカバリ未対応 × クラッシュ後、REINDEXが必要 × 8.3以降のVACUUMに未対応 × PostgreSQL9系には未対応
  • 12. 12Copyright © 2016 NTT DATA Corporation PostgreSQL本体でもN-gram全文検索の利用が可能に ○ PostgreSQL付属モジュール ○ インデックスはPostgreSQLが管理 × 日本語(マルチバイト文字)に未対応 × 1,2文字検索が低速
  • 13. 13Copyright © 2016 NTT DATA Corporation N-gramで日本語対応 pg_bigmはpg_trgmを日本語検索に強化・最適化したモジュール pg_bigm (バイグラム) pg_trgm (トライグラム) インデックスの 作成方法 2-gram 3-gram 日本語対応 ○ × 1,2文字検索 高速 低速
  • 14. 14Copyright © 2016 NTT DATA Corporation 3. 1,2文字検索に対応
  • 15. 15Copyright © 2016 NTT DATA Corporation 1,2文字の検索に対応 • pg_trgmでは検索キーワードが3文字以上でないと、インデックスを使った高速な検索ができない。 • pg_bigmでは1,2文字(本、学校など)の検索でもインデックスを使用した高速な検索が可能。 検索例 pg_bigm pg_trgm col LIKE ‘%駅%’ 高速 低速 col LIKE ‘%東京%’ 高速 低速 col LIKE ‘%東京駅%’ 高速 高速
  • 16. 16Copyright © 2016 NTT DATA Corporation 4. 性能情報
  • 17. 17Copyright © 2016 NTT DATA Corporation 検索キーワード 取得件数 pg_bigm pg_trgm SeqScan 町 17万件 0.4 秒 504 秒 15 秒 東京 16万件 0.3 秒 407 秒 東京都 4万件 0.2 秒 0.2 秒 東京と京都 150件 0.004 秒 0.001 秒 昭和四十四年度以降 150件 0.08 秒 0.02 秒 性能情報 日本語データを全文検索(サイズ:6GB、データ件数:1300万件)
  • 18. 18Copyright © 2016 NTT DATA Corporation 5. pg_bigmを使うために 必要な4ステップ
  • 19. 19Copyright © 2016 NTT DATA Corporation pg_bigmを使うために必要な4ステップ 1. RPMインストール • PostgreSQLのバージョンに合ったRPMをダウンロードし、インストール • https://osdn.jp/projects/pgbigm/releases/p13634 2. 設定ファイルに追記 • postgresql.confに「shared_preload_libraries = ‘pg_bigm’」を追記 3. pg_bigmをPostgreSQLに登録 • CREATE EXTENSION pg_bigm; 4. 全文検索インデックスを作成 • CREATE INDEX hoge_idx ON hoge USING gin (col gin_bigm_ops);
  • 20. 20Copyright © 2016 NTT DATA Corporation 6. PostgreSQLの GINインデックスを利用
  • 21. 21Copyright © 2016 NTT DATA Corporation PostgreSQLのGINインデックスを利用 • 全文検索インデックス自体はPostgreSQLが管理。 • pg_bigmはGINインデックスへのアクセス方法のみを提供 • リカバリ、PITR、レプリケーションはPostgreSQLに任せることが可能。 WAL pg_bigm GIN インデックス テーブル サーバ プロセス WALを書く アクセス PostgreSQL内部 アクセス
  • 22. 22Copyright © 2016 NTT DATA Corporation 7. PostgreSQL 9.4以降 との組み合わせがおすすめ
  • 23. 23Copyright © 2016 NTT DATA Corporation PostgreSQL9.4以降がおすすめ PostgreSQL9.4でGINインデックスのサイズ、検索性能が改善されました。 検索 キーワード PG9.3 + pg_bigm PG9.4 + pg_bigm 東京 0.8 秒 0.3 秒 東京都 0.5 秒 0.2 秒 東京と京都 0.03秒 0.004 秒 昭和四十四 年度以降 0.3秒 0.08 秒 6.5 GB 10 GB 3.7 GB ■GINインデックスの圧縮 ■検索性能の向上
  • 24. 24Copyright © 2016 NTT DATA Corporation 8. “文字の種類を意識しない” 全文検索が可能
  • 25. 25Copyright © 2016 NTT DATA Corporation “文字の種類を意識しない”全文検索が可能 =# SELECT * FROM hoge WHERE pgs2norm(col) LIKE likequery(pgs2norm('%ポスグレ%‘)); col -------------------------- 半角文字でポスグレ 全角文字でポスグレ 半角、全角を混ぜてポスグレ (3 rows) =# SELECT * FROM hoge WHERE pgs2norm(col) LIKE likequery(pgs2norm('%1番目%‘)); col -------- 1番目 1番目 ①番目 半角文字で全角文字を、全角文字で半角文字を検索。
  • 26. 26Copyright © 2016 NTT DATA Corporation 「ludia_funcs」を使用 • 正規化関数を使用した関数インデックスを作成 • GINインデックスには正規化された文字情報が格納される • 依然、GINインデックスはPostgreSQLが管理 pg_bigm 「1番」 「番目」 ludia_funcs 「①番目」 「1番目」 入力データ 「①番目」 正規化関数 =# CREATE INDEX … USING gin (pg2norm(col) gin_bigm_ops); GIN インデックス =# SELECT * FROM hoge WHERE pgs2norm(col) LIKE likequery(pgs2norm('%ポスグレ%’));
  • 27. 27Copyright © 2016 NTT DATA Corporation 最後に 1. 全文検索インデックスが必要ない検索と必要ある検索 2. なぜpg_bigmを開発したか 3. 1,2文字検索に対応 4. 性能情報 5. pg_bigmを使うまでに必要な4ステップ 6. PostgreSQLのGINインデックスを利用 7. PostgreSQL9.4以降との組み合わせがおすすめ 8. “文字の種類を意識しない”全文検索が可能
  • 28. Copyright © 2011 NTT DATA Corporation Copyright © 2016 NTT DATA Corporation
  • 29. 29Copyright © 2016 NTT DATA Corporation (参考)N-gramと形態素解析 N-gram • 文章を文字単位で分割 (‘夜景が綺麗’ → ‘夜景’, ‘景が’, ‘が綺’, ‘綺麗’) • 漏れがなく全文検索することが可能 (造語、新出語も対応) • 採用モジュール : pg_bigm, pg_trgm, pgroonga, unigram, textsearch_senna 形態素解析 • 文章を単語単位で分割 (‘夜景が綺麗’ → ‘夜景’, ‘綺麗’) • 検索ノイズの少ない全文検索することが可能 (京都で「東京都庁」がヒットし ない) • 採用モジュール : pgroonga, textsearch_ja, textsearch_groonga pg_bigmは 2-gramを採用