From oohori.junya @ jp.fujitsu.com Fri Jul 24 19:46:19 2009 From: oohori.junya @ jp.fujitsu.com (Junya Ohori) Date: Fri, 24 Jul 2009 19:46:19 +0900 Subject: [Ludia-users 240] =?iso-2022-jp?b?GyRCJTklMyUiJE48aEZASn1LISRLJEQkJCRGGyhC?= Message-ID: <4A6990FB.2010305@jp.fujitsu.com> 初めまして、富士通九州システムズの大堀と申します。 この度、あるシステムに 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 どうぞ、宜しくお願い致します。 From masatake @ cj9.so-net.ne.jp Tue Jul 28 00:21:41 2009 From: masatake @ cj9.so-net.ne.jp (Masatake Iwasaki) Date: Tue, 28 Jul 2009 00:21:41 +0900 Subject: [Ludia-users 241] Re: =?iso-2022-jp?b?GyRCJTklMyUiJE48aEZASn1LISRLJEQkJCRGGyhC?= In-Reply-To: <4A6990FB.2010305@jp.fujitsu.com> References: <4A6990FB.2010305@jp.fujitsu.com> Message-ID: 岩崎です。こんにちは。 > [実現したいこと] > > 複数のフィールド(例えば 3つ )をもつ文書に対して全文検索を実行し、 > その結果をフィールドの重みを考慮してランキング表示したいのです。 Ludiaのスコア取得関数の仕様上、 複数の全文検索インデックスが使われるスキャンでは、 意図されるようなスコアは取得できません。 (得られるのは一番最後に実行された全文検索の結果 に関するスコアのみです。) なので、 > ・テーブル table1 の複数のカラム (f1,f2,f3) にデータを格納 > し、それぞれに全文検索インデックス (i1,i2,i3) を 張っておく のではなく、1つでこの3つのカラムをカバーするような インデックスを作成する必要があります。 そのための機能としてマルチカラムインデックスがあるのですが、 マルチカラムインデックスだと列に重みを持たすことができないので、 代わりに以下にある例のような感じで 配列インデックスを利用してみてはどうでしょうか。 http://ludia.sourceforge.jp/cgi-bin/moin.cgi/LudiaReadmeAdvanced#id3 また、AND条件を使う際はSQLのANDではなく、 Sennaの検索クエリで条件を指定するようにしてみてください。 http://qwik.jp/senna/query.html From oohori.junya @ jp.fujitsu.com Tue Jul 28 20:44:45 2009 From: oohori.junya @ jp.fujitsu.com (Junya Ohori) Date: Tue, 28 Jul 2009 20:44:45 +0900 Subject: [Ludia-users 242] Re: =?iso-2022-jp?b?GyRCJTklMyUiJE48aEZASn1LISRLJEQkJCRGGyhC?= In-Reply-To: References: <4A6990FB.2010305@jp.fujitsu.com> Message-ID: <4A6EE4AD.2010205@jp.fujitsu.com> 大堀です。 岩崎さん、アドバイスありがとうございます。 配列インデックスを使って、3つのカラムによるインデックスを 作成し、Senna の *D演算子により AND 条件を指定した SQLを発行する ようにしたところ、重みを考慮したスコアが得られるようになりました。 スコアは、フィールドごとの "キーワードの出現回数 x フィールドの重み" の和となっているようですので、f1 にヒットしたものが確実に上位に くるよう、重みを調整したいと思います どうも、ありがとうございました。 > 岩崎です。こんにちは。 > > >> [実現したいこと] >> >> 複数のフィールド(例えば 3つ )をもつ文書に対して全文検索を実行し、 >> その結果をフィールドの重みを考慮してランキング表示したいのです。 > > Ludiaのスコア取得関数の仕様上、 > 複数の全文検索インデックスが使われるスキャンでは、 > 意図されるようなスコアは取得できません。 > (得られるのは一番最後に実行された全文検索の結果 > に関するスコアのみです。) > > なので、 > >> ・テーブル table1 の複数のカラム (f1,f2,f3) にデータを格納 >> し、それぞれに全文検索インデックス (i1,i2,i3) を 張っておく > > のではなく、1つでこの3つのカラムをカバーするような > インデックスを作成する必要があります。 > そのための機能としてマルチカラムインデックスがあるのですが、 > マルチカラムインデックスだと列に重みを持たすことができないので、 > 代わりに以下にある例のような感じで > 配列インデックスを利用してみてはどうでしょうか。 > > http://ludia.sourceforge.jp/cgi-bin/moin.cgi/LudiaReadmeAdvanced#id3 > > また、AND条件を使う際はSQLのANDではなく、 > Sennaの検索クエリで条件を指定するようにしてみてください。 > > http://qwik.jp/senna/query.html > > _______________________________________________ > Ludia-users mailing list > Ludia-users @ lists.sourceforge.jp > http://lists.sourceforge.jp/mailman/listinfo/ludia-users > >