2011-10-17 111 views
0

我有一個包含Article對象的Rails 3應用程序。他們有一個標題屬性。在添加新文章之前,人們應該搜索以查看是否存在具有標題的文章。RAILS3:搜索忽略變音符號?

今天有人報告了重複的文章。發現誰加入它先搜索它,但標題中有一個「o」的變音。他們使用普通的「o」字符在沒有元音變音的情況下進行搜索,沒有找到它,並添加了副本。

我與一個範圍title屬性做一個簡單的查找,如下:

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

我想知道如果有一個簡單的方法來「忽略」變音符號,這樣的人可以鍵入一個「o」,如果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,考慮:

  • 改變一切爲大寫消除的情況下發出
  • 去除不是數字,字母或空格的所有字符。 (刪除標點符號,標籤等)
  • 刪除「stop words」,如「is」,「a」等。當然,停用詞語是依賴於語言的。

另一種策略是根據Soundex分數進行計算和搜索。 (或使用Soundex的修訂版)。有用於Soundex的Ruby庫或編寫你自己的。

Soundex會給你更多的誤報 - 你需要確定你是否寧願有更多的誤報或可能錯過匹配(一個錯誤的否定),因爲一個標題是「瘟疫」,另一個是「瘟疫」

您也可以通過打開MySQL系統或通過單獨的系統安裝真正的全文搜索系統。

+0

感謝您的意見,Larry。我選擇使用Ireneusz的解決方案,因爲它對我的目的來說更容易和充分。但是我對此表示贊同,因爲如果我的應用程序要分發給許多用戶或公衆,它會是更好,更全面的解決方案。我的應用程序只有4個內部用戶! –