2011-10-17 6 views
0

Articleオブジェクトを含むRails 3アプリがあります。彼らはtitle属性を持っています。新しい記事を追加する前に、そのタイトルの記事が既に存在するかどうかを検索することになります。RAILS3:発音区別符を無視して検索しますか?

今日、誰かが重複記事を報告しました。それを追加した人はまずそれを探していたが、タイトルには "o"の上にウムラウトがあった。彼らは、通常の "o"文字を使用してウムラウトを使わずに検索し、見つからず、複製を追加しました。

私は以下のように、スコープを持つtitle属性に簡単な検索をやってる:

scope :search, lambda { |term| where('title like ?', "%#{term}%") } 

人が入力することができるように、発音区別符号を「無視」するための簡単な方法があります場合、私は思ったんだけどoがウムラウトを有する場合には記事を、他の発音区別符号については記事を見つける。

私はsearch_title属性を作成し、それを置き換えて更新プログラムを作成したと考えましたが、その中には別の問題があります。

私はこれには簡単な解決策があることを期待していましたが、私はあまり期待していません。 :-)

答えて

1

search_titleフィールドを作成し、そこにtitle.to_ascii_brutal(このプラグインを使用:https://github.com/tomash/ascii_tic)を保存することをお勧めします。

scope :search, lambda { |term| where('search_title like ?', "%#{term.to_ascii_brutal}%") } 
+0

このアプリケーションでは、これが迅速かつ十分であるため、これを実行することにしました。 (私のLarryへの返答を参照してください) コードがいくつか欠落しているのを修正する必要がありました。変更を著者に送付します。しかし、それは素晴らしい仕事です。ありがとう、Ireneusz! –

1

はい、これを処理する標準的な方法は、シャドウ検索フィールドを維持することです。 ASCIIにすべてのデータを変更することに加えて、検討してください:

  • をケースを排除するために大文字にすべてを変更する数字、文字またはスペースでないすべての文字を削除し
  • を発行します。 (句読点、タブなどを削除する)
  • "is"、 "a"などのように "stop words"を削除します。もちろん、ストップワードは言語に依存します。

代わりの方法は、Soundexスコアに基づいて計算して検索することです。 (またはSoundexの改訂版を使用してください)。 Soundex用のRubyライブラリがあります。

Soundexは、誤ったポジティブな表現をしたいのか、または「疫病」と「疫病」の1つであるため、マッチ(偽陰性)がないかどうかを判断する必要があります。

MySQLシステムを有効にするか、別のシステムを使用してフルテキスト検索システムをインストールすることもできます。

+0

入力していただきありがとうございます。私はアイリーンズのソリューションを使用することを選択しました。アイリーンズのソリューションは、私の目的にとってはより簡単で十分でした。しかし、私のアプリが多くのユーザーや一般に配布されているなら、私が使用するより優れた包括的なソリューションであるので、私はこれをアップボーニングしています。私のアプリには4人の社内ユーザーしかいません! –

関連する問題