2012-12-31 81 views
0

我在我的網站上搜索,今天我發現如果一個帖子有例如像「implicaciónen el proyecto」這樣的描述,我嘗試用單詞「implicacion」來找到這個帖子,沒有口音,我沒有得到任何結果,但是如果我用帶口音的字母「implicación」來嘗試,我找到了帖子。搜索沒有口音的口音搜索詞

如何修復此搜索,即使用戶使用沒有口音的單詞,我也需要找到帖子。

這是我的模型的實際搜索。我正在使用postgresql進行生產。

find(:all, :conditions => ['title LIKE ? OR title LIKE ? OR description LIKE ? OR description LIKE ?', "%#{search}%", "%#{search.capitalize}%", "%#{search}%", "%#{search.capitalize}%"]) 

在此先感謝您的幫助

編輯


private 

    def pg_strip_accents(field) 
      "<<EOS 
      translate(
      LOWER(#{field}), 
      'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ', 
      'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu' 
     ) 
      EOS" 
     end 


    def self.search(search) 
     if search.present? 
       where("#{pg_strip_accents('title')} LIKE :search OR #{pg_strip_accents('description')} LIKE :search", 
      :search => "%#{search.downcase}%") 
     else 
      find(:all) 
     end 
     end 

回答

0

您可以使用PostgreSQL的translate功能要做到這一點,如圖here。另外,如果你測試之前轉換雙方大寫或小寫可以減少一半的搜索字詞的數量:

where(<<EOS 
translate(
    LOWER(title), 
    'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ', 
    'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu' 
) 
LIKE :search OR 
translate(
    LOWER(description), 
    'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ', 
    'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu' 
) 
LIKE :search 
EOS }, :search => "%#{search.downcase}%") 

爲鏈接顯示,您可以創建一個專用的功能,使這個更容易重用。或者你可以使用Ruby代碼來爲你做的:

def pg_strip_accents(field) 
    <<EOS 
    translate(
    LOWER(#{field}), 
    'âãäåāăąÁÂÃÄÅĀĂĄèééêëēĕėęěĒĔĖĘĚìíîïìĩīĭÌÍÎÏÌĨĪĬóôõöōŏőÒÓÔÕÖŌŎŐùúûüũūŭůÙÚÛÜŨŪŬŮ', 
    'aaaaaaaaaaaaaaaeeeeeeeeeeeeeeeiiiiiiiiiiiiiiiiooooooooooooooouuuuuuuuuuuuuuuu' 
) 
    EOS 
end 

where("#{pg_strip_accents('title')} LIKE :search OR #{pg_strip_accents('description')} LIKE :search", 
      :search => "%#{search.downcase}%") 
+0

PinnyM我得到這個錯誤未定義的方法'pg_strip_accents'。我正在嘗試使用ruby代碼 – Jean

+0

由於您在類方法中調用它,所以'pg_strip_accents'方法需要可以訪問類本身。嘗試將其定義爲'def self.pg_strip_accents(field)'。更好的是,你可以把它放在一個單獨的模塊中,並擴展任何類以使用'extend ModuleName'使用該模塊。 – PinnyM

+0

此外,方法開始和結尾的''EOS'和'EOS'標記代替引號(使用塊語法) - 您應該刪除現在在那裏的引號,並確保最終的EOS '標記是行中的第一個字符(在它們之前沒有空格)。或者,刪除這些標記和所有換行符,以使整個字符串與周圍的引號合在一行上。 – PinnyM