0

我在我的网站上进行了搜索,今天我发现如果一个帖子有例如“implicación en el 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
4

1 回答 1

0

您可以使用 postgresql函数来执行translate操作,如此处所示。此外,如果在测试之前将两边都转换为大写或小写,则可以将搜索词的数量减半:

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}%")
于 2012-12-31T18:06:03.500 回答