RAILS3:搜索忽略了变音符号?

时间:2011-10-17 15:03:53

标签: ruby-on-rails ruby-on-rails-3 search diacritics

我有一个包含文章对象的Rails 3应用程序。他们有一个title属性。在添加新文章之前,人们应该搜索以查看是否已存在标题的文章。

今天有人报道了重复的文章。事实证明,添加它的人首先搜索了它,但是标题中有一个“o”的变音符号。他们使用常规的“o”字符搜索没有变音符号,没有找到它,并添加了副本。

我正在使用范围对title属性进行简单的查找,如下所示:

scope :search, lambda { |term| where('title like ?', "%#{term}%") }

我想知道是否有一种“忽略”变音符号的简单方法,以便该人可以键入“o”并且如果o具有变音符号仍然可以找到一篇文章,并且对于其他变音符号也是如此。

我考虑创建一个search_title属性,并在更新时用自己的普通等价替换变音符号,但这有其自身的问题,其中,如果有人确实使用了变音符号。

我希望可能有一个简单的解决方案,但我并没有抱太大希望。 : - )

2 个答案:

答案 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之外,请考虑:

  • 将所有内容更改为大写以消除案例问题
  • 删除所有不是数字,字母或空格的字符。 (删除标点,标签等)
  • 删除“stop words”,例如“is”“the”“a”等。当然,停用词依赖于语言。

另一种策略是根据Soundex分数进行计算和搜索。 (或使用修订版的Soundex)。 Soundex有Ruby库或自己编写。

Soundex会给你更多的误报 - 你需要确定你是否有更多误报或者错过了一场比赛(假阴性),因为一个标题是“瘟疫”而另一个是“瘟疫”< / p>

您也可以通过打开MySQL系统或通过单独的系统安装真正的全文搜索系统。