[Ludia-users 212] 全文検索+ORDER BY について

Back to archive index

motoi sugito m.sug****@gmail*****
2008年 4月 8日 (火) 18:16:24 JST


はじめまして、杉藤と申します。
Ludiaについて質問させてください。よろしくお願い致します。


【概要】
Ludiaを使って全文検索を実行し、且つその結果をソートして
表示したいのですが、どうしても処理結果が返るのに10秒以上
掛かってしまいます。
検索結果を一瞬(せめて3秒以内)で返るようにしたいのですが、
何かよい方法はございませんでしょうか?


【環境】
O S : CentOS5.1
D B : PostgreSQL 8.3.1
Ludia : 1.5.0 (mecab-0.97 ipadic-2.7.0 senna-1.1.2)


【詳細】
◆以下の構造のテーブルがあり、400万件データを保持してます

テーブル名:item
  colmun | type
 ------------------------
  title | varchar(512)
  price | integer
  descr | text
   :
   :

◆このテーブルには以下のインデックスを設定してます。
 "idx_item_descr" fulltext (descr)
 "idx_item_price" btree (price)


◆このテーブルに対して次のようなSelect文を投げます。
 すると結果が返るのに10秒以上掛かってしまいます。

 SELECT price, title FROM item WHERE descr %% '価格'
     ORDER BY price LIMIT 5 OFFSET 10;



【自分なりの調査結果】
◆1.通常の全文検索のみの場合では、処理結果が返るのが早いです。

# explain SELECT price, title FROM item WHERE descr %% '価格' LIMIT 5 OFFSET 10;
          QUERY PLAN
----------------------------------------------------------------------------
Limit(cost=11.40..16.98 rows=5 width=94)
 ->Index Scan using idx_item_descr on item(cost=0.25..1029.75 rows=923 width=94)
   Index Cond: (descr %% '価格'::text)



◆2.通常のORDER BYのみの場合でも、処理結果が返るのが早いです。

# explain SELECT price, title FROM item ORDER BY price LIMIT 5 OFFSET 10;
          QUERY PLAN
-----------------------------------------------------------------------------
Limit(cost=9.69..14.53 rows=5 width=94)
 ->Index Scan using idx_item_price on item(cost=0.00..893871.38
rows=922639 width=94)

※この場合、ORDER BYの指定カラム「price」にBtree
 インデックスが設定されているのでソート処理が走ら
 ないので高速に結果が返ってます。



◆3.ところが1と2が組み合わさると遅くなってしまいます。

# explain SELECT price, title FROM item WHERE descr %% '価格' ORDER BY
price LIMIT 5 OFFSET 10;
          QUERY PLAN
-----------------------------------------------------------------------------
Limit(cost=1052.42..1052.43 rows=5 width=94)
 ->Sort(cost=1052.40..1054.70 rows=923 width=94)
   Sort Key: price
     ->Index Scan using idx_item_descr on item(cost=0.25..1029.75
rows=923 width=94)
       Index Cond: (descr %% '価格'::text)

※(2.の時に)走らなかったsortが走ってしまい。ここに大変時間が掛
 かってしまいます。enable_sortをoffにしても解決できませんでした。


以上です。解決策をご存知の方がおりましたら、教えていただきたく
何卒よろしくお願い致します。




Ludia-users メーリングリストの案内
Back to archive index