У меня есть требование, как показано нижеЛучший способ оптимизации запроса при поиске строки в больших предложениях
стихотворение принадлежит поэту
поэт имеет много стихов
Если пользователь ищет слово «рубин "
Следует предоставить,
Общее количество раз, когда слово ruby используется во всех стихотворениях.
Показать все стихи, содержащие слово ruby.
Количество слов, используемых рубином в каждом стихотворении.
Общее количество поэтов, используемых словом ruby.
Общее количество раз, когда все поэты использовали слово ruby.
Так что мой запрос в модели Поэма здесь
poems= where("poem_column like ?", "%#{word}%")
@results = {}
poems.each do |poem|
words = poem.poem_column.split
count = 0
words.each do |word|
count += 1 if word.upcase.include?(word.upcase)
end
@results[poem] = count # to get each poem using word ruby
end
И чтобы подсчитывать поэты в Поэма модели
@poets = poems.select("distinct(poet_id)")
@poets.each do |poet|
@poets_word_count << poems.where("poet_id = #{poem.poet_id}").count
end
Где стихи около 50к. его занимает почти более 1 минуты. Я знаю, что делаю неправильно, но я не смог его оптимизировать каким-либо другим способом.
Я думаю, что нижеприведенные строки занимают слишком много времени, когда они зацикливают каждое слово из всех стихотворений.
words.each do |word|
count += 1 if word.upcase.include?(word.upcase)
end
Может кто-нибудь из вас показать мне путь к оптимизации it.As отсутствия знаний в запросах я не мог сделать это в любой другой форме.
Заранее спасибо
Знаешь, где уходит больше всего времени: получение поэтов? получение числа вхождений для искомого слова внутри poem_column? – juanpastas
Оба взяли время, но искали слово внутри poem_column, беря больше. [Столбец poem содержит до 20 строк] – devudilip
Рассмотрите возможность использования [SQLite3 Full Text Search] (http://www.sqlite.org/fts3.html). –