Ruby - производительность регулярных выражений - PullRequest
0 голосов
/ 12 марта 2011

Я пытаюсь выяснить, есть ли лучший способ найти точное совпадение для слова в строке.Я ищу слово в своей таблице базы данных для поля «заголовок».Количество записей варьируется в широких пределах, и производительность, которую я вижу, довольно страшная.

Вот 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 ]

2 голосов
/ 12 марта 2011

Вы хотите полнотекстовый поиск модельного поля.Лучше всего это достигается не с помощью регулярных проверок, а с помощью специального индекса для полнотекстового поиска.Вместо того, чтобы бросать свой собственный, я бы порекомендовал использовать один из следующих:

  • act_as_indexed
  • Сфинкс
  • Хорек
  • Xapian
  • Lucene / Solr

Вот некоторые ссылки с некоторыми более подробными сведениями о параметрах:

0 голосов
/ 12 марта 2011

Выполните разбиение на пробелах в вашей строке, просмотрите каждое слово в строке разделения, затем проверьте оператор ==.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...