【发布时间】:2010-01-21 23:25:07
【问题描述】:
我正在尝试返回更像搜索的结果
我现在的算法是这样的
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) 删除正确的字母“Ruby on Rail”..“Rub”
3) 去除左右字母“uby on Rails”、“uby on Rail”……“on”
4) 仅使用 3 个字母“Rub”、“uby”、“by”、“y o”、“on”...“ils”
这4种方式好用吗?还有吗?
【问题讨论】:
-
我不太确定您要做什么,但看起来匹配 1 - 3 的任何内容也会匹配 4。
-
我正在尝试查找与搜索相似的词
-
意思相似,还是拼写相似?如果你真的只关心拼写,我会选择@AlexReisner 提到的 Levenshtein Distance 想法。否则,请使用真正的搜索引擎。无论哪种方式,我认为通过从搜索字词中删除前导/尾随字母不会获得非常有利的结果。
-
我现在正在阅读有关 solr 的内容,然后我将阅读有关 Levenshtein 距离的内容,但我肯定会使用这样的东西
标签: ruby-on-rails ruby search