[MySQL][Rails] MySQL+Sennaの全文検索でスコア順にソートする。
こんにちわ。ばたっちです。
MySQL+Sennaな環境の全文検索について覚書。
- 日本語でAND検索する→BOOLEAN MODEかつ「*D+」を付与
- BOOLEAN MODEだとスコア順にならない→match() against()がスコアを返す
それぞれ反映したら SQLはこんなカンジになります。
SELECT *, match(text) against('*D+ 単語1 単語2' in boolean mode) AS score FROM table1s WHERE match(text) against('*D+ 単語1 単語2' in boolean mode) ORDER BY score DESC;
無理やり Railsにからめて(^^;、ActiveRecordではこんなカンジ。
match = "match(text) against('*D+ #{terms.join(' ')}' in boolean mode) results = Table1.find(:all, :select => "*, #{match} AS score", :conditions => match, :order => "score DESC")
これで BOOLEAN MODEでもマッチ率順になるので、LIMITで上位件数の絞込みできますね。φ(.. )