【问题标题】:Rails: A good search algorithmRails:一个很好的搜索算法
【发布时间】: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


【解决方案1】:

为什么要删除这些字母?您是否要确保如果有人搜索“widgets”,您也会匹配“widget”?

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

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

希望对您有所帮助;我意识到我在某种程度上回避了您最初的问题,但我真的不建议您尝试自己解决这个问题。

【讨论】:

    【解决方案2】:

    正如 pkaeding 所说,词干提取过于复杂,无法自己尝试实现。但是,如果您想在 MySQL 中搜索相似(不精确)的字符串,并且您的用户搜索词非常接近数据库字段的完整值(即,您不是在大量文本中搜索单词或短语),您可能想尝试使用Levenshtein distance。这是MySQL implementation

    Levenshtein 算法将允许您进行“模糊”匹配,给您一个相似度分数,并帮助您避免安装和配置搜索守护程序,这很复杂。但是,这实际上仅适用于非常具体的情况,而不是一般的站点搜索。

    【讨论】:

    • 这是个好主意,如果它适合您的目的。我会为那个链接添加书签:)
    • 这个算法看起来很有趣,但我认为它不适用于我的情况。无论如何,已加入书签。
    【解决方案3】:

    虽然都在建议其他可能的解决方案,但请查看:

    Sphinx - 你如何实现对 10+ 百万行表的全文搜索、跟上负载并保持相关性?斯芬克斯擅长解谜。

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

    【讨论】:

    • 但是 sphinx 会搜索相似的词吗?
    猜你喜欢
    • 1970-01-01
    • 2013-11-11
    • 2021-04-29
    • 2011-12-21
    • 1970-01-01
    • 2010-09-17
    • 2010-10-26
    • 2023-03-10
    相关资源
    最近更新 更多