中谷宗嵩
nakatani_munet****@flyin*****
2012年 7月 5日 (木) 14:14:22 JST
株式会社フライングラインの中谷です。 前回の質問では、大変お世話になりました。 連投になってしまい恐縮ですが、全く別件での質問です。 今回は、検索スコアを用いたソート方法について、教えていいただきたいことがあります。 以下、具体例で説明させていただきます。 【テーブル】 id・title・atuthor・publisherの4つのカラムを持つ、bookというテーブルを使用。 【やりたいこと】 title・author・publisherカラムをキーワード検索し、マッチするデータを取得する。 その際、検索結果を以下の順にソートする。 (1)titleの検索スコア (2)authorの検索スコア (3)publisherの検索スコア 【現在の状況】 上記の検索結果を得るために、まず最初に以下のSQLを実行しました。 (a) SELECT * FROM book WHERE MATCH(title,author,publisher) AGAINST("キーワード" in boolean mode) ORDER BY MATCH(title) AGAINST("キーワード" in boolean mode) , MATCH(author) AGAINST("キーワード" in boolean mode) , MATCH(publisher) AGAINST("キーワード" in boolean mode); これでSQLは通ったのですが、得られた結果が、 ORDER BY句をつけないときと比べ、明らかに減少してしまいました。 これは恐らく、WHERE句に使用していない条件を、 ORDER BY句に使用したのが原因だと考えられたので、続いて(b)を実行しました。 (b) SELECT * FROM book WHERE MATCH(title) AGAINST("キーワード" in boolean mode) OR MATCH(author) AGAINST("キーワード" in boolean mode) OR MATCH(publisher) AGAINST("キーワード" in boolean mode) ORDER BY MATCH(title) AGAINST("キーワード" in boolean mode) , MATCH(author) AGAINST("キーワード" in boolean mode) , MATCH(publisher) AGAINST("キーワード" in boolean mode); こちらで、目的の結果を得ることが出来ました。 ただし、(b)のSQLは冗長で、パフォーマンス的にもあまり良くないように思われます。 【質問】 (1)目的の検索結果を取得するために、(b)以外で、より効率的なSQL文を書くことは可能でしょうか。 ((a)のように、マルチカラムインデックスを使う方法で実現出来るとうれしいのですが・・・。) (2)mroongaをパフォーマンスチューニングするための設定ファイルなどは存在するのでしょうか。 以上です。 恐れ入りますが、ご回答の程、どうぞよろしくお願い致します。 ----------------------------------------- 株式会社 フライングライン 中谷 宗嵩 東京都中央区銀座8-11-11 TK銀座8丁目ビル URL: http://www.flyingline.co.jp/ Tel: 03-5537-0390 Fax: 03-5537-0391 Mail: nakatani_munet****@flyin*****