Ruby on rails Rails标题和描述的模糊搜索

Ruby on rails Rails标题和描述的模糊搜索,ruby-on-rails,ruby,full-text-search,fuzzy-search,Ruby On Rails,Ruby,Full Text Search,Fuzzy Search,我有一个简单的rails 3应用程序,它将餐厅列为培训练习。我想能够搜索名称和描述使用一个文本字段的餐厅索引页面 给定查询比萨饼。比赛应该是 姓名:Tony's,描述:。。。是一家自20世纪50年代就存在的比萨店 名称:多米诺比萨饼,描述: 名称:大厅,描述:。。。比萨饼,意大利面和牛排 因为: Pizzia一词与“pizzeria”是一个模糊的匹配词,使用与TextMate的Cmd-T类似的逻辑。(pizzeria一词中的空格仅用于使小标记生效) pizza是与pizza匹配的小写字母 比

我有一个简单的rails 3应用程序,它将餐厅列为培训练习。我想能够搜索名称和描述使用一个文本字段的餐厅索引页面

给定查询比萨饼。比赛应该是

  • 姓名:Tony's,描述:。。。是一家自20世纪50年代就存在的比萨店
  • 名称:多米诺比萨饼,描述:
  • 名称:大厅,描述:。。。比萨饼,意大利面和牛排
因为:

  • Pizzia一词与“pizzeria”是一个模糊的匹配词,使用与TextMate的Cmd-T类似的逻辑。(pizzeria一词中的空格仅用于使小标记生效)
  • pizza是与pizza匹配的小写字母
  • 比萨饼是比萨饼的一个子串(应以开头和包含结尾)

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

    唯一棘手的问题是pizza/pizzeria,这是一个称为词干的问题


    sphinx和solr/sunspot都支持词干分析,但我想你需要告诉他们披萨是披萨店的词干。

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

    "%#{"pizza".scan(/./).join("%")}%"
    
    这将创建一个如下所示的字符串

    "%p%i%z%z%a%"
    
    然后我在一个LIKE查询中使用它,得到了预期的结果。现在剩下的就是解决确定关联顺序这一非常重要的问题:)

    更新:

    基于短字符串比长字符串更接近匹配的假设,找到了一种快速而肮脏的确定关联顺序的方法

    ORDER BY length(sequence) ASC
    

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

    过去,我仅在一个范围内使用
    如%pizza%
    就成功地做到了这一点。例如,
    名称如%pizza%或描述如%pizza%
    。我正在考虑一种更独立于语言的解决方案,如Sublime和TextMate用于查找文件的解决方案。例如,rcon=>app/controllers/r estaurants\uucon-controller.rb这与词干分析是完全不同的问题。换句话说,pizza*会匹配pizzas,但它不会匹配Pizzera。这种方法可能有效,但会出现误报,而且性能也不会很好。