SlideShare a Scribd company logo
1 of 34
Download to read offline
つかってみよう”pg_trgm”
                                        やってみよう”全文検索”


                                        2013年2月16日
                                        株式会社NTTデータ 基盤システム事業本部
                                        澤田 雅彦




Copyright © 2013 NTT DATA Corporation
INDEX



 01 全文検索とは?
 02 pg_trgmってなに?
 03 pg_trgmの動きを見てみよう
 04 まとめ




Copyright © 2013NTT DATA Corporation   2
1. 全文検索とは?




Copyright © 2013 NTT DATA Corporation                3
1.1 全文検索ってなに?



全文検索ってなに?
   複数にまたがるテキストからキーワードを含むテキストを見つけ出す事


                                                                                   東京都・・・・
                                            キーワード                                   ・・・・・・・・
                                                                               東京都・・・・
                                                                             ・・・・・・・・・図書館・・・・
                                     「オープンソース」                                  ・・・・・・・・
                                                                                    ・・・・・・・・
                                                                        ・・・・・・・・・図書館・・・・
                                                                         東京都で・・・・
                                                                                 ・・・・・・・・・・・・
                                                                                ・・・・・・・・
                                                                            ・・・・・・・・
                                                                   東京都・・・・
                                                                          ・・オープンソース・・・
                                                                    ・・・・・・・・
                                                                             ・・・・・・・・・・・・
                                                                             ・・・・・・
                                                                       ・・・データベース・・・
                                                                     ・・オープンソース・・・
                                                              ・・・・・・・・・図書館・・・・
                                                                            ・・・・・・・・
                                                                                    ・・・・・・・・
                                                                    ・・・・・・・・ ・・・・・・・・ ・・・・・
                                                    全文検索                 ・・・・・・・・・・・・
                                                                                  ・・・・・・・・本。
                                                                 ・・・・・・・・・・・・ ・・・・・
                                                                              ・・・・・
                                                                                ・学校・・・・・・・・・
                                                                              ・・・・・・・・本。
                                                            オープンソース
                                                           ・・
                                                                            ・・・・・・・・
                                                                                      ・・・
                                                                           ・学校・・・・・・・・・
                                                                    ・・・・・・・・
                                                                      ・・・・・
                                                                  ・・・・・・・・本。
                                                                ・学校・・・・・・・・・




    Copyright © 2013 NTT DATA Corporation                                                       4
1.2 DBの全文検索ってなに?

 テキスト型の列を持つテーブルから、キーワードを含むレコードを検索すること

  一般的に、「全文検索機能がある」といえば、高速にできることを表す

  しかし、全文検索ではBtree等のインデックスを使用できないため遅い!

  なので、ツールを用いてインデックスを張る必要がある
 全文検索を実現するには。。。

  N-gram方式、形態素解析方式がある



                                           キーワード:「オープンソース」


                                                             DB
                                                SQL発行
                                                              :
                                                              :

   Copyright © 2013 NTT DATA Corporation                          5
1.3 N-gram解析と形態素解析

                                  形態素解析           N-gram方式
分割方法                              単語単位で分割         文字単位で分割
インデックスサ
                                  ○(単語単位)         ×(分割数が多いため)
イズ

表記の揺れ                             ○(類義語を定義しやすい)   △(表記の揺れに弱い)

                                  △(単語の分割精度に依存す
検索結果                                              ○(LIKEに近い検索結果になる)
                                  る)
どういう時に使
        整った文章(論文等)を扱う時                            記号や造語を検索する時
える?
                                    例)文字列‘今日は寒天の日’ではどうなる?
                                                  (3-gramの場合)
キーワード                             「今日」,「寒天」,「日」   「今日は」,「日は寒」,「は寒天」,
                                                  「寒天の」,「天の日」
  Copyright © 2013 NTT DATA Corporation                                6
1.4 PostgreSQLで全文検索でインデックスを使うためのモジュール


                                                   pg_trgm            textsearch_senna         textsearch_ja

  解析方式                                             3-gram                 N-gram                形態素解析

 対応バージョン                                           9.1以降                  8.2以降                  8.3以降

  提供形態                                         contribモジュール              外部ツール                  外部ツール

  開発主体                                       PostgreSQLコミュニティ         板垣さん(個人)                板垣さん(個人)

                                                     なし                                           Mecab
 依存モジュール                                                                   Senna
                                           (PostgreSQLのGin、GiSTを利用)                      (PostgreSQLのGin、GiSTを利用)

レプリケーション対応                                            ○                     ×                       ○

 リカバリ対応                                               ○                     ×                       ○

                                           △(ソース内を再設定しないと
  日本語対応                                                                     ○                       ○
                                                いけない)



                                           以下、pg_trgmを扱っていきます
   Copyright © 2013 NTT DATA Corporation                                                                            7
2. pg_trgmとは?




Copyright © 2013 NTT DATA Corporation                   8
2.1 pg_trgmとは

 全文検索はPostgreSQL9.1から対応

 contribモジュールとして提供

 3-gram方式

 GIN,GiSTインデックスに対応

 レプリケーション・リカバリに対応

                              名前          検索   構築・更新
       GIN 汎用転置インデックス                     速い   遅い
       GiST 汎用検索ツリー                       遅い   速い
  Copyright © 2013 NTT DATA Corporation                9
2.2 インストール方法



インストール方法
$ cd $PGSRC/contrib/pg_trgm

【ビルド時の注意】
日本語対応させるためには。。。

trgm.hの #define KEEPONLYALNUM             を必ずコメントアウトする!


$ make
$ make install



  Copyright © 2013 NTT DATA Corporation                   10
2.3 動作確認



postgres=# CREATE EXTENSION pg_trgm;
postgres=# CREATE TABLE tbl (col1 text);
postgres=# CREATE INDEX idx on tbl USING gin (col1 gin_trgm_ops); ←INDEX作成
postgres=# INSERT INTO tbl VALUES ('test');
postgres=# EXPLAIN SELECT * FROM tbl WHERE col1 LIKE '%test%';
                    QUERY PLAN
-----------------------------------------------------------
---------
 Bitmap Heap Scan on tbl (cost=16.16..26.43 rows=21 width=32)
  Recheck Cond: (col1 ~~ '%test%'::text)
  -> Bitmap Index Scan on idx (cost=0.00..16.16 rows=21 width=0)
      Index Cond: (col1 ~~ '%test%'::text)
(4 rows)



    Copyright © 2013 NTT DATA Corporation                                    11
2.4 インデックスを使ったとき、使わなかったとき


       10万件のデータの中から、少量のデータを取り出すケースで検証。

インデックス使用
postgres=# EXPLAIN ANALYZE SELECT * FROM tbl WHERE col1 LIKE '%京都府%';
                                   QUERY PLAN
---------------------------------------------------------------
 Bitmap Heap Scan on tbl (cost=20.08..55.53 rows=10 width=32) (actual time=0.021..0.022 rows=3 loops=1)
  Recheck Cond: (col1 ~~ '%京都府%'::text)
  -> Bitmap Index Scan on idx (cost=0.00..20.07 rows=10 width=0) (actual time=0.013..0.013 rows=3 loops=1)
      Index Cond: (col1 ~~ '%京都府%'::text)

Total runtime:             0.051 ms
 インデックス不使用
                                               400倍以上の差
postgres=# EXPLAIN ANALYZE SELECT * FROM tbl WHERE col1 LIKE '%京都府%';
                                QUERY PLAN
---------------------------------------------------------------
Seq Scan on tbl (cost=0.00..1662.00 rows=10 width=32) (actual time=22.282..22.284 rows=3 loops=1)
  Filter: (col1 ~~ '%京都府%'::text)

 Total runtime:              22.303 ms
     Copyright © 2013 NTT DATA Corporation                                                                   12
2.5 2文字以下の検索
 pg_trgmは、3文字単位で区切るため、2文字以下の検索ではインデックスを効率的に使
  えない。
   逆にインデックスを使うと「Bitmapの全件アクセス」になるため、SeqScanより遅い。
   英語の全文検索では1,2文字はストップワード(inやa)であることが多いので問題な
     いのかも。。
   しかし日本語では「本」、「学校」など1,2文字で全文検索をする可能性は十分ある!
postgres=# EXPLAIN ANALYZE SELECT * FROM tbl WHERE col1 LIKE '%京%';
   インデックス使用                             QUERY PLAN
-----------------------------------------------------------------------------------------------------
Bitmap Heap Scan on tbl (cost=938.92..2600.80 rows=99990 width=32) (actual time=96.956..139.761 rows=10000
3 loops=1)
  Recheck Cond: (col1 ~~ '%京%'::text)
  -> Bitmap Index Scan on idx (cost=0.00..913.92 rows=99990 width=0) (actual time=96.874..96.874 rows=1000
03 loops=1)
      Index Cond: (col1 ~~ '%京%'::text)

 Total runtime:   160.489 ms
(5 rows)                                          インデックスを使った方が遅い
postgres=# EXPLAIN ANALYZE SELECT * tbl WHERE col1 LIKE '%京%';
 インデックス不使用                        QUERY PLAN
----------------------------------------------------------------------------------------------------
 Seq Scan on tbl (cost=0.00..1662.00 rows=99990 width=32) (actual time=0.014..40.286 rows=100003 loops=1)
  Filter: (col1 ~~ '%京%'::text)

 Total runtime:   59.661 ms
(3 rows)
          Copyright © 2013 NTT DATA Corporation                                                             13
3. pg_trgmの動きを見てみよう




Copyright © 2013 NTT DATA Corporation                         14
3.1 どんな動きをするの?(インデックス登録編)

                                                                     ※△=半角空白


INSERT INTO tbl VALUES(‘                      あいうABC’);   TABLE
                 SQL発行                                      TID       データ
                                                            1        あいうABC


                                                            INDEX
                                                                キー      TID




      Copyright © 2013 NTT DATA Corporation                                    15
3.1 どんな動きをするの?(インデックス登録編)

                                                                     ※△=半角空白


INSERT INTO tbl VALUES(‘                      あいうABC’);   TABLE
                 SQL発行                                      TID       データ
                                                            1        あいうABC
 ①
 3文字単位に                                                     INDEX
 分割(前後にス
                                                                キー      TID
 ペースを追加)

      △△あ
      △あい
      あいう
      いうA
      うAB
      ABC
      BC△
      Copyright © 2013 NTT DATA Corporation                                    16
3.1 どんな動きをするの?(インデックス登録編)

                                                                      ※△=半角空白


INSERT INTO tbl VALUES(‘                      あいうABC’);    TABLE
                 SQL発行                                       TID       データ
                                                             1        あいうABC
 ①                                              ②
 3文字単位に                                         4B以上は3Bに
                                                             INDEX
 分割(前後にス                                        ハッシュ変換
                                                                 キー      TID
 ペースを追加)                                        + ソート
      △△あ                                         CRC1
      △あい                                         CRC2
      あいう                                         CRC3
      いうA                                         CRC4
      うAB                                         CRC5
      ABC                                         ABC
      BC△                                         BC△
      Copyright © 2013 NTT DATA Corporation                                     17
3.1 どんな動きをするの?(インデックス登録編)

                                                                                ※△=半角空白


INSERT INTO tbl VALUES(‘                      あいうABC’);              TABLE
                 SQL発行                                                 TID       データ
                                                                       1        あいうABC
 ①                                              ②
                                                           ③
 3文字単位に                                         4B以上は3Bに
                                                           INT値に変換     INDEX
 分割(前後にス                                        ハッシュ変換
                                                                           キー      TID
 ペースを追加)                                        + ソート
      △△あ                                         CRC1       INT1
      △あい                                         CRC2       INT2
      あいう                                         CRC3       INT3
      いうA                                         CRC4       INT4
      うAB                                         CRC5       INT5
      ABC                                         ABC        1111
      BC△                                         BC△        2222
      Copyright © 2013 NTT DATA Corporation                                               18
3.1 どんな動きをするの?(インデックス登録編)

                                                                                  ※△=半角空白


INSERT INTO tbl VALUES(‘                      あいうABC’);              TABLE
                 SQL発行                                                 TID         データ
                                                                       1          あいうABC
 ①                                              ②
                                                           ③
 3文字単位に                                         4B以上は3Bに
                                                           INT値に変換     INDEX
 分割(前後にス                                        ハッシュ変換
                                                                           キー        TID
 ペースを追加)                                        + ソート
                                                                           INT1      1
      △△あ                                         CRC1       INT1
                                                                           INT2      1
      △あい                                         CRC2       INT2
                                                                           INT3      1
      あいう                                         CRC3       INT3
                                                                           INT4      1
      いうA                                         CRC4       INT4
                                                             INT5          INT5      1
      うAB                                         CRC5
                                                  ABC        1111       1111         1
      ABC
      BC△                                         BC△        2222       2222         1
      Copyright © 2013 NTT DATA Corporation                                                 19
3.2 どんな動きをするの?(インデックス検索編)


                                                                TABLE
                                                                  TID    データ
SELECT * FROM tbl WHERE col1 LIKE                ‘%あいうA%’;
                                                                  1     あいうABC
                                              SQL発行               2     あいうDEF




                                                  INDEX
                                                  キー      TID
                                                  あいう     1,2
                                                  いうA     1
                                                  いうD     2
                                                      :    :
                                                  うAB     1
                                                  うDE     2
                                                      :    :      ※INT値への変換を省いています
      Copyright © 2013 NTT DATA Corporation                                          20
3.2 どんな動きをするの?(インデックス検索編)


                                                                TABLE
                                                                  TID    データ
SELECT * FROM tbl WHERE col1 LIKE                ‘%あいうA%’;
                                                                  1     あいうABC
                                              SQL発行               2     あいうDEF


①
3文字単位に
分割                                                INDEX
                                                  キー      TID
   あいう                                            あいう     1,2
   いうA                                            いうA     1
                                                  いうD     2
                                                      :    :
                                                  うAB     1
                                                  うDE     2
                                                      :    :      ※INT値への変換を省いています
      Copyright © 2013 NTT DATA Corporation                                          21
3.2 どんな動きをするの?(インデックス検索編)


                                                                TABLE
                                                                  TID    データ
SELECT * FROM tbl WHERE col1 LIKE                ‘%あいうA%’;
                                                                  1     あいうABC
                                              SQL発行               2     あいうDEF


①                                                ②
3文字単位に                                           インデックスを検索
分割                                                INDEX
                                                  キー      TID
   あいう                                            あいう     1,2
   いうA                                            いうA     1
                                                  いうD     2
                                                      :    :
                                                  うAB     1
                                                  うDE     2
                                                      :    :      ※INT値への変換を省いています
      Copyright © 2013 NTT DATA Corporation                                          22
3.2 どんな動きをするの?(インデックス検索編)


                                                                        TABLE
                                                                          TID    データ
SELECT * FROM tbl WHERE col1 LIKE                ‘%あいうA%’;
                                                                            1   あいうABC
                                              SQL発行                         2   あいうDEF


①                                                ②              ③
3文字単位に                                           インデックスを検索      TID決定
分割                                                INDEX
                                                  キー      TID
   あいう                                            あいう     1,2
                                                                「あいう」→1,2
   いうA                                            いうA     1     「いうA」→1
                                                  いうD     2     より、TID1
                                                      :    :
                                                  うAB     1
                                                  うDE     2
                                                      :    :              ※INT値への変換を省いています
      Copyright © 2013 NTT DATA Corporation                                                  23
3.2 どんな動きをするの?(インデックス検索編)


                                                                        TABLE
                                                                          TID    データ
SELECT * FROM tbl WHERE col1 LIKE                ‘%あいうA%’;
                                                                            1   あいうABC
                                              SQL発行                         2   あいうDEF


①                                                ②              ③               ④
3文字単位に                                           インデックスを検索      TID決定           Recheck処理
分割                                                INDEX
                                                  キー      TID
   あいう                                            あいう     1,2
                                                                「あいう」→1,2       PostgreSQL内部の
   いうA                                            いうA     1     「いうA」→1
                                                                                Recheck処理行う
                                                  いうD     2     より、TID1
                                                      :    :
                                                  うAB     1
                                                  うDE     2
                                                      :    :              ※INT値への変換を省いています
      Copyright © 2013 NTT DATA Corporation                                                     24
3.3 Recheck処理の必要性


例えばこんな時。。

                                            INDEX
                                              キー    TID
                                             小学校    1
                                                          TABLE
                                             学校長    1
検索ワード:                                                    1   小学校と学校長
                                             学校と    1     :       :
「小学校長」                                          :   :




                                           Recheck処理で再検査!
   Copyright © 2013 NTT DATA Corporation                                25
3.3 Recheck処理の必要性


例えばこんな時。。

                                               INDEX
                                                 キー      TID
                                                小学校      1     TID決定
                                    INDEXを検索                            TABLE
                                                学校長      1
検索ワード:                                                                  1   小学校と学校長
                                                学校と      1              :       :
「小学校長」                                             :     :

                                                「小学校」 : TID1           間違った結果を取ってき
                                                「学校長」 : TID1           てしまう




                                           Recheck処理で再検査!
   Copyright © 2013 NTT DATA Corporation                                              26
3.3 Reckech処理の必要性



                                                   Bitmap Index Scanでは1行検出しているが、
                                                  Rechek処理により間違った結果を排除している
                                                                 ことがわかる。
実際に見てみる。

postgres=# EXPLAIN ANALYZE SELECT * FROM tbl2 WHERE col1 LIKE '%小学校長%';
                                 QUERY PLAN
---------------------------------------------------------


Bitmap Heap Scan on tbl2 (cost=16.00..20.01 rows=1 width=32) (actualtime=0.019..0.019 rows=0   loops=1)

  Recheck Cond: (col1 ~~ '%小学校長%'::text)

                                                                                                 1
  -> Bitmap Index Scan on tbl2idx (cost=0.00..16.00 rows=1 width=0) (actualtime=0.010..0.010 rows=   loops=1)
       Index Cond: (col1 ~~ '%小学校長%'::text)
 Total runtime: 0.046 ms
(5 rows)



        Copyright © 2013 NTT DATA Corporation                                                                   27
4. まとめ




Copyright © 2013 NTT DATA Corporation            28
4. まとめ


 pg_trgmの強み
   pg_trgmを使うことで、全文検索を高速に行う事が出来る。
   contribモジュールに入っているため、メンテナンスを破棄される可能
    性が低い



 pg_trgmの弱み
   二文字以下の検索では効率的なインデックス検索ができない(日本
    語では「本」、「学校」など利用シーンはある)
   日本語対応させるためには、ソース内の設定を変更しなくてはいけ
    ない


  Copyright © 2013 NTT DATA Corporation   29
Copyright © 2011 NTT DATA Corporation




Copyright © 2013 NTT DATA Corporation
(参考)ワイルドカードの有無による検索の挙動の違い


・インデックスに登録するときは先頭に2つ、末尾1つに空白を追加して3文字分割する。
 →”cat”の場合は、”△△c”,”△ca”,”cat”,”at△”

                TID                      データ    キー    TID
                1                        ABC    △△A   1,2
                2                        ABCD
                                                △△X   3
                3                        XABC
                                                △AB   1,2
                                                △XA   3
       ‘△AB’   1,2
 ‘ABC’→ ’ABC’ → 1,2,3 → 1                       ABC   1,2,3
       ‘BC△’    1,3
       ‘△△A’     1,2                            BC△   1,3
                                                BCD   2
                                                CD△   2
 ‘%ABC%’ → ‘ABC’ →1,2,3
                                                XAB   3

 Copyright © 2013 NTT DATA Corporation                        31
(参考)Gin,Gistの更新・構築、検索速度の差


○Ginはなぜ更新・構築が遅い?
→一つのレコード挿入につき、分割した単語分のインデックスを更新する必要があるため。
 (例:1000文字のレコードを1行INSERTするとGINインデックスは最大1000個更新す
る必要がある)
→それに比べ、Gistは一つのレコード挿入につき、インデックスには一つ登録するだけな
ので、Ginに比べると早い。

○Gistはなぜ検索が遅い?
→Gistではインデックスに登録された値と文章が非可逆なため、列候補を挙げた後、再
チェックする必要があります。そのため、検索が遅くなります。




  Copyright © 2013 NTT DATA Corporation           32
(参考)CRC処理のソース

CRC処理のソース部分。
static void
cnt_trigram(trgm *tptr, char *str, int bytelen)
{
   if (bytelen == 3)                            #define INIT_CRC32(crc) ((crc) = 0xFFFFFFFF)
   {                                            #define FIN_CRC32(crc) ((crc) ^= 0xFFFFFFFF)
       CPTRGM(tptr, str);                       #define COMP_CRC32(crc, data, len)¥
   }                                            do { ¥
   else
                                                const unsigned char *__data = (const unsigned char *)(data); ¥
                                                uint32 __len = (len); ¥
   {
                                                 ¥
       pg_crc32 crc;
                                                 while (__len-- > 0) ¥
                                                 {¥
        INIT_CRC32(crc);
                                                 int __tab_index = ((int) ((crc) >> 24) ^ *__data++) & 0xFF; ¥
        COMP_CRC32(crc, str, bytelen);           (crc) = pg_crc32_table[__tab_index] ^ ((crc) << 8); ¥
        FIN_CRC32(crc);                          }¥
                                                } while (0)
        /*
         * use only 3 upper bytes from crc, hope, it's good enough hashing
         */
        CPTRGM(tptr, &crc);
    }
}

        Copyright © 2013 NTT DATA Corporation                                                                    33
(参考)KEEPONLYALNUMをコメントアウトしなかったら
○trgm_op.cのソースの一部
#ifdef KEEPONLYALNUM
#define iswordchr(c) (t_isalpha(c) || t_isdigit(c))       ←英数字の時にTrue
#else
#define iswordchr(c) (!t_isspace(c))                      ←スペースでないときにTrue
#endif
static char *
○trgm_gin.cのソースの一部(データから空白を除いて文字の塊を見つけるところ。例:’today is sunny’→’today’,’is’,’sunny’)
find_word(char *str, int lenstr, char **endword, int *charlen)
{
    char      *beginword = str;

    while (beginword - str < lenstr && !iswordchr(beginword))
        beginword += pg_mblen(beginword);
    if (beginword - str >= lenstr)
        return NULL;
    *endword = beginword;
    *charlen = 0;
    while (*endword - str < lenstr && iswordchr(*endword))
    {
        *endword += pg_mblen(*endword);
        (*charlen)++;
    }

    return beginword;
}

        Copyright © 2013 NTT DATA Corporation                                         34

More Related Content

What's hot

PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションMasahiko Sawada
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)NTT DATA Technology & Innovation
 
CRDT in 15 minutes
CRDT in 15 minutesCRDT in 15 minutes
CRDT in 15 minutesShingo Omura
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)NTT DATA Technology & Innovation
 
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...NTT DATA Technology & Innovation
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...NTT DATA Technology & Innovation
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私Atsushi Odagiri
 
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないCarnot Inc.
 
Pythonでキャッシュを活用する話①
Pythonでキャッシュを活用する話①Pythonでキャッシュを活用する話①
Pythonでキャッシュを活用する話①iPride Co., Ltd.
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみたSatoshi Sato
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)NTT DATA Technology & Innovation
 
データサイエンスことはじめ
データサイエンスことはじめデータサイエンスことはじめ
データサイエンスことはじめ大貴 末廣
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャKohei KaiGai
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方Satoshi Nagayasu
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)NTT DATA Technology & Innovation
 
Pythonによる機械学習実験の管理
Pythonによる機械学習実験の管理Pythonによる機械学習実験の管理
Pythonによる機械学習実験の管理Toshihiro Kamishima
 

What's hot (20)

PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
 
CRDT in 15 minutes
CRDT in 15 minutesCRDT in 15 minutes
CRDT in 15 minutes
 
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
JavaでCPUを使い倒す! ~Java 9 以降の CPU 最適化を覗いてみる~(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
 
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
 
Pythonとパッケージングと私
Pythonとパッケージングと私Pythonとパッケージングと私
Pythonとパッケージングと私
 
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くないChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くない
 
Pythonでキャッシュを活用する話①
Pythonでキャッシュを活用する話①Pythonでキャッシュを活用する話①
Pythonでキャッシュを活用する話①
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
押さえておきたい、PostgreSQL 13 の新機能!! (PostgreSQL Conference Japan 2020講演資料)
 
データサイエンスことはじめ
データサイエンスことはじめデータサイエンスことはじめ
データサイエンスことはじめ
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方PostgreSQL - C言語によるユーザ定義関数の作り方
PostgreSQL - C言語によるユーザ定義関数の作り方
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
Pythonによる機械学習実験の管理
Pythonによる機械学習実験の管理Pythonによる機械学習実験の管理
Pythonによる機械学習実験の管理
 
pg_dbms_statsの紹介
pg_dbms_statsの紹介pg_dbms_statsの紹介
pg_dbms_statsの紹介
 
使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan
 

Viewers also liked

pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみpg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみMasahiko Sawada
 
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー) #jpug
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー)  #jpugAmazon RDS for PostgreSQL ( JPUG 2014夏セミナー)  #jpug
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー) #jpugYasuhiro Matsuo
 
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介Ryuichiro Munechika
 
Pgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwPgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwToshi Harada
 
みんな大好き“全文検索 on AWS”を試してみました!
みんな大好き“全文検索 on AWS”を試してみました!みんな大好き“全文検索 on AWS”を試してみました!
みんな大好き“全文検索 on AWS”を試してみました!宗 大栗
 
Imaging mimics of sacroiliitis dr m.abdelbaky
Imaging mimics of sacroiliitis   dr m.abdelbaky Imaging mimics of sacroiliitis   dr m.abdelbaky
Imaging mimics of sacroiliitis dr m.abdelbaky Mohammad Abdelbaky
 
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成Hiroshi Yamaguchi
 
Planificacion de auditoria
Planificacion de auditoriaPlanificacion de auditoria
Planificacion de auditoriaRafael Contreras
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)Uptime Technologies LLC (JP)
 
Social Media Marketing for Professional Services
Social Media Marketing for Professional ServicesSocial Media Marketing for Professional Services
Social Media Marketing for Professional ServicesJeff Bullas
 
NO FUE EL FUEGO, FUE EL FEMICIDIO ESTATAL
NO FUE EL FUEGO, FUE EL FEMICIDIO ESTATALNO FUE EL FUEGO, FUE EL FEMICIDIO ESTATAL
NO FUE EL FUEGO, FUE EL FEMICIDIO ESTATALCasa de la Mujer
 
サーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalkサーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalkHirokazu Ouchi
 
120105040 panduan-kawad-krs-dan-tkrs
120105040 panduan-kawad-krs-dan-tkrs120105040 panduan-kawad-krs-dan-tkrs
120105040 panduan-kawad-krs-dan-tkrsZamri Talib
 
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)Masahiko Sawada
 
Mentes colonizadas promoción de charla
Mentes colonizadas promoción de charlaMentes colonizadas promoción de charla
Mentes colonizadas promoción de charlaRafael Contreras
 
Automotive Space business network 2017 (ita)_rev. 1
Automotive Space business network  2017 (ita)_rev. 1Automotive Space business network  2017 (ita)_rev. 1
Automotive Space business network 2017 (ita)_rev. 1Automotive Space
 

Viewers also liked (20)

pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみpg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
pg_bigm(ピージーバイグラム)を用いた全文検索のしくみ
 
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー) #jpug
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー)  #jpugAmazon RDS for PostgreSQL ( JPUG 2014夏セミナー)  #jpug
Amazon RDS for PostgreSQL ( JPUG 2014夏セミナー) #jpug
 
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
Incoming PostgreSQL 9.4 次バージョンの新機能をご紹介
 
Pgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwPgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdw
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
みんな大好き“全文検索 on AWS”を試してみました!
みんな大好き“全文検索 on AWS”を試してみました!みんな大好き“全文検索 on AWS”を試してみました!
みんな大好き“全文検索 on AWS”を試してみました!
 
Imaging mimics of sacroiliitis dr m.abdelbaky
Imaging mimics of sacroiliitis   dr m.abdelbaky Imaging mimics of sacroiliitis   dr m.abdelbaky
Imaging mimics of sacroiliitis dr m.abdelbaky
 
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
VisualSFMとMeshLabとCloudCompareによるドローン撮影画像を用いたデジタル地図作成
 
Planificacion de auditoria
Planificacion de auditoriaPlanificacion de auditoria
Planificacion de auditoria
 
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦
 
PostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラPostgreSQLの運用・監視にまつわるエトセトラ
PostgreSQLの運用・監視にまつわるエトセトラ
 
Social Media Marketing for Professional Services
Social Media Marketing for Professional ServicesSocial Media Marketing for Professional Services
Social Media Marketing for Professional Services
 
NO FUE EL FUEGO, FUE EL FEMICIDIO ESTATAL
NO FUE EL FUEGO, FUE EL FEMICIDIO ESTATALNO FUE EL FUEGO, FUE EL FEMICIDIO ESTATAL
NO FUE EL FUEGO, FUE EL FEMICIDIO ESTATAL
 
サーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalkサーバ構築・デプロイが簡単に!Elastic beanstalk
サーバ構築・デプロイが簡単に!Elastic beanstalk
 
120105040 panduan-kawad-krs-dan-tkrs
120105040 panduan-kawad-krs-dan-tkrs120105040 panduan-kawad-krs-dan-tkrs
120105040 panduan-kawad-krs-dan-tkrs
 
Process design
Process designProcess design
Process design
 
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
 
Mentes colonizadas promoción de charla
Mentes colonizadas promoción de charlaMentes colonizadas promoción de charla
Mentes colonizadas promoción de charla
 
Automotive Space business network 2017 (ita)_rev. 1
Automotive Space business network  2017 (ita)_rev. 1Automotive Space business network  2017 (ita)_rev. 1
Automotive Space business network 2017 (ita)_rev. 1
 

Similar to pg_trgmと全文検索

20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望
20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望
20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望kulibrarians
 
演劇脚本2010
演劇脚本2010演劇脚本2010
演劇脚本2010kenji sakuma
 
第3回レポート windows8 既存アプリ調査
第3回レポート windows8 既存アプリ調査第3回レポート windows8 既存アプリ調査
第3回レポート windows8 既存アプリ調査Shinpei Niiyama
 
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―Hisao Soyama
 
招待券 裏面 1003
招待券 裏面 1003招待券 裏面 1003
招待券 裏面 1003libraryfair
 

Similar to pg_trgmと全文検索 (6)

20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望
20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望
20071129 ku-librarians勉強会 #94:教育・学習方法の変貌と図書館:同志社大学からみた近未来展望
 
演劇脚本2010
演劇脚本2010演劇脚本2010
演劇脚本2010
 
第3回レポート windows8 既存アプリ調査
第3回レポート windows8 既存アプリ調査第3回レポート windows8 既存アプリ調査
第3回レポート windows8 既存アプリ調査
 
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―
Pythonによるソーシャルデータ分析―わたしはこうやって修士号を取得しました―
 
Syoutai ura
Syoutai uraSyoutai ura
Syoutai ura
 
招待券 裏面 1003
招待券 裏面 1003招待券 裏面 1003
招待券 裏面 1003
 

More from Masahiko Sawada

PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説Masahiko Sawada
 
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...Masahiko Sawada
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報Masahiko Sawada
 
Transparent Data Encryption in PostgreSQL
Transparent Data Encryption in PostgreSQLTransparent Data Encryption in PostgreSQL
Transparent Data Encryption in PostgreSQLMasahiko Sawada
 
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -Masahiko Sawada
 
Transparent Data Encryption in PostgreSQL and Integration with Key Management...
Transparent Data Encryption in PostgreSQL and Integration with Key Management...Transparent Data Encryption in PostgreSQL and Integration with Key Management...
Transparent Data Encryption in PostgreSQL and Integration with Key Management...Masahiko Sawada
 
Bloat and Fragmentation in PostgreSQL
Bloat and Fragmentation in PostgreSQLBloat and Fragmentation in PostgreSQL
Bloat and Fragmentation in PostgreSQLMasahiko Sawada
 
Database Encryption and Key Management for PostgreSQL - Principles and Consid...
Database Encryption and Key Management for PostgreSQL - Principles and Consid...Database Encryption and Key Management for PostgreSQL - Principles and Consid...
Database Encryption and Key Management for PostgreSQL - Principles and Consid...Masahiko Sawada
 
今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説Masahiko Sawada
 
Vacuum more efficient than ever
Vacuum more efficient than everVacuum more efficient than ever
Vacuum more efficient than everMasahiko Sawada
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウトMasahiko Sawada
 
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~Masahiko Sawada
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説Masahiko Sawada
 
FDW-based Sharding Update and Future
FDW-based Sharding Update and FutureFDW-based Sharding Update and Future
FDW-based Sharding Update and FutureMasahiko Sawada
 
What’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributorWhat’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributorMasahiko Sawada
 
PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介Masahiko Sawada
 
Introduction VAUUM, Freezing, XID wraparound
Introduction VAUUM, Freezing, XID wraparoundIntroduction VAUUM, Freezing, XID wraparound
Introduction VAUUM, Freezing, XID wraparoundMasahiko Sawada
 

More from Masahiko Sawada (20)

PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...行ロックと「LOG:  process 12345 still waiting for ShareLock on transaction 710 afte...
行ロックと「LOG: process 12345 still waiting for ShareLock on transaction 710 afte...
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
Transparent Data Encryption in PostgreSQL
Transparent Data Encryption in PostgreSQLTransparent Data Encryption in PostgreSQL
Transparent Data Encryption in PostgreSQL
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -
OSS活動のやりがいとそれから得たもの - PostgreSQLコミュニティにて -
 
Transparent Data Encryption in PostgreSQL and Integration with Key Management...
Transparent Data Encryption in PostgreSQL and Integration with Key Management...Transparent Data Encryption in PostgreSQL and Integration with Key Management...
Transparent Data Encryption in PostgreSQL and Integration with Key Management...
 
Bloat and Fragmentation in PostgreSQL
Bloat and Fragmentation in PostgreSQLBloat and Fragmentation in PostgreSQL
Bloat and Fragmentation in PostgreSQL
 
Database Encryption and Key Management for PostgreSQL - Principles and Consid...
Database Encryption and Key Management for PostgreSQL - Principles and Consid...Database Encryption and Key Management for PostgreSQL - Principles and Consid...
Database Encryption and Key Management for PostgreSQL - Principles and Consid...
 
今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説今秋リリース予定のPostgreSQL11を徹底解説
今秋リリース予定のPostgreSQL11を徹底解説
 
Vacuum more efficient than ever
Vacuum more efficient than everVacuum more efficient than ever
Vacuum more efficient than ever
 
Vacuumとzheap
VacuumとzheapVacuumとzheap
Vacuumとzheap
 
Parallel Vacuum
Parallel VacuumParallel Vacuum
Parallel Vacuum
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
OSS 開発ってどうやっているの? ~ PostgreSQL の現場から~
 
PostgreSQL10徹底解説
PostgreSQL10徹底解説PostgreSQL10徹底解説
PostgreSQL10徹底解説
 
FDW-based Sharding Update and Future
FDW-based Sharding Update and FutureFDW-based Sharding Update and Future
FDW-based Sharding Update and Future
 
What’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributorWhat’s new in 9.6, by PostgreSQL contributor
What’s new in 9.6, by PostgreSQL contributor
 
PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介
 
Introduction VAUUM, Freezing, XID wraparound
Introduction VAUUM, Freezing, XID wraparoundIntroduction VAUUM, Freezing, XID wraparound
Introduction VAUUM, Freezing, XID wraparound
 

pg_trgmと全文検索

  • 1. つかってみよう”pg_trgm” やってみよう”全文検索” 2013年2月16日 株式会社NTTデータ 基盤システム事業本部 澤田 雅彦 Copyright © 2013 NTT DATA Corporation
  • 2. INDEX 01 全文検索とは? 02 pg_trgmってなに? 03 pg_trgmの動きを見てみよう 04 まとめ Copyright © 2013NTT DATA Corporation 2
  • 3. 1. 全文検索とは? Copyright © 2013 NTT DATA Corporation 3
  • 4. 1.1 全文検索ってなに? 全文検索ってなに?  複数にまたがるテキストからキーワードを含むテキストを見つけ出す事 東京都・・・・ キーワード ・・・・・・・・ 東京都・・・・ ・・・・・・・・・図書館・・・・ 「オープンソース」 ・・・・・・・・ ・・・・・・・・ ・・・・・・・・・図書館・・・・ 東京都で・・・・ ・・・・・・・・・・・・ ・・・・・・・・ ・・・・・・・・ 東京都・・・・ ・・オープンソース・・・ ・・・・・・・・ ・・・・・・・・・・・・ ・・・・・・ ・・・データベース・・・ ・・オープンソース・・・ ・・・・・・・・・図書館・・・・ ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ ・・・・・・・・ ・・・・・ 全文検索 ・・・・・・・・・・・・ ・・・・・・・・本。 ・・・・・・・・・・・・ ・・・・・ ・・・・・ ・学校・・・・・・・・・ ・・・・・・・・本。 オープンソース ・・ ・・・・・・・・ ・・・ ・学校・・・・・・・・・ ・・・・・・・・ ・・・・・ ・・・・・・・・本。 ・学校・・・・・・・・・ Copyright © 2013 NTT DATA Corporation 4
  • 5. 1.2 DBの全文検索ってなに?  テキスト型の列を持つテーブルから、キーワードを含むレコードを検索すること  一般的に、「全文検索機能がある」といえば、高速にできることを表す  しかし、全文検索ではBtree等のインデックスを使用できないため遅い!  なので、ツールを用いてインデックスを張る必要がある  全文検索を実現するには。。。  N-gram方式、形態素解析方式がある キーワード:「オープンソース」 DB SQL発行 : : Copyright © 2013 NTT DATA Corporation 5
  • 6. 1.3 N-gram解析と形態素解析 形態素解析 N-gram方式 分割方法 単語単位で分割 文字単位で分割 インデックスサ ○(単語単位) ×(分割数が多いため) イズ 表記の揺れ ○(類義語を定義しやすい) △(表記の揺れに弱い) △(単語の分割精度に依存す 検索結果 ○(LIKEに近い検索結果になる) る) どういう時に使 整った文章(論文等)を扱う時 記号や造語を検索する時 える? 例)文字列‘今日は寒天の日’ではどうなる? (3-gramの場合) キーワード 「今日」,「寒天」,「日」 「今日は」,「日は寒」,「は寒天」, 「寒天の」,「天の日」 Copyright © 2013 NTT DATA Corporation 6
  • 7. 1.4 PostgreSQLで全文検索でインデックスを使うためのモジュール pg_trgm textsearch_senna textsearch_ja 解析方式 3-gram N-gram 形態素解析 対応バージョン 9.1以降 8.2以降 8.3以降 提供形態 contribモジュール 外部ツール 外部ツール 開発主体 PostgreSQLコミュニティ 板垣さん(個人) 板垣さん(個人) なし Mecab 依存モジュール Senna (PostgreSQLのGin、GiSTを利用) (PostgreSQLのGin、GiSTを利用) レプリケーション対応 ○ × ○ リカバリ対応 ○ × ○ △(ソース内を再設定しないと 日本語対応 ○ ○ いけない) 以下、pg_trgmを扱っていきます Copyright © 2013 NTT DATA Corporation 7
  • 8. 2. pg_trgmとは? Copyright © 2013 NTT DATA Corporation 8
  • 9. 2.1 pg_trgmとは  全文検索はPostgreSQL9.1から対応  contribモジュールとして提供  3-gram方式  GIN,GiSTインデックスに対応  レプリケーション・リカバリに対応 名前 検索 構築・更新 GIN 汎用転置インデックス 速い 遅い GiST 汎用検索ツリー 遅い 速い Copyright © 2013 NTT DATA Corporation 9
  • 10. 2.2 インストール方法 インストール方法 $ cd $PGSRC/contrib/pg_trgm 【ビルド時の注意】 日本語対応させるためには。。。 trgm.hの #define KEEPONLYALNUM を必ずコメントアウトする! $ make $ make install Copyright © 2013 NTT DATA Corporation 10
  • 11. 2.3 動作確認 postgres=# CREATE EXTENSION pg_trgm; postgres=# CREATE TABLE tbl (col1 text); postgres=# CREATE INDEX idx on tbl USING gin (col1 gin_trgm_ops); ←INDEX作成 postgres=# INSERT INTO tbl VALUES ('test'); postgres=# EXPLAIN SELECT * FROM tbl WHERE col1 LIKE '%test%'; QUERY PLAN ----------------------------------------------------------- --------- Bitmap Heap Scan on tbl (cost=16.16..26.43 rows=21 width=32) Recheck Cond: (col1 ~~ '%test%'::text) -> Bitmap Index Scan on idx (cost=0.00..16.16 rows=21 width=0) Index Cond: (col1 ~~ '%test%'::text) (4 rows) Copyright © 2013 NTT DATA Corporation 11
  • 12. 2.4 インデックスを使ったとき、使わなかったとき 10万件のデータの中から、少量のデータを取り出すケースで検証。 インデックス使用 postgres=# EXPLAIN ANALYZE SELECT * FROM tbl WHERE col1 LIKE '%京都府%'; QUERY PLAN --------------------------------------------------------------- Bitmap Heap Scan on tbl (cost=20.08..55.53 rows=10 width=32) (actual time=0.021..0.022 rows=3 loops=1) Recheck Cond: (col1 ~~ '%京都府%'::text) -> Bitmap Index Scan on idx (cost=0.00..20.07 rows=10 width=0) (actual time=0.013..0.013 rows=3 loops=1) Index Cond: (col1 ~~ '%京都府%'::text) Total runtime: 0.051 ms インデックス不使用 400倍以上の差 postgres=# EXPLAIN ANALYZE SELECT * FROM tbl WHERE col1 LIKE '%京都府%'; QUERY PLAN --------------------------------------------------------------- Seq Scan on tbl (cost=0.00..1662.00 rows=10 width=32) (actual time=22.282..22.284 rows=3 loops=1) Filter: (col1 ~~ '%京都府%'::text) Total runtime: 22.303 ms Copyright © 2013 NTT DATA Corporation 12
  • 13. 2.5 2文字以下の検索  pg_trgmは、3文字単位で区切るため、2文字以下の検索ではインデックスを効率的に使 えない。  逆にインデックスを使うと「Bitmapの全件アクセス」になるため、SeqScanより遅い。  英語の全文検索では1,2文字はストップワード(inやa)であることが多いので問題な いのかも。。  しかし日本語では「本」、「学校」など1,2文字で全文検索をする可能性は十分ある! postgres=# EXPLAIN ANALYZE SELECT * FROM tbl WHERE col1 LIKE '%京%'; インデックス使用 QUERY PLAN ----------------------------------------------------------------------------------------------------- Bitmap Heap Scan on tbl (cost=938.92..2600.80 rows=99990 width=32) (actual time=96.956..139.761 rows=10000 3 loops=1) Recheck Cond: (col1 ~~ '%京%'::text) -> Bitmap Index Scan on idx (cost=0.00..913.92 rows=99990 width=0) (actual time=96.874..96.874 rows=1000 03 loops=1) Index Cond: (col1 ~~ '%京%'::text) Total runtime: 160.489 ms (5 rows) インデックスを使った方が遅い postgres=# EXPLAIN ANALYZE SELECT * tbl WHERE col1 LIKE '%京%'; インデックス不使用 QUERY PLAN ---------------------------------------------------------------------------------------------------- Seq Scan on tbl (cost=0.00..1662.00 rows=99990 width=32) (actual time=0.014..40.286 rows=100003 loops=1) Filter: (col1 ~~ '%京%'::text) Total runtime: 59.661 ms (3 rows) Copyright © 2013 NTT DATA Corporation 13
  • 15. 3.1 どんな動きをするの?(インデックス登録編) ※△=半角空白 INSERT INTO tbl VALUES(‘ あいうABC’); TABLE SQL発行 TID データ 1 あいうABC INDEX キー TID Copyright © 2013 NTT DATA Corporation 15
  • 16. 3.1 どんな動きをするの?(インデックス登録編) ※△=半角空白 INSERT INTO tbl VALUES(‘ あいうABC’); TABLE SQL発行 TID データ 1 あいうABC ① 3文字単位に INDEX 分割(前後にス キー TID ペースを追加) △△あ △あい あいう いうA うAB ABC BC△ Copyright © 2013 NTT DATA Corporation 16
  • 17. 3.1 どんな動きをするの?(インデックス登録編) ※△=半角空白 INSERT INTO tbl VALUES(‘ あいうABC’); TABLE SQL発行 TID データ 1 あいうABC ① ② 3文字単位に 4B以上は3Bに INDEX 分割(前後にス ハッシュ変換 キー TID ペースを追加) + ソート △△あ CRC1 △あい CRC2 あいう CRC3 いうA CRC4 うAB CRC5 ABC ABC BC△ BC△ Copyright © 2013 NTT DATA Corporation 17
  • 18. 3.1 どんな動きをするの?(インデックス登録編) ※△=半角空白 INSERT INTO tbl VALUES(‘ あいうABC’); TABLE SQL発行 TID データ 1 あいうABC ① ② ③ 3文字単位に 4B以上は3Bに INT値に変換 INDEX 分割(前後にス ハッシュ変換 キー TID ペースを追加) + ソート △△あ CRC1 INT1 △あい CRC2 INT2 あいう CRC3 INT3 いうA CRC4 INT4 うAB CRC5 INT5 ABC ABC 1111 BC△ BC△ 2222 Copyright © 2013 NTT DATA Corporation 18
  • 19. 3.1 どんな動きをするの?(インデックス登録編) ※△=半角空白 INSERT INTO tbl VALUES(‘ あいうABC’); TABLE SQL発行 TID データ 1 あいうABC ① ② ③ 3文字単位に 4B以上は3Bに INT値に変換 INDEX 分割(前後にス ハッシュ変換 キー TID ペースを追加) + ソート INT1 1 △△あ CRC1 INT1 INT2 1 △あい CRC2 INT2 INT3 1 あいう CRC3 INT3 INT4 1 いうA CRC4 INT4 INT5 INT5 1 うAB CRC5 ABC 1111 1111 1 ABC BC△ BC△ 2222 2222 1 Copyright © 2013 NTT DATA Corporation 19
  • 20. 3.2 どんな動きをするの?(インデックス検索編) TABLE TID データ SELECT * FROM tbl WHERE col1 LIKE ‘%あいうA%’; 1 あいうABC SQL発行 2 あいうDEF INDEX キー TID あいう 1,2 いうA 1 いうD 2 : : うAB 1 うDE 2 : : ※INT値への変換を省いています Copyright © 2013 NTT DATA Corporation 20
  • 21. 3.2 どんな動きをするの?(インデックス検索編) TABLE TID データ SELECT * FROM tbl WHERE col1 LIKE ‘%あいうA%’; 1 あいうABC SQL発行 2 あいうDEF ① 3文字単位に 分割 INDEX キー TID あいう あいう 1,2 いうA いうA 1 いうD 2 : : うAB 1 うDE 2 : : ※INT値への変換を省いています Copyright © 2013 NTT DATA Corporation 21
  • 22. 3.2 どんな動きをするの?(インデックス検索編) TABLE TID データ SELECT * FROM tbl WHERE col1 LIKE ‘%あいうA%’; 1 あいうABC SQL発行 2 あいうDEF ① ② 3文字単位に インデックスを検索 分割 INDEX キー TID あいう あいう 1,2 いうA いうA 1 いうD 2 : : うAB 1 うDE 2 : : ※INT値への変換を省いています Copyright © 2013 NTT DATA Corporation 22
  • 23. 3.2 どんな動きをするの?(インデックス検索編) TABLE TID データ SELECT * FROM tbl WHERE col1 LIKE ‘%あいうA%’; 1 あいうABC SQL発行 2 あいうDEF ① ② ③ 3文字単位に インデックスを検索 TID決定 分割 INDEX キー TID あいう あいう 1,2 「あいう」→1,2 いうA いうA 1 「いうA」→1 いうD 2 より、TID1 : : うAB 1 うDE 2 : : ※INT値への変換を省いています Copyright © 2013 NTT DATA Corporation 23
  • 24. 3.2 どんな動きをするの?(インデックス検索編) TABLE TID データ SELECT * FROM tbl WHERE col1 LIKE ‘%あいうA%’; 1 あいうABC SQL発行 2 あいうDEF ① ② ③ ④ 3文字単位に インデックスを検索 TID決定 Recheck処理 分割 INDEX キー TID あいう あいう 1,2 「あいう」→1,2 PostgreSQL内部の いうA いうA 1 「いうA」→1 Recheck処理行う いうD 2 より、TID1 : : うAB 1 うDE 2 : : ※INT値への変換を省いています Copyright © 2013 NTT DATA Corporation 24
  • 25. 3.3 Recheck処理の必要性 例えばこんな時。。 INDEX キー TID 小学校 1 TABLE 学校長 1 検索ワード: 1 小学校と学校長 学校と 1 : : 「小学校長」 : : Recheck処理で再検査! Copyright © 2013 NTT DATA Corporation 25
  • 26. 3.3 Recheck処理の必要性 例えばこんな時。。 INDEX キー TID 小学校 1 TID決定 INDEXを検索 TABLE 学校長 1 検索ワード: 1 小学校と学校長 学校と 1 : : 「小学校長」 : : 「小学校」 : TID1 間違った結果を取ってき 「学校長」 : TID1 てしまう Recheck処理で再検査! Copyright © 2013 NTT DATA Corporation 26
  • 27. 3.3 Reckech処理の必要性 Bitmap Index Scanでは1行検出しているが、 Rechek処理により間違った結果を排除している ことがわかる。 実際に見てみる。 postgres=# EXPLAIN ANALYZE SELECT * FROM tbl2 WHERE col1 LIKE '%小学校長%'; QUERY PLAN --------------------------------------------------------- Bitmap Heap Scan on tbl2 (cost=16.00..20.01 rows=1 width=32) (actualtime=0.019..0.019 rows=0 loops=1) Recheck Cond: (col1 ~~ '%小学校長%'::text) 1 -> Bitmap Index Scan on tbl2idx (cost=0.00..16.00 rows=1 width=0) (actualtime=0.010..0.010 rows= loops=1) Index Cond: (col1 ~~ '%小学校長%'::text) Total runtime: 0.046 ms (5 rows) Copyright © 2013 NTT DATA Corporation 27
  • 28. 4. まとめ Copyright © 2013 NTT DATA Corporation 28
  • 29. 4. まとめ  pg_trgmの強み  pg_trgmを使うことで、全文検索を高速に行う事が出来る。  contribモジュールに入っているため、メンテナンスを破棄される可能 性が低い  pg_trgmの弱み  二文字以下の検索では効率的なインデックス検索ができない(日本 語では「本」、「学校」など利用シーンはある)  日本語対応させるためには、ソース内の設定を変更しなくてはいけ ない Copyright © 2013 NTT DATA Corporation 29
  • 30. Copyright © 2011 NTT DATA Corporation Copyright © 2013 NTT DATA Corporation
  • 31. (参考)ワイルドカードの有無による検索の挙動の違い ・インデックスに登録するときは先頭に2つ、末尾1つに空白を追加して3文字分割する。 →”cat”の場合は、”△△c”,”△ca”,”cat”,”at△” TID データ キー TID 1 ABC △△A 1,2 2 ABCD △△X 3 3 XABC △AB 1,2 △XA 3 ‘△AB’ 1,2 ‘ABC’→ ’ABC’ → 1,2,3 → 1 ABC 1,2,3 ‘BC△’ 1,3 ‘△△A’ 1,2 BC△ 1,3 BCD 2 CD△ 2 ‘%ABC%’ → ‘ABC’ →1,2,3 XAB 3 Copyright © 2013 NTT DATA Corporation 31
  • 33. (参考)CRC処理のソース CRC処理のソース部分。 static void cnt_trigram(trgm *tptr, char *str, int bytelen) { if (bytelen == 3) #define INIT_CRC32(crc) ((crc) = 0xFFFFFFFF) { #define FIN_CRC32(crc) ((crc) ^= 0xFFFFFFFF) CPTRGM(tptr, str); #define COMP_CRC32(crc, data, len)¥ } do { ¥ else const unsigned char *__data = (const unsigned char *)(data); ¥ uint32 __len = (len); ¥ { ¥ pg_crc32 crc; while (__len-- > 0) ¥ {¥ INIT_CRC32(crc); int __tab_index = ((int) ((crc) >> 24) ^ *__data++) & 0xFF; ¥ COMP_CRC32(crc, str, bytelen); (crc) = pg_crc32_table[__tab_index] ^ ((crc) << 8); ¥ FIN_CRC32(crc); }¥ } while (0) /* * use only 3 upper bytes from crc, hope, it's good enough hashing */ CPTRGM(tptr, &crc); } } Copyright © 2013 NTT DATA Corporation 33
  • 34. (参考)KEEPONLYALNUMをコメントアウトしなかったら ○trgm_op.cのソースの一部 #ifdef KEEPONLYALNUM #define iswordchr(c) (t_isalpha(c) || t_isdigit(c)) ←英数字の時にTrue #else #define iswordchr(c) (!t_isspace(c)) ←スペースでないときにTrue #endif static char * ○trgm_gin.cのソースの一部(データから空白を除いて文字の塊を見つけるところ。例:’today is sunny’→’today’,’is’,’sunny’) find_word(char *str, int lenstr, char **endword, int *charlen) { char *beginword = str; while (beginword - str < lenstr && !iswordchr(beginword)) beginword += pg_mblen(beginword); if (beginword - str >= lenstr) return NULL; *endword = beginword; *charlen = 0; while (*endword - str < lenstr && iswordchr(*endword)) { *endword += pg_mblen(*endword); (*charlen)++; } return beginword; } Copyright © 2013 NTT DATA Corporation 34