「第4回:Ludiaを体験」で説明したインストールの手順の中で、PostgreSQLの設定ファイル(postgresql.conf)に以下のようなカスタム変数を記述しました。
custom_variable_classes = 'ludia'
ludia.max_n_sort_result = 100000
ludia.enable_seqscan = on
ludia.sen_index_flags = 31
この中のludia.max_n_sort_resultは、全文検索のヒット件数の上限を設定する変数になります。これはSQLのクエリにLIMIT句を指定した場合と意味がすこし異なります。LIMIT句の指定は最終的に返却される行数の上限を設定しますが、Ludiaのカスタム変数の設定はLudiaがPostgreSQLに(ソートして)返却する結果数の上限を設定します。
例として、第4回で作成したテーブルをヒット件数の制限をつけて検索してみます。カスタム変数の現在の値はSHOWコマンドで確認ことができます。
# SHOW ludia.max_n_sort_result;
ludia.max_n_sort_result
-------------------------
100000
(1 row)
# SELECT count(*) FROM zip WHERE address @@ '東京都';
count
-------
3333
(1 row)
カスタム変数の値はSETコマンドで変更することができます。値を100にしてもう一度同じ検索を実行してみます。
# SET ludia.max_n_sort_result TO 100;
SET
# SELECT count(*) FROM zip WHERE address @@ '東京都';
count
-------
100
(1 row)
得られる結果数が100件に変化していることがわかります。さらに、次のように複数の検索条件を組み合わせた場合を見てみます。
# EXPLAIN SELECT count(*) FROM zip
WHERE address @@ '東京都' AND zipcode LIKE '104%';
QUERY PLAN
------------------------------------------------------------------------
Aggregate (cost=0.02..0.03 rows=1 width=0)
-> Index Scan using idx_word on zip (cost=0.00..0.01 rows=1 width=0)
Index Cond: (address @@ '東京都'::text)
Filter: (zipcode ~~ '104%'::text)
この場合は、まずaddress列に「東京都」が含まれる行を100行まで取りだされ、次にその行のzip列が「104」からはじまるかどうかチェックしています。
こうすると、実際には両方の条件を満たすものがあっても、最初に取得される100行に含まれていないものは取得されません。ヒットするはずのものがヒットしないということにならないよう、注意してください。
全文検索ではキーワードによってはヒット件数が非常に大きくなりますが、この設定をしておくことでソート処理などの時間を減らすことができます。
PostgreSQLは構造上(インデックスで処理できる検索の)結果数を取得するだけでも処理に時間を要してしまうため、この設定が役に立つことがあります(PostgreSQLの構造については、後述します)。
|