我在我的网站上搜索过,今天我发现如果帖子有例如“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
答案 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}%")