Junya Ohori
oohor****@jp*****
2009年 7月 24日 (金) 19:46:19 JST
初めまして、富士通九州システムズの大堀と申します。 この度、あるシステムに Ludia の適用を検討しておりますが、 実現したいことに対し、疑問点がありますのでご回答、 アドバイスを頂きたく、メールさせていただきます。 お手数おかけしますが、宜しくお願い致します。 [実現したいこと] 複数のフィールド(例えば 3つ )をもつ文書に対して全文検索を実行し、 その結果をフィールドの重みを考慮してランキング表示したいのです。 そのために、ludiaを適用して、以下のような方式を考えました。 ・テーブル table1 の複数のカラム (f1,f2,f3) にデータを格納 し、それぞれに全文検索インデックス (i1,i2,i3) を 張っておく ・画面上より入力された複数のキーワードについて AND 検索を行う。 つまり、各キーワードが f1, f2, f3 カラムのどれかに含まれているか を判定し、全てのキーワードが判定条件を満たす場合 そのレコードがヒットしたものとみなす ・検索結果は、f1のスコアの降順 → f2のスコアの降順 → f3のスコアの降順 の順に表示する。 ※ つまり、f1 のカラムにマッチしたレコードを、f2 や f3 に しかマッチしなかったものより上位にランクしたい。 [疑問点] 上のことを実現するために、次のようなSQLを書きました. ※ 検索キーワードを、"keyword1", "keyword2" としています。 SELECT f1,f2,f3, pgs2getscore(table1.ctid,'i1') as a, pgs2getscore(table1.ctid,'i2') as b, pgs2getscore(table1.ctid,'i3') as c FROM table1 WHERE ( f1 %% 'keyword1' or f2 %% 'keyword1' or f3 %% 'keyword1' ) AND ( f1 %% 'keyword2' or f2 %% 'keyword2' or f3 %% 'keyword2' ) ORDER BY a desc, b desc, c desc この SQL を実行させると、スコア a, b, c は、WHERE の前半の keyword1 に対するもののみが、考慮されているようです。 keyword1 と keyword2 の両方を考慮したスコアでソートしたいのですが可能でしょうか。 できないとした場合、keyword2 に対するスコアを取得する方法がありますでしょうか。 [環境] 環境は以下の通りです。 OS : Linux RedHat Postgres: 8.3 ludia :1.5.2 senna :1.1.4 どうぞ、宜しくお願い致します。