Ruby on rails Rails:一个好的搜索算法

Ruby on rails Rails:一个好的搜索算法,ruby-on-rails,ruby,search,Ruby On Rails,Ruby,Search,我试图返回更像搜索的结果 我的curren算法是这样的 def search_conditions(column, q) vars = [] vars2 = [] vars << q if q.size > 3 (q.size-2).times do |i| vars2 << q[i..(i+2)] next if i == 0 vars << q[i..-1] vars &l

我试图返回更像搜索的结果

我的curren算法是这样的

def search_conditions(column, q)
  vars  = []
  vars2 = []

  vars << q

  if q.size > 3
    (q.size-2).times do |i|
      vars2 << q[i..(i+2)]
      next if i == 0
      vars << q[i..-1]
      vars << q[0..(q.size-1-i)]
      vars << q[i % 2 == 0 ? (i/2)..(q.size-(i/2)) : (i/2)..(q.size-1-(i/2))] if i > 1
    end
  end

  query = "#{column} ILIKE ?"
  vars = (vars+vars2).uniq

  return [vars.map { query }.join(' OR ')] + vars.map { |x| "%#{x}%" }
end
def搜索条件(列,q)
变量=[]
vars2=[]
vars 3
(q.size-2)。时间是多少|

vars2为什么要删除这些字母?您是否试图确保如果有人搜索“小部件”,您也会匹配“小部件”

如果是这样的话,您尝试执行的操作称为“”,它实际上比删除前导字母和尾随字母要复杂得多。您可能还想从查询中删除“”。这些是构成语法正确的句子所必需的极为常见的词,但对搜索不是很有用,例如“a”、“the”等

正确的搜索是一个非常复杂和困难的问题。我建议你不要试图自己解决这个问题,而是关注你网站的核心目的。也许您可以在代码中利用项目中的搜索功能。此链接也可能对您有所帮助


我希望这有帮助;我意识到我有点回避了你最初的问题,但我真的不建议你自己去解决这个问题。

正如pkaeding所说,词干分析太复杂了,无法自己去实现。但是,如果您希望在MySQL中搜索类似(不精确)字符串,并且您的用户搜索词非常接近数据库字段的完整值(即,您没有在大量文本中搜索单词或短语),您可能需要尝试使用。这是一本书


Levenshtein算法将允许您进行“模糊”匹配,给您一个相似性分数,并帮助您避免安装和配置搜索守护进程,这很复杂。然而,这实际上只是针对一个非常具体的案例,而不是一般的网站搜索。

当我们都在建议其他可能的解决方案时,请查看:

-如何对1000多万行的表进行全文搜索,跟上负载并保持相关性?斯芬克斯擅长这些谜语


-Sphinx和ActiveRecord之间的一个Ruby连接器。

我不太确定您想做什么,但看起来任何匹配1-3的词都会匹配4。我正在尝试查找与搜索相似的词,意思相似,还是拼写相似?如果你真的只关心拼写,我会赞同@Alexleisner提到的Levenshtein距离概念。否则,使用真正的搜索引擎。不管怎样,我不认为从搜索词中删掉前导字母/拖尾字母会得到非常好的结果。我现在正在读关于solr的文章,然后我会读关于Levenshtein距离的文章,但我肯定会使用类似的东西,如果适合你的目的,这是一个好主意。我将把这个链接加入书签:)这个算法看起来很有趣,但我认为它不适合我的情况。不管怎么说,已经书签了。但是斯芬克斯会搜索类似的单词吗?