SlideShare ist ein Scribd-Unternehmen logo
1 von 36
Downloaden Sie, um offline zu lesen
textsearch_jaで全文検索

             日本PostgreSQLユーザ会
                 北海道支部
           株式会社サイクル・オブ・フィフス
                  石田朗雄



09/06/20
自己紹介
 ●   id:iakio
      ●    http://postgresql.g.hatena.ne.jp/iakio/
      ●    今日の資料とデモのソースコードは公開します




09/06/20
自己紹介
 ●    代表作
        ●     SQLでボウリングのスコアを計算
 with recursive
 s(idx, pins1, pins2, pins3) as (
      select s1.idx, s1.pins, s2.pins, s3.pins
        from score s1
        left join score s2 on (s2.idx = s1.idx + 1)
        left join score s3 on (s3.idx = s1.idx + 2)
 ),
 f(idx, pins1, pins2, pins3) as (
      select idx, pins1, pins2, pins3 from s where idx = 1
       union all
      select s.idx, s.pins1, s.pins2, s.pins3
        from s join f
          on (s.idx = f.idx + case when f.pins1 = 10 then 1 else 2 end)
 ),
 sof(idx, pins1, pins2, pins3, score_of_frame) as (
      select idx
           , pins1, pins2, pins3
           , case when pins1 = 10 then pins1 + pins2 + pins3
                   when pins1 + pins2 = 10 then pins1 + pins2 + pins3
                   else pins1 + pins2
              end as score_of_frame
             from f
 )
 select row_number( ) over w as frame
       , pins1
       , pins2
       , case row_number( ) over w when 10 then pins3
         else null end as pins3
       , score_of_frame
       , sum(score_of_frame) over w
    from sof
 window w as (order by idx)



09/06/20
告知など
 ●   PostgreSQL的な話
      ●    8.4RC1が6/14に出ました
 ●   JPUG北海道支部的な話
      ●    5/13に勉強会を開催
      ●    次は7/8?
 ●   JPUG的な話
      ●    JPUG 10th Anniversary Conference(11/20~21)




09/06/20
PostgreSQLと全文検索




09/06/20
PostgreSQLでの全文検索
 ●   PostgreSQL8.2以前
      ●    contrib/tsearch2
 ●   PostgreSQL8.3
      ●    全文検索機能が本体に含まれるようになった。
      ●    日本語は未対応
 ●   textsearch_ja
      ●    日本語で全文検索を行なうための拡張モジュール
      ●    http://textsearch-ja.projects.postgresql.org/
      ●    textsearch_sennaの話は今日はありません




09/06/20
資料に自信が無いので
            とりあえずデモ




09/06/20
デモの構成
 ●   PostgreSQL 8.4RC1(8.3でも同じです)
 ●   データベースエンコーディングはutf-8
 ●   PostgreSQLのドキュメントを格納したテーブル(html)
 ●   レコード数:900くらい
 ●   詳しくはブースで!!
 => d docs_en

  カラム |       型     |
 --------+----------+------------
  id     | integer |
  path   | text     |
  title | text      |
  body   | text     |

09/06/20
とりあえず検索する方法




09/06/20
方法1:関数インデックス
 ●   インデックスを1つ作るだけで高速な全文検索ができ
     る

 => SELECT title FROM docs_en WHERE body ILIKE '%search%';




 インデックス作成
 => CREATE INDEX docs_en_idx ON docs_en
   USING GIN(to_tsvector('english', body));
 CREATE INDEX

 検索
 => SELECT title FROM docs_en WHERE
   to_tsvector('english', body) @@ to_tsquery('english', 'search');

09/06/20
全文検索の基本
 ●   tsvector、tsqueryはそれぞれデータ型
 ●   to_tsvector、(plain)to_tsqueryはtext型をtsvector、
     tsqueryに変換する関数



                 tsvector @@ tsquery
                (検索対象) (検索式)
                   => True / False



09/06/20
方法2:tsvector用の列を追加
 ●   高速。特にスコアによるソートをする場合
 ●   本文が更新された時にtsvectorは自動的に更新されな
     い(トリガやバッチを使う必要がある)
 ●   容量は大きくなる


 => ALTER TABLE docs_en ADD vec tsvector;
 ALTER TABLE
 => UPDATE docs_en SET vec = to_tsvector('english', body);
 UPDATE 936
 => CREATE INDEX docs_en_idx2 ON docs_en USING GIN(vec);
 CREATE INDEX

 検索
 => SELECT title FROM docs_en WHERE vec @@ to_tsquery('english', 'search');

09/06/20
LIKEと全文検索の違い

                                   => select count(*) from docs_en
 => select count(*) from docs_en    where to_tsvector('english', body)
  where body ilike '%html%';        @@ to_tsquery('html');
  count                             count
 -------                           -------
    935                                14
 (1 row)                           (1 row)

                                   => select count(*) from docs_en
 => select count(*) from docs_en    where to_tsvector('english', body)
  where body ilike '%query%';       @@ to_tsquery('query');
  count                             count
 -------                           -------
    312                               327
 (1 row)                           (1 row)




09/06/20
tsvectorができるまで




09/06/20
転置インデックス

           1    単語1 単語2                単語1   1,2,4
           2   単語1 単語3 単語5             単語2   1,3
           3   単語2 単語3 単語4             単語3   2,3
           4    単語1 単語5                単語4    3
                                       単語5   2,5


 ●   単語がどの文章に含まれているか(本の索引)
 ●   転置インデックスを作成するためには文章を単語に分
     ける必要がある(日本語の場合はわかち書き)
 ●   GIN(Generalized Inverted Index)
 ●   全文検索の他にも、配列型などにも使われる


09/06/20
to_tsvector
 ●    Parserが文章を23種類のtokenに分解
            a fat cat sat on a mat - it <b>ate</b> a fat rats

     Word, all ASCII       XML tag           Space symbols
            a                 <b>                ' '
           fat               </b>                -
           cat
           sat
           on
           mat
            it
           ate
           rats



09/06/20
to_tsvector
 ●    token種別毎に正規化
                       Stopwordの削除
                         語幹に縮小

     Word, all ASCII                    Space symbols
            a                               ' '
           fat                    fat       -
           cat                    cat
           sat     english_stem   sat                   削除
           on                           XML tag
           mat                    mat      <b>
            it                            </b>
           ate                    ate
           rats                   rat



09/06/20
token
 => select * from ts_token_type('default');
  tokid |      alias      |                description
 -------+-----------------+------------------------------------------
      1 | asciiword       | Word, all ASCII
      2 | word            | Word, all letters
      3 | numword         | Word, letters and digits
      4 | email            | Email address
      5 | url              | URL
      6 | host            | Host
      7 | sfloat          | Scientific notation
      8 | version         | Version number
      9 | hword_numpart   | Hyphenated word part, letters and digits
     10 | hword_part      | Hyphenated word part, all letters
     11 | hword_asciipart | Hyphenated word part, all ASCII
     12 | blank            | Space symbols
     13 | tag              | XML tag
     14 | protocol        | Protocol head
 ...
     23 | entity          | XML entity
 (23 rows)

09/06/20
Dictionaries
 => dF+ english
  Text search configuration "pg_catalog.english"
 Parser: "pg_catalog.default"
        Token     |         Dictionaries
 -----------------+-------------------------------
  asciihword      | english_stem
  asciiword       | english_stem                  email、host等は
  email           | simple                         語幹縮小しない
  file            | simple
  float           | simple
  host            | simple
 …
  numword         | simple
  sfloat          | simple                  brankやtagにはDictionaryが
  uint            | simple                        設定されていない
  url             | simple
  url_path        | simple
  version         | simple
  word            | english_stem


09/06/20
Dictionary
 ●   ストップワード
      ●    インデックスに格納しないトークンの削除("a","the")
 ●   Snowball
      ●    語幹縮小"queries" => "queri"
 => select to_tsvector('query queries');
  to_tsvector
 -------------
  'queri':1,2
 (1 row)

 => select to_tsvector('http://www.postgresql.org/about/history');
                                    to_tsvector
 --------------------------------------------------------------------------------
  '/about/history':3 'www.postgresql.org':2 'www.postgresql.org/about/history':1
 (1 row)


09/06/20
Dictionary
 ●   Simple、Sysnonym、Ispell、Thesaurus、Snowball
 ●   share/tsearch_data/
 ●   どのtoken typeにどの辞書を適用するかは変更可能
     (ALTER TEXT SEARCH CONFIG...)
 (share/tsearch_data/english.stop)
 i
 me
 my
 myself
 we
 our
 ours
 ourselves
 you
 your
 ...

09/06/20
LIKEと全文検索の違い

                                   => select count(*) from docs_en
 => select count(*) from docs_en    where to_tsvector('english', body)
  where body ilike '%html%';        @@ to_tsquery('html');
  count                             count
 -------                           -------
    935                                14
 (1 row)                           (1 row)

                                   => select count(*) from docs_en
 => select count(*) from docs_en    where to_tsvector('english', body)
  where body ilike '%query%';       @@ to_tsquery('query');
  count                             count
 -------                           -------
    312                               327
 (1 row)                           (1 row)




09/06/20
ここまでのまとめ
 ●   Token種別"tag"に対してDictionaryが設定されていない
     ので、htmlタグはtsvectorでは無視される
 ●   Token種別"asciiword"に対して設定された辞
     書"english_stem"により、文字
     列"query"も"queries"も"queri"と認識される




09/06/20
全文検索の機能




09/06/20
問い合わせ式 - tsquery
 ●   to_tsquery()
      ●    '&'(AND)、'|'(OR)、'!'(NOT)、括弧
      ●    詳細な検索条件が指定できるが、構文エラーに注意
 ●   plainto_tsquery()
      ●    Tokenを'&'で結合する
 ●   tsquery同士を演算子(&&、||)で結合することができる
 => select to_tsquery('fat & cat')
  && !! plainto_tsquery('sat mat');
               ?column?
 ------------------------------------
  'fat' & 'cat' & !( 'sat' & 'mat' )
 (1 row)
09/06/20
ts_rank
 ●   ts_rank([weights float4[], ] vector tsvector, query
     tsquery[, normalization]) returns float4
      ●    色々オプションがあるらしい
      ●    ts_rankの引数にはtsvectorが必要



 SELECT … ts_rank(to_tsvector(body), …)
    => 1000件ヒットすると、1000回to_tsvector()が呼ばれる

 SELECT … ts_rank(vec, …)
    => あらかじめtsvectorの列を用意しておく



09/06/20
ts_headline
 ●   ts_headline([regconfig, ]text, tsquery[, text])
      ●    結果の強調表示
      ●    StartSel、StopSel等設定可能



 => select ts_headline('fat cat sat mat', to_tsquery('cat'));
       ts_headline
 ------------------------
  fat <b>cat</b> sat mat
 (1 row)




09/06/20
configuration
 to_tsvector('english', body)
 to_tsvector('simple', body)
 to_tsvector(body)

 ●   全文検索で使う関数のふるまいをまとめたもの
 ●   省略された場合、default_text_search_configが使われ
     る(postgresql.confやsetコマンドで指定できる)
 => dF

                List of text search configurations
    Schema   |    Name    |              Description
 ------------+------------+---------------------------------------
  pg_catalog | danish     | configuration for danish language
  pg_catalog | dutch      | configuration for dutch language
  pg_catalog | english    | configuration for english language

09/06/20
textsearch_ja




09/06/20
textsearch_ja
 ●   default parserではわかち書きできない
 ●   http://textsearch-ja.projects.postgresql.org/
 ●   Mecabを使って形態素解析
 ●   8.3、8.4に対応。Windows用バイナリ有り
 => select to_tsvector('日本語を使ったfull text searchの例');
                   to_tsvector
 ------------------------------------------------
  'searchの例':3 'text':2 '日本語を使ったfull':1
 (1 row)

 => select to_tsvector('japanese', '日本語を使ったfull text searchの例');
                         to_tsvector
 ---------------------------------------------------------
  'full':3 'search':5 'text':4 '使う':2 '例':6 '日本語':1
 (1 row)
09/06/20
textsearch_jaのparser
 ●   非自立語を削除
 ●   動詞、助動詞を正規化
      ●    「使った」->「使う」
 ●   英数はdefault parserでparseする(htmlは削除される)
 ●   tsqueryは、単語のANDになる

 => select to_tsquery('japanese', '全文検索');
    to_tsquery
 -----------------
  '全文' & '検索'
 (1 row)




09/06/20
textsearch_jaと他の全文検索
 ●   textsearch_jaはPostgreSQL本体の全文検索機能の拡
     張として実装されている
      ●    クラッシュリカバリやPITRを使うことができる
      ●    tsearch2に対応したアプリをそのまま使える(MeidaWikiと
           か)
      ●    「PostgreSQL上にMeidaWiki環境を構築」
           http://lets.postgresql.jp/documents/tutorial/mediawiki/




09/06/20
その他のtextsearch_jaの機能
 ●   というかmecabの機能
      ●    テキストの正規化(ja_normalize)
      ●    ふりがな(furigana)
      ●    ひらがな<->カタカナ(hiragana,katakana)
      ●    等々




09/06/20
おまけ




09/06/20
参考
 ●   Building search.postgresql.org(PGCon 2008)
      ●    http://www.pgcon.org/2008/schedule/events/75.en.html
      ●    www.postgresql.orgで使われているコードは
           pgweb.postgresql.orgで公開されている
      ●    https://pgweb.postgresql.org/browser/trunk/portal/tools/search




09/06/20
●   Some recent advences in full-text search(PGcon
     2009)
      ●    http://www.pgcon.org/2009/schedule/events/119.en.html
      ●    8.4での新機能
            –   前方一致検索等
      ●    8.5以降で実装予定の機能等
            –   フレーズ検索等




09/06/20

Weitere ähnliche Inhalte

Was ist angesagt?

PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)Satoshi Yamada
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)Takayuki Goto
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Shintaro Fukushima
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...Kazuya Wada
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etckasaharatt
 
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎Insight Technology, Inc.
 
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Kazuya Wada
 
Pg14_sql_standard_function_body
Pg14_sql_standard_function_bodyPg14_sql_standard_function_body
Pg14_sql_standard_function_bodykasaharatt
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)Satoshi Yamada
 
AutoDock_vina_japanese_ver.3.0
AutoDock_vina_japanese_ver.3.0AutoDock_vina_japanese_ver.3.0
AutoDock_vina_japanese_ver.3.0Satoshi Kume
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Kazuya Wada
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用Shintaro Fukushima
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門Shintaro Fukushima
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」Nagi Teramo
 

Was ist angesagt? (20)

PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)
 
Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)Rにおける大規模データ解析(第10回TokyoWebMining)
Rにおける大規模データ解析(第10回TokyoWebMining)
 
RのffでGLMしてみたけど...
RのffでGLMしてみたけど...RのffでGLMしてみたけど...
RのffでGLMしてみたけど...
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
[data analytics showcase] B12: サーバー1,000台を監視するということ by 株式会社インサイトテクノロジー 小幡 一郎
 
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~Rが苦手な人にもRを使って頂くために~RcommanderとRook~
Rが苦手な人にもRを使って頂くために~RcommanderとRook~
 
Pg14_sql_standard_function_body
Pg14_sql_standard_function_bodyPg14_sql_standard_function_body
Pg14_sql_standard_function_body
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
AutoDock_vina_japanese_ver.3.0
AutoDock_vina_japanese_ver.3.0AutoDock_vina_japanese_ver.3.0
AutoDock_vina_japanese_ver.3.0
 
Tokyo.R#16 wdkz
Tokyo.R#16 wdkzTokyo.R#16 wdkz
Tokyo.R#16 wdkz
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
 
Rユーザのためのspark入門
Rユーザのためのspark入門Rユーザのためのspark入門
Rユーザのためのspark入門
 
Rでreproducible research
Rでreproducible researchRでreproducible research
Rでreproducible research
 
はじめてのMongoDB
はじめてのMongoDBはじめてのMongoDB
はじめてのMongoDB
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
 

Ähnlich wie textsearch_jaで全文検索

PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo StringsearchAkio Ishida
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話k1complete
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Yuto Takei
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Jun Ohtani
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章Kazufumi Ohkawa
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるKoichi Sakata
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenMITSUNARI Shigeo
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extensionToshi Harada
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSNoriyoshi Shinoda
 
Uart受信設計2013
Uart受信設計2013Uart受信設計2013
Uart受信設計2013Kiyoshi Ogawa
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニングKensuke Nagae
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書くHideyuki Tanaka
 

Ähnlich wie textsearch_jaで全文検索 (20)

PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo Stringsearch
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
Prosym2012
Prosym2012Prosym2012
Prosym2012
 
Exgettextの話
Exgettextの話Exgettextの話
Exgettextの話
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
Tokyo r sqldf
Tokyo r sqldfTokyo r sqldf
Tokyo r sqldf
 
Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207Elasticsearch入門 pyfes 201207
Elasticsearch入門 pyfes 201207
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
入門機械学習1,2章
入門機械学習1,2章入門機械学習1,2章
入門機械学習1,2章
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみるJJUG CCC 2017 Fall オレオレJVM言語を作ってみる
JJUG CCC 2017 Fall オレオレJVM言語を作ってみる
 
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgenIntel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
Intel AVX-512/富岳SVE用SIMDコード生成ライブラリsimdgen
 
20181110 fok2018-pg-extension
20181110 fok2018-pg-extension20181110 fok2018-pg-extension
20181110 fok2018-pg-extension
 
PostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVSPostgreSQL Unconference #29 Unicode IVS
PostgreSQL Unconference #29 Unicode IVS
 
Uart受信設計2013
Uart受信設計2013Uart受信設計2013
Uart受信設計2013
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Maatkit で MySQL チューニング
Maatkit で MySQL チューニングMaatkit で MySQL チューニング
Maatkit で MySQL チューニング
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 

Mehr von Akio Ishida

Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Akio Ishida
 
よりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めてよりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めてAkio Ishida
 
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDphpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDAkio Ishida
 
PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約Akio Ishida
 
Getting start with knockout.js
Getting start with knockout.jsGetting start with knockout.js
Getting start with knockout.jsAkio Ishida
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみようAkio Ishida
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2Akio Ishida
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009Akio Ishida
 
使いこなそうGUC
使いこなそうGUC使いこなそうGUC
使いこなそうGUCAkio Ishida
 
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-HorspoolアルゴリズムPostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-HorspoolアルゴリズムAkio Ishida
 

Mehr von Akio Ishida (11)

Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト Prophecyを使ったユニットテスト
Prophecyを使ったユニットテスト
 
よりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めてよりよいPHPUnitの実行方法を求めて
よりよいPHPUnitの実行方法を求めて
 
phpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDDphpspecで学ぶLondon School TDD
phpspecで学ぶLondon School TDD
 
PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約PostgreSQLの範囲型と排他制約
PostgreSQLの範囲型と排他制約
 
Getting start with knockout.js
Getting start with knockout.jsGetting start with knockout.js
Getting start with knockout.js
 
XIDを周回させてみよう
XIDを周回させてみようXIDを周回させてみよう
XIDを周回させてみよう
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
 
Ruby Postgres 2009
Ruby Postgres 2009Ruby Postgres 2009
Ruby Postgres 2009
 
使いこなそうGUC
使いこなそうGUC使いこなそうGUC
使いこなそうGUC
 
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-HorspoolアルゴリズムPostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
 
Ruby Postgres
Ruby PostgresRuby Postgres
Ruby Postgres
 

Kürzlich hochgeladen

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 

Kürzlich hochgeladen (8)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 

textsearch_jaで全文検索

  • 1. textsearch_jaで全文検索 日本PostgreSQLユーザ会 北海道支部 株式会社サイクル・オブ・フィフス 石田朗雄 09/06/20
  • 2. 自己紹介 ● id:iakio ● http://postgresql.g.hatena.ne.jp/iakio/ ● 今日の資料とデモのソースコードは公開します 09/06/20
  • 3. 自己紹介 ● 代表作 ● SQLでボウリングのスコアを計算 with recursive s(idx, pins1, pins2, pins3) as ( select s1.idx, s1.pins, s2.pins, s3.pins from score s1 left join score s2 on (s2.idx = s1.idx + 1) left join score s3 on (s3.idx = s1.idx + 2) ), f(idx, pins1, pins2, pins3) as ( select idx, pins1, pins2, pins3 from s where idx = 1 union all select s.idx, s.pins1, s.pins2, s.pins3 from s join f on (s.idx = f.idx + case when f.pins1 = 10 then 1 else 2 end) ), sof(idx, pins1, pins2, pins3, score_of_frame) as ( select idx , pins1, pins2, pins3 , case when pins1 = 10 then pins1 + pins2 + pins3 when pins1 + pins2 = 10 then pins1 + pins2 + pins3 else pins1 + pins2 end as score_of_frame from f ) select row_number( ) over w as frame , pins1 , pins2 , case row_number( ) over w when 10 then pins3 else null end as pins3 , score_of_frame , sum(score_of_frame) over w from sof window w as (order by idx) 09/06/20
  • 4. 告知など ● PostgreSQL的な話 ● 8.4RC1が6/14に出ました ● JPUG北海道支部的な話 ● 5/13に勉強会を開催 ● 次は7/8? ● JPUG的な話 ● JPUG 10th Anniversary Conference(11/20~21) 09/06/20
  • 6. PostgreSQLでの全文検索 ● PostgreSQL8.2以前 ● contrib/tsearch2 ● PostgreSQL8.3 ● 全文検索機能が本体に含まれるようになった。 ● 日本語は未対応 ● textsearch_ja ● 日本語で全文検索を行なうための拡張モジュール ● http://textsearch-ja.projects.postgresql.org/ ● textsearch_sennaの話は今日はありません 09/06/20
  • 7. 資料に自信が無いので とりあえずデモ 09/06/20
  • 8. デモの構成 ● PostgreSQL 8.4RC1(8.3でも同じです) ● データベースエンコーディングはutf-8 ● PostgreSQLのドキュメントを格納したテーブル(html) ● レコード数:900くらい ● 詳しくはブースで!! => d docs_en カラム | 型 | --------+----------+------------ id | integer | path | text | title | text | body | text | 09/06/20
  • 10. 方法1:関数インデックス ● インデックスを1つ作るだけで高速な全文検索ができ る => SELECT title FROM docs_en WHERE body ILIKE '%search%'; インデックス作成 => CREATE INDEX docs_en_idx ON docs_en USING GIN(to_tsvector('english', body)); CREATE INDEX 検索 => SELECT title FROM docs_en WHERE to_tsvector('english', body) @@ to_tsquery('english', 'search'); 09/06/20
  • 11. 全文検索の基本 ● tsvector、tsqueryはそれぞれデータ型 ● to_tsvector、(plain)to_tsqueryはtext型をtsvector、 tsqueryに変換する関数 tsvector @@ tsquery (検索対象) (検索式) => True / False 09/06/20
  • 12. 方法2:tsvector用の列を追加 ● 高速。特にスコアによるソートをする場合 ● 本文が更新された時にtsvectorは自動的に更新されな い(トリガやバッチを使う必要がある) ● 容量は大きくなる => ALTER TABLE docs_en ADD vec tsvector; ALTER TABLE => UPDATE docs_en SET vec = to_tsvector('english', body); UPDATE 936 => CREATE INDEX docs_en_idx2 ON docs_en USING GIN(vec); CREATE INDEX 検索 => SELECT title FROM docs_en WHERE vec @@ to_tsquery('english', 'search'); 09/06/20
  • 13. LIKEと全文検索の違い => select count(*) from docs_en => select count(*) from docs_en where to_tsvector('english', body) where body ilike '%html%'; @@ to_tsquery('html'); count count ------- ------- 935 14 (1 row) (1 row) => select count(*) from docs_en => select count(*) from docs_en where to_tsvector('english', body) where body ilike '%query%'; @@ to_tsquery('query'); count count ------- ------- 312 327 (1 row) (1 row) 09/06/20
  • 15. 転置インデックス 1 単語1 単語2 単語1 1,2,4 2 単語1 単語3 単語5 単語2 1,3 3 単語2 単語3 単語4 単語3 2,3 4 単語1 単語5 単語4 3 単語5 2,5 ● 単語がどの文章に含まれているか(本の索引) ● 転置インデックスを作成するためには文章を単語に分 ける必要がある(日本語の場合はわかち書き) ● GIN(Generalized Inverted Index) ● 全文検索の他にも、配列型などにも使われる 09/06/20
  • 16. to_tsvector ● Parserが文章を23種類のtokenに分解 a fat cat sat on a mat - it <b>ate</b> a fat rats Word, all ASCII XML tag Space symbols a <b> ' ' fat </b> - cat sat on mat it ate rats 09/06/20
  • 17. to_tsvector ● token種別毎に正規化 Stopwordの削除 語幹に縮小 Word, all ASCII Space symbols a ' ' fat fat - cat cat sat english_stem sat 削除 on XML tag mat mat <b> it </b> ate ate rats rat 09/06/20
  • 18. token => select * from ts_token_type('default'); tokid | alias | description -------+-----------------+------------------------------------------ 1 | asciiword | Word, all ASCII 2 | word | Word, all letters 3 | numword | Word, letters and digits 4 | email | Email address 5 | url | URL 6 | host | Host 7 | sfloat | Scientific notation 8 | version | Version number 9 | hword_numpart | Hyphenated word part, letters and digits 10 | hword_part | Hyphenated word part, all letters 11 | hword_asciipart | Hyphenated word part, all ASCII 12 | blank | Space symbols 13 | tag | XML tag 14 | protocol | Protocol head ... 23 | entity | XML entity (23 rows) 09/06/20
  • 19. Dictionaries => dF+ english Text search configuration "pg_catalog.english" Parser: "pg_catalog.default" Token | Dictionaries -----------------+------------------------------- asciihword | english_stem asciiword | english_stem email、host等は email | simple 語幹縮小しない file | simple float | simple host | simple … numword | simple sfloat | simple brankやtagにはDictionaryが uint | simple 設定されていない url | simple url_path | simple version | simple word | english_stem 09/06/20
  • 20. Dictionary ● ストップワード ● インデックスに格納しないトークンの削除("a","the") ● Snowball ● 語幹縮小"queries" => "queri" => select to_tsvector('query queries'); to_tsvector ------------- 'queri':1,2 (1 row) => select to_tsvector('http://www.postgresql.org/about/history'); to_tsvector -------------------------------------------------------------------------------- '/about/history':3 'www.postgresql.org':2 'www.postgresql.org/about/history':1 (1 row) 09/06/20
  • 21. Dictionary ● Simple、Sysnonym、Ispell、Thesaurus、Snowball ● share/tsearch_data/ ● どのtoken typeにどの辞書を適用するかは変更可能 (ALTER TEXT SEARCH CONFIG...) (share/tsearch_data/english.stop) i me my myself we our ours ourselves you your ... 09/06/20
  • 22. LIKEと全文検索の違い => select count(*) from docs_en => select count(*) from docs_en where to_tsvector('english', body) where body ilike '%html%'; @@ to_tsquery('html'); count count ------- ------- 935 14 (1 row) (1 row) => select count(*) from docs_en => select count(*) from docs_en where to_tsvector('english', body) where body ilike '%query%'; @@ to_tsquery('query'); count count ------- ------- 312 327 (1 row) (1 row) 09/06/20
  • 23. ここまでのまとめ ● Token種別"tag"に対してDictionaryが設定されていない ので、htmlタグはtsvectorでは無視される ● Token種別"asciiword"に対して設定された辞 書"english_stem"により、文字 列"query"も"queries"も"queri"と認識される 09/06/20
  • 25. 問い合わせ式 - tsquery ● to_tsquery() ● '&'(AND)、'|'(OR)、'!'(NOT)、括弧 ● 詳細な検索条件が指定できるが、構文エラーに注意 ● plainto_tsquery() ● Tokenを'&'で結合する ● tsquery同士を演算子(&&、||)で結合することができる => select to_tsquery('fat & cat') && !! plainto_tsquery('sat mat'); ?column? ------------------------------------ 'fat' & 'cat' & !( 'sat' & 'mat' ) (1 row) 09/06/20
  • 26. ts_rank ● ts_rank([weights float4[], ] vector tsvector, query tsquery[, normalization]) returns float4 ● 色々オプションがあるらしい ● ts_rankの引数にはtsvectorが必要 SELECT … ts_rank(to_tsvector(body), …) => 1000件ヒットすると、1000回to_tsvector()が呼ばれる SELECT … ts_rank(vec, …) => あらかじめtsvectorの列を用意しておく 09/06/20
  • 27. ts_headline ● ts_headline([regconfig, ]text, tsquery[, text]) ● 結果の強調表示 ● StartSel、StopSel等設定可能 => select ts_headline('fat cat sat mat', to_tsquery('cat')); ts_headline ------------------------ fat <b>cat</b> sat mat (1 row) 09/06/20
  • 28. configuration to_tsvector('english', body) to_tsvector('simple', body) to_tsvector(body) ● 全文検索で使う関数のふるまいをまとめたもの ● 省略された場合、default_text_search_configが使われ る(postgresql.confやsetコマンドで指定できる) => dF List of text search configurations Schema | Name | Description ------------+------------+--------------------------------------- pg_catalog | danish | configuration for danish language pg_catalog | dutch | configuration for dutch language pg_catalog | english | configuration for english language 09/06/20
  • 30. textsearch_ja ● default parserではわかち書きできない ● http://textsearch-ja.projects.postgresql.org/ ● Mecabを使って形態素解析 ● 8.3、8.4に対応。Windows用バイナリ有り => select to_tsvector('日本語を使ったfull text searchの例'); to_tsvector ------------------------------------------------ 'searchの例':3 'text':2 '日本語を使ったfull':1 (1 row) => select to_tsvector('japanese', '日本語を使ったfull text searchの例'); to_tsvector --------------------------------------------------------- 'full':3 'search':5 'text':4 '使う':2 '例':6 '日本語':1 (1 row) 09/06/20
  • 31. textsearch_jaのparser ● 非自立語を削除 ● 動詞、助動詞を正規化 ● 「使った」->「使う」 ● 英数はdefault parserでparseする(htmlは削除される) ● tsqueryは、単語のANDになる => select to_tsquery('japanese', '全文検索'); to_tsquery ----------------- '全文' & '検索' (1 row) 09/06/20
  • 32. textsearch_jaと他の全文検索 ● textsearch_jaはPostgreSQL本体の全文検索機能の拡 張として実装されている ● クラッシュリカバリやPITRを使うことができる ● tsearch2に対応したアプリをそのまま使える(MeidaWikiと か) ● 「PostgreSQL上にMeidaWiki環境を構築」 http://lets.postgresql.jp/documents/tutorial/mediawiki/ 09/06/20
  • 33. その他のtextsearch_jaの機能 ● というかmecabの機能 ● テキストの正規化(ja_normalize) ● ふりがな(furigana) ● ひらがな<->カタカナ(hiragana,katakana) ● 等々 09/06/20
  • 35. 参考 ● Building search.postgresql.org(PGCon 2008) ● http://www.pgcon.org/2008/schedule/events/75.en.html ● www.postgresql.orgで使われているコードは pgweb.postgresql.orgで公開されている ● https://pgweb.postgresql.org/browser/trunk/portal/tools/search 09/06/20
  • 36. Some recent advences in full-text search(PGcon 2009) ● http://www.pgcon.org/2009/schedule/events/119.en.html ● 8.4での新機能 – 前方一致検索等 ● 8.5以降で実装予定の機能等 – フレーズ検索等 09/06/20