Copyright©2016 NTT corp. All Rights Reserved.
pg_̲bigmと類似度度検索索
2016/9/29
NTT  OSSセンタ
澤⽥田  雅彦
@MySQLとPostgreSQLと⽇日本語全⽂文検索索3
2Copyright©2016 NTT corp. All Rights Reserved.
1.  pg_̲bigmの特徴  +  前回の復復習
2.  ⽂文字の種類を意識識しない全⽂文検索索
3.  類似度度検索索
4.  デモ
⽬目次
3Copyright©2016 NTT corp. All Rights Reserved.
pg_̲bigmの特徴
4Copyright©2016 NTT corp. All Rights Reserved.
N-‐‑‒gram?形態素解析?
全⽂文検索索の勉強会
•  全⽂文
•  ⽂文検
•  検索索
•  索索の
•  の勉
•  勉強
•  強会
•  全⽂文検索索
•  の
•  勉強会
N-‐‑‒gram
(2-‐‑‒gram)
形態素解析
5Copyright©2016 NTT corp. All Rights Reserved.
前回(6/9)では、
6Copyright©2016 NTT corp. All Rights Reserved.
PostgreSQL9.4以降降がおすすめ
http://www.slideshare.net/hadoopxnttdata/postgresqlpgbigm-mysqlpostgresql
7Copyright©2016 NTT corp. All Rights Reserved.
{	
  
    “$tle”	
  	
  	
  :	
  “MySQLとPostgreSQLと⽇日本語全⽂文検索索2”,	
  
    “date”	
  	
  	
  :	
  2016-­‐06-­‐09,	
  
    “desc”	
  	
  	
  :	
  “MySQLとPostgreSQLの⽇日本語全⽂文検索索を知っている⼈人向けの勉強会”,	
  
    “url”	
  	
  	
  	
  	
  	
  :	
  “h@ps://groonga.doorkeeper.jp/events/41770”	
  
    “hashtag”	
  :	
  “#mypgL”,	
  
    “venue”	
  :	
  {	
  	
  
	
         	
    “name”	
  :	
  “DMM.comラボ”,	
  
	
         	
    “address”	
  :	
  “渋⾕谷区恵⽐比寿4-­‐20-­‐3	
  恵⽐比寿ガーデンプレイスタワー21F”	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
}	
  
JSONB型と⼀一緒に使う
CREATE INDEX bigm_idx on jb using gin((col->>’title’) gin_bigm_ops);
8Copyright©2016 NTT corp. All Rights Reserved.
{	
  
    “$tle”	
  	
  	
  :	
  “MySQLとPostgreSQLと⽇日本語全⽂文検索索2”,	
  
    “date”	
  	
  	
  :	
  2016-­‐06-­‐09,	
  
    “desc”	
  	
  	
  :	
  “MySQLとPostgreSQLの⽇日本語全⽂文検索索を知っている⼈人向けの勉強会”,	
  
    “url”	
  	
  	
  	
  	
  	
  :	
  “h@ps://groonga.doorkeeper.jp/events/41770”	
  
    “hashtag”	
  :	
  “#mypgL”,	
  
    “venue”	
  :	
  {	
  	
  
	
         	
    “name”	
  :	
  “DMM.comラボ”,	
  
	
         	
    “address”	
  :	
  “渋⾕谷区恵⽐比寿4-­‐20-­‐3	
  恵⽐比寿ガーデンプレイスタワー21F”	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
}	
  
JSONB型と⼀一緒に使う
CREATE INDEX bigm_idx on jb using gin((col->>’title’) gin_bigm_ops);
WHERE  (col-‐‑‒>>ʼ’titleʼ’)  LIKE  ʻ‘%⽇日本語全⽂文検索索%ʼ’;
列列名 属性名 検索索キーワード
9Copyright©2016 NTT corp. All Rights Reserved.
今回は、
10Copyright©2016 NTT corp. All Rights Reserved.
• 表記のゆれ	
  
•  「インタフェース」と「インターフェース」	
  
•  「ハロウィーン」と「ハロウィン」	
  
•  「PostgreSQL」と「postgresql」	
  
•  「①②③」と「123」	
  
• 誤字、脱字	
  
•  「オーケストラ」と「オーケトスラ」	
  
•  「postgresql」と「postregsql」	
  
	
  
表記のゆれ、誤字脱字も含めて全⽂文検索索したい
11Copyright©2016 NTT corp. All Rights Reserved.
⽂文字の種類を意識識しない全⽂文検索索	
  
12Copyright©2016 NTT corp. All Rights Reserved.
• lower()またはupper()を使⽤用した関数インデックスを
使⽤用することで、⼤大⽂文字、⼩小⽂文字を意識識しない全⽂文検
索索が可能	
  
関数インデックスを使⽤用
=#	
  CREATE	
  INDEX	
  hoge_idx	
  ON	
  hoge	
  USING	
  gin	
  (lower(col)	
  gin_bigm_ops);	
  
CREATE	
  INDEX	
  
=#	
  SELECT	
  *	
  FROM	
  hoge	
  WHERE	
  lower(col)	
  LIKE	
  ‘%postgresql%’;	
  
	
  	
  	
  	
  col	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  postgresql	
  
	
  PostgreSQL	
  
	
  POSTGRESQL	
  
(3	
  rows)	
  
関数インデックス次第で⽇日本語にも対応可能
13Copyright©2016 NTT corp. All Rights Reserved.
類似度度検索索	
  
14Copyright©2016 NTT corp. All Rights Reserved.
•  表記のゆれ、誤字・脱字も含めた全⽂文検索索が可能	
  
•  設定した閾値を超える⽂文字列列を「似ている⽂文字列列」と判断	
  
類似度度検索索
=#	
  INSERT	
  INTO	
  hoge	
  VALUES(‘ハロウィーン’)	
  (‘ハロウィン’);	
  
=#	
  SET	
  pg_bigm.bigm_similarity_limit	
  TO	
  0.5;	
  
=#	
  SELECT	
  *	
  FROM	
  hoge	
  WHERE	
  col	
  =%	
  'ハロウィン';	
  
	
  	
  	
  	
  	
  col	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
  ハロウィーン
  ハロウィン
(2	
  rows)	
  
	
  
=#	
  SET	
  pg_bigm.bigm_similarity_limit	
  TO	
  0.8;	
  
=#	
  SELECT	
  *	
  FROM	
  hoge	
  WHERE	
  col	
  =%	
  ‘ハロウィン’;	
  
	
  	
  	
  	
  	
  col	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  ハロウィン
(1	
  rows)	
  
15Copyright©2016 NTT corp. All Rights Reserved.
•  類似度度は0.0〜~1.0	
  
•  共通した⽂文字が多いほど、類似度度は⾼高い	
  
類似度度検索索
=#	
  SELECT	
  bigm_similarity('ハロウィン',  'ハロウィーン');	
  
	
  bigm_similarity	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  	
  	
  	
  	
  	
  	
  	
  0.714286	
  
(1	
  row)	
  
	
  
=#	
  SELECT	
  show_bigm('ハロウィーン');	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  show_bigm	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
  {ィー,ウィ,ハロ,ロウ,"ン  ",ーン,"  ハ"}	
  
(1	
  row)	
  
	
  
=#	
  SELECT	
  show_bigm('ハロウィン');	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  show_bigm	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  {ィン,ウィ,ハロ,ロウ,"ン  ","  ハ"}	
  
(1	
  row)	
  
16Copyright©2016 NTT corp. All Rights Reserved.
•  類似度度検索索では「いくつ共通した⽂文字が含まれているか」のみを計算している	
  
•  ⽂文書(⻑⾧長い)を単語(短い)で検索索する⽤用途には不不向き
類似度度検索索
=#	
  SELECT	
  bigm_similarity(ʻ‘全⽂文検索索勉強会ʼ’,  ʻ‘全⽂文検索索の勉強会');
	
  bigm_similarity	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  	
  	
  	
  	
  	
  	
  	
  0.777778	
  
(1	
  row)	
  
	
  
=#	
  SELECT	
  bigm_similarity(ʻ‘pg_̲trgmʼ’,  ʻ‘pg_̲bigmで全⽂文検索索');	
  
	
  bigm_similarity	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  	
  	
  	
  	
  	
  	
  	
  0.307692	
  
(1	
  row)	
  
	
  
=#	
  SELECT	
  bigm_similarity(ʻ‘pg_̲trgmʼ’,  ʻ‘pg_̲bigmで全⽂文検索索したい');	
  
	
  bigm_similarity	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  0.25	
  
(1	
  row)	
  
	
  
=#	
  SELECT	
  bigm_similarity(ʻ‘pg_̲trgmʼ’,  ʻ‘pg_̲bigmで全⽂文検索索したいのである');	
  
	
  bigm_similarity	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  0.2	
  
(1	
  row)	
  
検索索対象の⽂文字列列
の⻑⾧長さに応じて
類似度度が
下がっていってる
17Copyright©2016 NTT corp. All Rights Reserved.
•  PostgreSQL	
  9.6に⼊入ったWord	
  Similarity	
  Searchを利利⽤用	
  
•  検索索キーワードを「⼀一塊の⽂文字列列」と⾒見見ることで、単語を意識識し
た類似度度検索索が可能	
  
•  現在テスト中
単語を意識識した類似度度検索索  PG9.6  New!  
=#	
  SELECT	
  bigm_similarity(‘pg_trgm’,	
  ‘pg_̲bigmで全⽂文検索索したい');	
  
	
  bigm_similarity	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  0.5	
  
(1	
  row)	
  
	
  
=#	
  SELECT	
  bigm_similarity(‘pg_trgm’,	
  ‘pg_̲bigmで全⽂文検索索したいのである');	
  
	
  bigm_similarity	
  
-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  0.5	
  
(1	
  row)	
  
検索索対象⽂文字列列の⻑⾧長さ
に関係なく、類似度度が
算出される
18Copyright©2016 NTT corp. All Rights Reserved.
• 関数インデックス、類似度度検索索を使うことで、柔軟な
検索索が可能
•  使⽤用する関数を⼯工夫することで、⽇日本語にも対応可能
• 類似度度検索索では、閾値以上の「似ている」⽂文字列列を⾼高
速に検索索することができる
•  閾値の調整は要件次第
まとめ
19Copyright©2016 NTT corp. All Rights Reserved.
ご清聴ありがとうございました

pg_bigmと類似度検索

  • 1.
    Copyright©2016 NTT corp.All Rights Reserved. pg_̲bigmと類似度度検索索 2016/9/29 NTT  OSSセンタ 澤⽥田  雅彦 @MySQLとPostgreSQLと⽇日本語全⽂文検索索3
  • 2.
    2Copyright©2016 NTT corp.All Rights Reserved. 1.  pg_̲bigmの特徴  +  前回の復復習 2.  ⽂文字の種類を意識識しない全⽂文検索索 3.  類似度度検索索 4.  デモ ⽬目次
  • 3.
    3Copyright©2016 NTT corp.All Rights Reserved. pg_̲bigmの特徴
  • 4.
    4Copyright©2016 NTT corp.All Rights Reserved. N-‐‑‒gram?形態素解析? 全⽂文検索索の勉強会 •  全⽂文 •  ⽂文検 •  検索索 •  索索の •  の勉 •  勉強 •  強会 •  全⽂文検索索 •  の •  勉強会 N-‐‑‒gram (2-‐‑‒gram) 形態素解析
  • 5.
    5Copyright©2016 NTT corp.All Rights Reserved. 前回(6/9)では、
  • 6.
    6Copyright©2016 NTT corp.All Rights Reserved. PostgreSQL9.4以降降がおすすめ http://www.slideshare.net/hadoopxnttdata/postgresqlpgbigm-mysqlpostgresql
  • 7.
    7Copyright©2016 NTT corp.All Rights Reserved. {       “$tle”      :  “MySQLとPostgreSQLと⽇日本語全⽂文検索索2”,       “date”      :  2016-­‐06-­‐09,       “desc”      :  “MySQLとPostgreSQLの⽇日本語全⽂文検索索を知っている⼈人向けの勉強会”,       “url”            :  “h@ps://groonga.doorkeeper.jp/events/41770”       “hashtag”  :  “#mypgL”,       “venue”  :  {                “name”  :  “DMM.comラボ”,              “address”  :  “渋⾕谷区恵⽐比寿4-­‐20-­‐3  恵⽐比寿ガーデンプレイスタワー21F”                        }   }   JSONB型と⼀一緒に使う CREATE INDEX bigm_idx on jb using gin((col->>’title’) gin_bigm_ops);
  • 8.
    8Copyright©2016 NTT corp.All Rights Reserved. {       “$tle”      :  “MySQLとPostgreSQLと⽇日本語全⽂文検索索2”,       “date”      :  2016-­‐06-­‐09,       “desc”      :  “MySQLとPostgreSQLの⽇日本語全⽂文検索索を知っている⼈人向けの勉強会”,       “url”            :  “h@ps://groonga.doorkeeper.jp/events/41770”       “hashtag”  :  “#mypgL”,       “venue”  :  {                “name”  :  “DMM.comラボ”,              “address”  :  “渋⾕谷区恵⽐比寿4-­‐20-­‐3  恵⽐比寿ガーデンプレイスタワー21F”                        }   }   JSONB型と⼀一緒に使う CREATE INDEX bigm_idx on jb using gin((col->>’title’) gin_bigm_ops); WHERE  (col-‐‑‒>>ʼ’titleʼ’)  LIKE  ʻ‘%⽇日本語全⽂文検索索%ʼ’; 列列名 属性名 検索索キーワード
  • 9.
    9Copyright©2016 NTT corp.All Rights Reserved. 今回は、
  • 10.
    10Copyright©2016 NTT corp.All Rights Reserved. • 表記のゆれ   •  「インタフェース」と「インターフェース」   •  「ハロウィーン」と「ハロウィン」   •  「PostgreSQL」と「postgresql」   •  「①②③」と「123」   • 誤字、脱字   •  「オーケストラ」と「オーケトスラ」   •  「postgresql」と「postregsql」     表記のゆれ、誤字脱字も含めて全⽂文検索索したい
  • 11.
    11Copyright©2016 NTT corp.All Rights Reserved. ⽂文字の種類を意識識しない全⽂文検索索  
  • 12.
    12Copyright©2016 NTT corp.All Rights Reserved. • lower()またはupper()を使⽤用した関数インデックスを 使⽤用することで、⼤大⽂文字、⼩小⽂文字を意識識しない全⽂文検 索索が可能   関数インデックスを使⽤用 =#  CREATE  INDEX  hoge_idx  ON  hoge  USING  gin  (lower(col)  gin_bigm_ops);   CREATE  INDEX   =#  SELECT  *  FROM  hoge  WHERE  lower(col)  LIKE  ‘%postgresql%’;          col   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐    postgresql    PostgreSQL    POSTGRESQL   (3  rows)   関数インデックス次第で⽇日本語にも対応可能
  • 13.
    13Copyright©2016 NTT corp.All Rights Reserved. 類似度度検索索  
  • 14.
    14Copyright©2016 NTT corp.All Rights Reserved. •  表記のゆれ、誤字・脱字も含めた全⽂文検索索が可能   •  設定した閾値を超える⽂文字列列を「似ている⽂文字列列」と判断   類似度度検索索 =#  INSERT  INTO  hoge  VALUES(‘ハロウィーン’)  (‘ハロウィン’);   =#  SET  pg_bigm.bigm_similarity_limit  TO  0.5;   =#  SELECT  *  FROM  hoge  WHERE  col  =%  'ハロウィン';            col   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐    ハロウィーン  ハロウィン (2  rows)     =#  SET  pg_bigm.bigm_similarity_limit  TO  0.8;   =#  SELECT  *  FROM  hoge  WHERE  col  =%  ‘ハロウィン’;            col   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐    ハロウィン (1  rows)  
  • 15.
    15Copyright©2016 NTT corp.All Rights Reserved. •  類似度度は0.0〜~1.0   •  共通した⽂文字が多いほど、類似度度は⾼高い   類似度度検索索 =#  SELECT  bigm_similarity('ハロウィン',  'ハロウィーン');    bigm_similarity   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐                  0.714286   (1  row)     =#  SELECT  show_bigm('ハロウィーン');                                show_bigm   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐    {ィー,ウィ,ハロ,ロウ,"ン  ",ーン,"  ハ"}   (1  row)     =#  SELECT  show_bigm('ハロウィン');                            show_bigm   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐    {ィン,ウィ,ハロ,ロウ,"ン  ","  ハ"}   (1  row)  
  • 16.
    16Copyright©2016 NTT corp.All Rights Reserved. •  類似度度検索索では「いくつ共通した⽂文字が含まれているか」のみを計算している   •  ⽂文書(⻑⾧長い)を単語(短い)で検索索する⽤用途には不不向き 類似度度検索索 =#  SELECT  bigm_similarity(ʻ‘全⽂文検索索勉強会ʼ’,  ʻ‘全⽂文検索索の勉強会');  bigm_similarity   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐                  0.777778   (1  row)     =#  SELECT  bigm_similarity(ʻ‘pg_̲trgmʼ’,  ʻ‘pg_̲bigmで全⽂文検索索');    bigm_similarity   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐                  0.307692   (1  row)     =#  SELECT  bigm_similarity(ʻ‘pg_̲trgmʼ’,  ʻ‘pg_̲bigmで全⽂文検索索したい');    bigm_similarity   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐                          0.25   (1  row)     =#  SELECT  bigm_similarity(ʻ‘pg_̲trgmʼ’,  ʻ‘pg_̲bigmで全⽂文検索索したいのである');    bigm_similarity   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐                            0.2   (1  row)   検索索対象の⽂文字列列 の⻑⾧長さに応じて 類似度度が 下がっていってる
  • 17.
    17Copyright©2016 NTT corp.All Rights Reserved. •  PostgreSQL  9.6に⼊入ったWord  Similarity  Searchを利利⽤用   •  検索索キーワードを「⼀一塊の⽂文字列列」と⾒見見ることで、単語を意識識し た類似度度検索索が可能   •  現在テスト中 単語を意識識した類似度度検索索  PG9.6  New!   =#  SELECT  bigm_similarity(‘pg_trgm’,  ‘pg_̲bigmで全⽂文検索索したい');    bigm_similarity   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐                            0.5   (1  row)     =#  SELECT  bigm_similarity(‘pg_trgm’,  ‘pg_̲bigmで全⽂文検索索したいのである');    bigm_similarity   -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐                            0.5   (1  row)   検索索対象⽂文字列列の⻑⾧長さ に関係なく、類似度度が 算出される
  • 18.
    18Copyright©2016 NTT corp.All Rights Reserved. • 関数インデックス、類似度度検索索を使うことで、柔軟な 検索索が可能 •  使⽤用する関数を⼯工夫することで、⽇日本語にも対応可能 • 類似度度検索索では、閾値以上の「似ている」⽂文字列列を⾼高 速に検索索することができる •  閾値の調整は要件次第 まとめ
  • 19.
    19Copyright©2016 NTT corp.All Rights Reserved. ご清聴ありがとうございました