textsearch_sennaインストールめも

PostgreSQLN-gram方式 全文検索、textsearch_sennaインストールメモ。
PostgreSQL8.3.5以降のDBで運用しているtextsearch_sennaのインストールと注意点に関するメモ。

参考サイト
textsearch_senna : N-gram方式 全文検索

対応環境
インストール手順
  • Sennaインストール

ここsennaよりsenna-1.1.5.tar.gzをダウンロード


/usr/local/srcで作業する場合

tar zxf senna-1.1.5.tar.gz
cd /usr/local/src/senna-1.1.5
./configure --prefix=/usr --without-mecab
make
su -
cd /usr/local/src/senna-1.1.5
make install
  • textsearch_sennaインストール

パスの設定などがややこしいので、postgresqlコンパイルディレクトリを利用してインストールします。
postgresqlコンパイルディレクトリのcontrib配下に展開すると、楽にインストールを行えます。)


ここtextsearch_sennaよりDBにあったバージョンをダウンロード
(ここでは、textsearch_senna-8.4.4.tar.gzをダウンロードしたものとする)


posgresqlのコンパイルディレクトリが/usr/local/src/postgresql-8.4.4/の場合

tar zxf textsearch_senna-8.4.4.tar.gz  -C /usr/local/src/postgresql-8.4.4/contrib/
cd /usr/local/src/postgresql-8.4.4/contrib/textsearch_senna
make
su -
cd /usr/local/src/postgresql-8.4.4/contrib/textsearch_senna
make install

# DBにsennaのfunctionを登録
su - ユーザ
createlang plpgsql DB名
psql DB名 -f /usr/local/src/postgres-8.4.4/contrib/textsearch_senna/textsearch_senna.sql
使い方
  • インデックスアクセスメソッドの種類

 senna_ops : 正規化 + (英数字:単語単位でインデックス化 他:2-gram)

 like_ops : 正規化 + 完全2-gram。LIKE 演算子でインデックスの利用可能

 ludiaのように、インデックスを細かく設定することはできないみたいです。

  • インデックスの作成
# senna_opsで作成
CREATE INDEX index1 ON table1 USING senna (col1);

# like_opsで作成
CREATE INDEX index2 ON table1 USING senna (col2 like_ops);

8.3以降では、@@は予約語のため、%%で検索を行ってください。
「*D+」、「*W」などは、Sennaのクエリの書式に準拠します。
詳しくはsennaクエリーの書式を参考にしてください。

# hogeで
SELECT * FROM table1 WHERE col1 %% 'hoge';

# AND検索
SELECT * FROM table1 WHERE col1 %% '*D+ hoge fuga';

# LIKE検索。
SELECT * FROM test WHERE col2 LIKE '%piyo%';
  • メリット
    • like_opsでインデックス作成時、LIKE検索時にインデックスを使用してくれます。(超重要)
    • tsearch2 互換のインタフェースを備えています。
    • 使い方が簡単で、期待するデータを返してくれます。
  • デメリット
    • データを更新/削除した際に間違ったデータが返ることがあります。
    • マルチカラムインデックスを作成できません。
    • ヒットスコア表示が無さそう。
インデックスのメンテナンス

textsearch_sennaのサイトに詳しく書いてありますが・・・。

以下の操作をおこなうと、textsearch_sennaの不要ファイルが残ってしまいますので、必ず専用の関数を用いて削除してください。

  • 操作一覧

 DROP INDEX / TABLE
 TRUNCATE TABLE
 ALTER TABLE (テーブルの書き換えが発生する場合)
 CLUSTER
 REINDEX INDEX / TABLE / DATABASE
 VACUUM FULL (PostgreSQL 9.0 以降)

  • 専用関数

senna.drop_index()
 DROP INDEX の代わりに senna.drop_index() 関数を使ってください。

=# SELECT senna.drop_index('index_name');

senna.reindex_index()
REINDEX の代わりに senna.reindex_index() 関数を使ってください。

=# SELECT senna.reindex_index('index_name');