我有一个包含文章对象的Rails 3应用程序。他们有一个title属性。在添加新文章之前,人们应该搜索以查看是否已存在标题的文章。
今天有人报道了重复的文章。事实证明,添加它的人首先搜索了它,但是标题中有一个“o”的变音符号。他们使用常规的“o”字符搜索没有变音符号,没有找到它,并添加了副本。
我正在使用范围对title属性进行简单的查找,如下所示:
scope :search, lambda { |term| where('title like ?', "%#{term}%") }
我想知道是否有一种“忽略”变音符号的简单方法,以便该人可以键入“o”并且如果o具有变音符号仍然可以找到一篇文章,并且对于其他变音符号也是如此。
我考虑创建一个search_title属性,并在更新时用自己的普通等价替换变音符号,但这有其自身的问题,其中,如果有人确实使用了变音符号。
我希望可能有一个简单的解决方案,但我并没有抱太大希望。 : - )
答案 0 :(得分: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}%") }
答案 1 :(得分:1)
是的,处理此问题的标准方法是维护阴影搜索字段。除了将所有数据更改为Ascii之外,请考虑:
另一种策略是根据Soundex分数进行计算和搜索。 (或使用修订版的Soundex)。 Soundex有Ruby库或自己编写。
Soundex会给你更多的误报 - 你需要确定你是否有更多误报或者错过了一场比赛(假阴性),因为一个标题是“瘟疫”而另一个是“瘟疫”< / p>
您也可以通过打开MySQL系统或通过单独的系统安装真正的全文搜索系统。