我想更多的返回结果像搜索Rails的:一个好的搜索算法
我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
如果我搜索“Ruby on Rails的”它将使搜索4方法。
1)卸下左侧字母 “uby on Rails的” .. “ILS”
2)卸下右字母 “红宝石上轨” .. “揉搓”
3)卸下左侧和右侧字母“uby on Rails”,“uby on Rail”...“on”
4)仅使用3个字母“Rub”,“uby”,“by”,“yo”,“on”... “ils”
很好用这4种方式吗?还有吗?
我不完全确定你想要做什么,但看起来像任何匹配1 - 3的东西也会被4匹配。 – mckeed 2010-01-21 23:34:11
我试图找到与搜索相似的单词 – 2010-01-22 00:22:43
类似的意思,或类似的拼写?如果拼写真的是你所关心的,我会用@AlexReisner提到的Levenshtein Distance思想。否则,去一个真正的搜索引擎。无论哪种方式,我认为您不会通过修剪搜索字词中的前导/后缀字母来获得非常有利的结果。 – pkaeding 2010-01-22 00:38:10