2011-03-12 30 views
0

我想看看是否有更好的表现方式找到一个字符串中的单词的完全匹配。 我正在查找字段'标题'的数据库表中的单词。 记录数量差别很大,我看到的表现非常可怕。红宝石 - 正则表达式的性能

以下是我对结果进行基准测试的3种方法。

title.split.include(search_string) 
/\b#{search_string }\b/ =~ title 
title.include?(search_string) 

最好的性能是title.include?(search_string) 不去做一个确切的词搜索(和我在寻找一个确切的词搜索)

def do_benchmark(search_results, search_string) 
    n=1000 

    Benchmark.bm do |x| 
     x.report("\b word search \b:")   { 
     n.times { 
      search_results.each {|search_result| 
      title = search_result.title   
      /\b#{search_string}\b/ =~ title   
     } 
     } 
    } 
    end 

    Benchmark.bm do |x| 
     search_string = search.search_string 
     x.report("split.include? search:") { 
     n.times { 
      search_results.each {|search_result| 
      title = search_result.title 
      title.split.include?(search_string) 
      } 

     } 
     } 
    end 

    Benchmark.bm do |x| 
    search_string = search.search_string 
    x.report("string include? search:") { 
    n.times { 
     search_results.each {|search_result| 
     title = search_result.title 
     title.include?(search_string) 
    } 

    } 
    } 
end 

"processing: 6234 records" 
"Looking for term: red ferrari" 
user  system  total  real 
word search: 50.380000 2.600000 52.980000 (57.019927) 
user  system  total  real 
split.include? search: 54.600000 0.260000 54.860000 (57.854837) 
user  system  total  real 
string include? search: 21.600000 0.060000 21.660000 (21.949715) 

有什么办法,我可以得到更好的性能和精确字符串匹配结果?

回答

2

您想要模型字段的全文搜索。这不是通过正则表达式扫描来完成的,而是通过专门的全文检索索引完成的。而不是推出自己的,我建议使用下列之一:

  • acts_as_indexed
  • 狮身人面像
  • 的Xapian
  • 的Lucene/Solr的

这里的一些链接有关选项的更多细节:

+0

感谢马克的指针。我正在做一个快速而肮脏的黑客攻击,但显然在压力下站立得不好。我会查看你发布的链接。 – truthSeekr 2011-03-12 16:47:15

0

对字符串上的空格进行拆分,遍历拆分字符串中的每个单词,然后检查==运算符。

+0

这基本上是什么''你好world'.split.include? 'foo''确实。 – coreyward 2011-03-12 14:56:39