textsearch_sennaインストールめも
PostgreSQLのN-gram方式 全文検索、textsearch_sennaインストールメモ。
PostgreSQL8.3.5以降のDBで運用しているtextsearch_sennaのインストールと注意点に関するメモ。
参考サイト
textsearch_senna : N-gram方式 全文検索
対応環境
- PostgreSQL : 8.2 以降
- Senna : 1.1.5(最新版を使うこと) MeCabは不要
インストール手順
- 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');