Rails:一个很好的搜索算法

Ren*_*des 0 ruby search ruby-on-rails

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

我的算法就是这个

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
Run Code Online (Sandbox Code Playgroud)

如果我搜索"Ruby on Rails",它将进行4种搜索方式.

1)删除左侧字母"uby on Rails".."ils"

2)删除正确的字母"Ruby on Rail".."Rub"

3)删除左右字母"uby on Rails","uby on Rail"......"on"

4)只使用3个字母"Rub","uby","by","y o","on"......"ils"

这四种方式好用吗?还有吗?

pka*_*ing 6

你为什么删除这些信件?您是否尝试确保如果有人搜索"小部件",您还会匹配"小部件"?

如果是这样,那么你想要做的就是称为" 词干 ",它实际上要比删除前导和尾随字母复杂得多.您可能还有兴趣从查询中删除" 停用词 ".这些是形成语法正确句子所必需的非常常见的单词,但对于搜索不是很有用,例如"a","the"等.

正确搜索是一个非常复杂和困难的问题.我建议您不要尝试自己解决,而是专注于您网站的核心目的.也许您可以在代码中利用Lucene项目中的搜索功能.此链接也可能有助于在Ruby on Rails中使用Lucene.

我希望有所帮助; 我意识到我有点撇开你原来的问题,但我真的不建议你自己解决这个问题.