textsearch groonga v0.1

4,685 views

Published on

2010-11-29 「全文検索エンジンgroongaを囲む夕べ #1」の資料。PostgreSQLからgroongaを利用する textsearch_groonga 全文検索インデックスを紹介する。

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,685
On SlideShare
0
From Embeds
0
Number of Embeds
504
Actions
Shares
0
Downloads
23
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

textsearch groonga v0.1

  1. 1. textsearch_groonga ©2010 FORCIA, Inc. FORCIA, Inc. 板垣貴裕 全文検索エンジンgroongaを囲む夕べ #1 2010-11-29
  2. 2. お試し版をリリースしました • バージョン 0.1 – ドキュメント • http://textsearch-ja.projects.postgresql.org/textsearch_groonga.html – ダウンロード • http://pgfoundry.org/frs/?group_id=1000298 • 対応バージョン ©2010 FORCIA, Inc. • 対応バージョン – PostgreSQL 8.3, 8.4, 9.0, 9.1dev – groongaなるべく新しいもの • 基本的な検索機能をサポート – データ更新やインデックス削除に未対応な部分が 残っているため、参照用途で試してください
  3. 3. PostgreSQLの全文検索 • 組み込みのtextsearch – textsearch_ja 組み込み機能 + Mecab • 形態素解析 (単語単位) のインデックス • 組み込みの GIN (転置インデックス) で検索する • 追加インデックス・アクセス・メソッド ©2010 FORCIA, Inc. • 追加インデックス・アクセス・メソッド – textsearch_senna senna – textsearch_groona groonga • N-gram (文字単位) のインデックス
  4. 4. textsearch_groonga の開発動機 • textsearch_ja (単語) 固有名詞やカタカナ連語の検索漏れが怖い • textsearch_senna (N-gram) ©2010 FORCIA, Inc. PostgreSQL 8.3のHOT更新と相性が悪いことが判明 Sennaもメンテナンス・フェーズに入るみたいだし… • textsearch_groonga
  5. 5. PostgreSQLの拡張インタフェース MySQL Storage Engine PostgreSQL Index Access Method SQL Parser SQL Parser Query Optimizer Query Optimizer Table Table Index Index 拡張可能な モジュール 共通処理 ©2010 FORCIA, Inc. Index Index • PostgreSQLではインデックスを拡張可能 • やれることは限定的だが、拡張は容易 • 必要なのはハンドラ関数 10個程度 • トランザクション管理は本体に任せられる
  6. 6. 使い方 ©2010 FORCIA, Inc.
  7. 7. 使い方:インストール方法 • ビルド – PGの開発用ヘッダ、ライブラリをインストール • postgresql-devel パッケージ等 – make 自動的に PGXSを使う – sudo make install • テスト ©2010 FORCIA, Inc. • テスト – PostgreSQLを起動させた状態で – make installcheck • データベースへの登録 – psql -f $PGSHARE/contrib/textsearch_groonga.sql
  8. 8. 使い方 : インデックス作成 • CREATE TABLE tbl(id serial, doc text); • COPY tbl(doc) FROM '...'; -- データ投入 • CREATE INDEX idx ON tbl USING groonga (doc); CTID 文書文書文書文書 その他その他その他その他 _key 文書文書文書文書 CTID 単語単語単語単語 _key ©2010 FORCIA, Inc. CTID 文書文書文書文書 その他その他その他その他 (1, 0) foo 1.5 (1, 1) bar 2.0 (2, 0) baz 4.5 PostgreSQLテーブル CTID = 物理位置 _key 文書文書文書文書 CTID 1 bar (1, 1) 2 baz (2, 0) 3 foo (1,0) groongaテーブル 単語単語単語単語 _key ar 1 az 2 ba 1, 2 fo 3 oo 3 groonga転置表
  9. 9. 使い方 : 検索 • SELECT * FROM tbl WHERE … – 単純検索 • doc = 'キーワード' – 比較演算子による検索 – <, <=, =, >=, >, <> • 文書と数値を複数列インデックスにしている場合等 – 単語検索 ©2010 FORCIA, Inc. – 単語検索 • doc %% 'キーワード' – N-gramによる検索 • 「キーワードを含む」検索 – grn_expr検索 • doc @@ groonga.query('キーワード', '列と重み') • 自由な検索
  10. 10. スコアリング • SELECT * FROM tbl WHERE doc %% 'keyword' ORDER BY groonga.score(tableoid, ctid) – 行を識別するシステム列 tableoid, ctid を使って 特定の行のスコアを取得 – スコアの重み付けは groonga.query() で変更可能 • v0.1の制限 ©2010 FORCIA, Inc. • v0.1の制限 – 行が更新されていると結果が0になることがある。 CTID 文書文書文書文書 その他その他その他その他 (1, 0) foo 1.5 (1, 1) foo 1.6 PostgreSQLテーブル 文書文書文書文書 CTID foo (1,0) groongaテーブル 更新時に 間接参照が 発生する
  11. 11. textsearch_senna vs. _groonga • 利点 – スコアリングやgrn_expr等groongaの機能を活用できる – text 型以外に、スカラー型 (数値, 日時) もサポート – マルチカラム・インデックスをサポート • 欠点 – ディスク消費が多い (文書をDBとgroongaの両方で持つ) ©2010 FORCIA, Inc. ( DB groonga ) – (将来対応予定) LIKE 演算子をサポートしていない – (将来対応予定) インデックスをDROPした際にゴミが残る • 類似点 – クラッシュ・リカバリやアーカイブ・リカバリは未対応 – PG9.0のレプリケーションに未対応 (Slony, pgpoolは可)
  12. 12. ファイルの構成 • $PGDATA – base • <DBID-1> – grn : groongaメタデータ – grn.0000000 : groongaメタデータ – NNNNN : PostgreSQLインデックス – NNNNN.grn : groongaテーブル – NNNNN.grn.1 : groongaテーブル 列1 PGデータベース1個ごとに groongaデータベース ©2010 FORCIA, Inc. – NNNNN.grn.1 : groongaテーブル 列1 – NNNNN.grn.i : groonga全文検索インデックス – NNNNN.grn.r : groonga単語インデックス – NNNNN.grn.r.c : groonga単語インデックス • <DBID-2> – … – global
  13. 13. ToDoと今後の展望 ©2010 FORCIA, Inc.
  14. 14. LIKE演算子のサポート • textsearch_sennaで意外に人気の機能らしい – 「困った時の奥の手」という安心感 - "LIKE %foo%" で 作ってしまったアプリケーションを後から救う • groongaにも機能はあるみたい? – UNIGRAM, BIGRAM, TRIGRAMの使い分けは? ©2010 FORCIA, Inc. – UNIGRAM, BIGRAM, TRIGRAMの使い分けは? – 英数字も文字単位でインデックスするには?
  15. 15. PostgreSQLとの相性の向上 • 適切なスコアを返すには? – grn_query_scan()で素直に再計算すべきかも • DROP INDEXでgroongaデータも削除するには? – PostgreSQLハンドラに amdrop を追加する? – groongaに basename.N のみを使ってもらう? basename.N.c ©2010 FORCIA, Inc. • 現状は basename.N.c という名前も使われる • トランザクションログと連携するには? – クラッシュ・リカバリは難しいかも – レプリケーションなら何とかなりそう? • PostgreSQLにユーザAMでもWALを書く仕組みが必要
  16. 16. SQL/MED in PostgreSQL 9.1 • 標準SQLで仕様化されたストレージ・エンジン – PostgreSQL 9.1 (2011年~) に向けて開発中 – groonga DBを、表として参照可能に • PGとgroongaでデータを二重に持たずに済む – 行指向のPG表と、列指向のgroonga表の使い分け • 適材適所 ©2010 FORCIA, Inc. • 適材適所 • 標準SQLに含まれているのは参照処理のみ – 更新DMLやテーブルDDLはまだ無い – 独自拡張でINSERTくらいには対応するかも?
  17. 17. まとめ ©2010 FORCIA, Inc.
  18. 18. textsearch_groongaのまとめ • 現在、お試し版をリリース中です – 参照を想定。スコアが要らないなら更新も可 • textsearch_sennaの良いところ/悪いところを 踏まえての更新版です OR ©2010 FORCIA, Inc. – 更新の確実性や、OR演算の扱いなど • SQL/MEDが大本命 – PostgreSQL/groongaを良いとこどりできる ハイブリッド・データベースを目指します

×