ここ数日、postgresで全文検索を行ったことがありますが、複数の列を検索するときのインデックス付けについて少し混乱しています。
postgresのドキュメントではts_vector
、次のように、連結された列にインデックスを作成する方法について説明しています。
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
私はそのように検索できます:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
ただし、タイトルだけ、本文だけ、または両方を検索する場合は、3つの個別のインデックスが必要になります。そして、3番目の列に追加すると、6つのインデックスになる可能性があります。
私がドキュメントで見たことのない別の方法は、2つの列に別々にインデックスを付けてから、通常のWHERE...OR
クエリを使用することです。
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
100万行までの2つをベンチマークしても、基本的にパフォーマンスに違いはないようです。
だから私の質問は:
列を個別にインデックス付けするだけでなく、このようにインデックスを連結したいのはなぜですか?両方の長所と短所は何ですか?
私の推測では、事前に両方の列だけを検索したい場合(一度に1つずつではない)は、どちらが少ないメモリを使用するかを連結することで1つのインデックスしか必要としないでしょう。
title
してbody
からインデックスを付けると大きな価値が得られるかは、はっきりとはわかりませんが、修正の余地はあります。私はおそらくそれらを別々にインデックス付けすることに固執するでしょう。また、何らかの形で連結が必要な奇抜な1回限りの場合は、クエリをその場限りで実行できます。