mumumuの日記: Ludia, full text search for PostgreSQL, NOT query
http://www.thinkit.co.jp/free/article/0612/8/1/
http://www.thinkit.co.jp/free/article/0612/8/2/
http://www.thinkit.co.jp/free/article/0612/8/3/
http://www.thinkit.co.jp/free/article/0612/8/4/
http://www.thinkit.co.jp/free/article/0612/8/5/
3月2日に PostgreSQL 用全文検索エンジンである Ludia 1.0.0 がつい
にリリースされた。PostgreSQL 8.2 系への対応、バックエンドである Senna
の最新版 1.0.1 への対応、Snippet API対応、インデックス情報が取得可能
になる等、1.0に相応しいリリースとなっている。
Ludia の良いところは、形態素解析、N-gram の選択が可能なことに加え、
要求に応じたインデックスのカスタマイズが可能なこと、そしてバックエンドで
ある Senna のクエリ方式がそのまま利用できることで、多彩な検索が可能で
あることだ。これらは当然 Senna に多くを負っているとはいえ、その柔軟性を
生かした形で PostgreSQL に完全に統合したインターフェイスを作ったこと
は素晴らしいとしかいいようがない。
#あとはVACUUM に対応してくれれば何もいうことはない、、かな。
----
インデックス化のアルゴリズム(N-gram, 形態素解析)は、対象となる文書
にどのような検索を行わせたいかによって変化する。私は適合率を極限まで
高くしたかったのでN-gram を選択。さらに 少ない英字、数字でも検索でき
るように 数値、英字、記号をも分割したインデックス登録方法を採用した。
Ludia でいえば
SEN_INDEX_SPLIT_ALPHA|SEN_INDEX_SPLIT_DIGIT|SEN_INDEX_SPLIT_SYMBOL|SEN_INDEX_NGRAM
ludia.sen_index_flags = 30
となる。
あとは
CREATE INDEX test_col_idx ON test USING fulltextu(test_col);
とすれば、同期方式でインデックスが作成される。ここまで来れば、
SELECT * FROM test WHERE test_col @@ 'mumumu' 等の形で検索し放題である。
----
いろいろ検索クエリを変えて試していたときに気付いたのだが、「NOT条件のみのクエリ」
を流しても当然検索結果は0件である。例えば
SELECT * FROM test WHERE test_col @@ '-mumumu'
としても結果は0行である。Google で「-mumumu」 としても0件であった。マイナス
演算子は、結果の除外を表すが、それは「既にある結果から何かを除外する」という意味
になる。だから、「-mumumu」とだけ指定しても、何もない結果から「mumumu」を除外
する、という意味にしかならないから結果は0件なのである。
#Ludia を開発したNTTデータに感謝を込めて、NTTトピックで。
#
#このエントリのはじめに示した ThinkIT の特集は、Ludiaの開発者
#自らが書いたLudia の特集記事である。Ludiaの導入。インデックス
#登録アルゴリズムの選択、多彩な検索等、余すところなく解説してくれ
#ている。
Ludia, full text search for PostgreSQL, NOT query More ログイン