【问题标题】:Rails fuzzy searching on title and descriptionRails模糊搜索标题和描述
【发布时间】:2012-10-21 01:41:07
【问题描述】:

我有一个简单的 rails 3 应用程序,其中列出了餐厅作为训练练习。我希望能够使用餐厅索引页面上的一个文本字段来搜索名称和描述。

给定查询pizza。比赛应该是

  • 名称:Tony's,描述:...是一家自 1950 年代就开始营业的比萨店...
  • 名称:Domino's Pizza,描述:...
  • 名称:The Hall,描述:...比萨、意大利面和牛排...

因为:

  1. pizza 这个词是 fuzzy 匹配到“pizzeri a”使用与 TextMate 的 Cmd-T 类似的逻辑。 (单词 pizzeria 中的空格仅用于使 mini-Markdown 工作)
  2. pizza 是一个 小写 匹配 Pizza
  3. pizza 是一个 substring 比萨饼(应该与 end-with begin-with 和包含一起使用)

我将如何在 Rails 3 中执行此操作?我是使用thinking_sphinx、tire、sunspot-rails 还是只是为我的应用程序使用自定义查询。

【问题讨论】:

  • 我在过去通过在范围内使用 LIKE %pizza% 已经取得了成功。例如。 name LIKE %pizza% OR description LIKE %pizza%.

标签: ruby-on-rails ruby full-text-search fuzzy-search


【解决方案1】:

唯一棘手的是披萨/比萨店,这是一个称为词干提取的问题。

sphinx 和 solr/sunspot 都支持词干提取,但我想你需要教他们两个披萨是比萨店的梗。

【讨论】:

  • 我正在考虑一种更加独立于语言的解决方案,例如 Sublime 和 TextMate 用来查找文件的解决方案。例如。 rcon => app/controllers/ r estaurants_ con troller.rb
  • 这确实是一个与词干不同的问题。换句话说,pizza* 将匹配比萨饼,但不会匹配比萨饼店。
【解决方案2】:

消除误报的一种方法是运行用户定义函数 (UDF) 来计算候选答案与原始字符串之间的编辑距离,并忽略那些编辑距离过大的答案。

【讨论】:

    【解决方案3】:

    我找到了一个非常简单的解决方案,可以满足我的需求。

    "%#{"pizza".scan(/./).join("%")}%"
    

    这将创建一个看起来像这样的字符串

    "%p%i%z%z%a%"
    

    然后我在 LIKE 查询中使用它,我得到了预期的结果。现在剩下的就是解决确定相关顺序的重要问题:)

    更新:

    找到了一种快速而肮脏的方法来确定相关顺序,假设较短的字符串很可能比较长的字符串更接近。

    ORDER BY length(sequence) ASC
    

    【讨论】:

    • 此方法可能有效,但您会得到误报,而且效果不会那么好。
    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多