2009-06-24 10 views
8

MySQLで基本的な全文検索を実装しようとしています。Ruby on RailsでMySQL全文検索

私はこの移行を書いた:


def self.up 
    execute 'ALTER TABLE photos ENGINE = MyISAM' 
    execute 'CREATE FULLTEXT INDEX fulltext_photos ON photos (place, info)' 
end 

def self.down 
    execute 'ALTER TABLE photos ENGINE = InnoDB' 
    execute 'DROP INDEX fulltext_photos ON photos' 
end 

そして、ここでは私のモデルです:


def self.search(*args) 
    options = args.extract_options! 
    find_by_sql [ "SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?)", options[:query] ] 
end 

問題は、このコードは常に空の配列を返すことです。例えば

% Photo.find(:first) 
=> Photo id: 1, place: "Baceno", info: "Era immerso in erba alta." ... 

% Photo.search(:all, :query => 'baceno') 
=> []
+0

この移行スクリプトは素晴らしい作品が、するself.down方法で順序を元に戻すことを忘れないでください、インデックスが戻って他のあなたが失敗を取得するのInnoDBのテーブルを変更する前に除去しなければなりません。 –

答えて

9

は私がプロジェクトを作成し、これをエミュレートする(Railsの2.3.2、Rubyのは、MySQL 5.0を1.9.1)。データベースに1つのレコードがあれば、同じ結果が得られます。さらにレコードを追加すると、Photo.searchコマンドがそのレコードを見つけました。

これは、「行の50%以上に存在する単語が共通と見なされ、一致しない」ためである可能性があります。 Ref.

バイナリモードでは、50%のしきい値は適用されません。バイナリモードでRef.

括弧内の所属:(ちょうどMySQLのでは、ないのRailsで)私のテストでAGAINST(BOOLEAN MODE IN 'とBacenoの')

+0

完璧です...今はっきりしています! – collimarco

1

私はSELECTステートメントにBOOLEAN MODE内のオプションを追加、それは行を返すようです。

SELECT * FROM photos WHERE MATCH (place, info) AGAINST (?) IN BOOLEAN MODE 

また、SolrやSphinxなどの検索製品を使用して検索することをおすすめします。

2

以下のコードは私のWebページで実行され、ruby on railで正しい結果が得られます。

Adverse.find(:all, :conditions => ["match(related_company,client_name) against (? IN BOOLEAN MODE)",@chk])