【问题标题】:RAILS3: Search ignoring diacriticals?RAILS3:搜索忽略变音符号?
【发布时间】:2011-12-09 09:20:32
【问题描述】:

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

今天有人举报了一篇重复的文章。原来添加它的人首先搜索了它,但标题中的“o”上有一个变音符号。他们使用常规的“o”字符在没有变音符号的情况下进行搜索,但没有找到,然后添加了重复项。

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    是的,处理此问题的标准方法是维护影子搜索字段。除了将所有数据更改为 Ascii 之外,请考虑:

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

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

    Soundex 会给你更多的误报——你需要确定你是宁愿有更多的误报还是错过匹配(误报),因为一个标题是“瘟疫”,另一个是“瘟疫”

    您还可以安装真正的全文搜索系统,方法是打开 MySQL 系统或通过单独的系统。

    【讨论】:

    • 感谢您的意见,拉里。我选择使用 Ireneusz 的解决方案,因为它对我的目的来说更容易且足够。但我对此表示赞成,因为如果我的应用程序要分发给许多用户或公众,我会使用它是一个更好、更全面的解决方案。我的应用只有 4 个内部用户!
    【解决方案2】:

    我建议创建一个 search_title 字段并将 title.to_ascii_brutal 存储在那里(使用这个插件:https://github.com/tomash/ascii_tic)。然后将您的搜索范围更改为:

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

    【讨论】:

    • 我选择这样做是因为它对这个应用程序来说更快且足够。 (请参阅我对拉里的回复。)我确实必须修改代码以覆盖它缺少的几个字符。我会将更改发送给作者。但它工作得很好。谢谢,Ireneusz!
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    相关资源
    最近更新 更多