搜索带重音但没有重音的单词

时间:2012-12-31 16:25:03

标签: ruby-on-rails-3 ruby-on-rails-3.2

我在我的网站上搜索过,今天我发现如果帖子有例如“implicaciónenel proyecto”这样的描述,我尝试使用“implicacion”这个词没有重音发现这个帖子,我不知道得到任何结果,但如果我尝试使用字母o带有重音的“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

1 个答案:

答案 0 :(得分: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}%")