2010-01-21 2 views
0

Я пытаюсь возвращать результаты больше как поискRails: Хороший алгоритм поиска

Мой Curren алгоритм это

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) Удаление левой буквы "убий по рельсам" .. "илы"

2) Удаление правильные буквы "Рубин на железной дороге" .. "Rub"

3) Удаление левого и правого буквы «uby on Rails», «uby on Rail» ... «on»

4) Используя только 3 буквы «Rub», «uby», «by», «yo», «on» ... "ils"

Полезно использовать эти 4 способа? Там больше?

+0

Я не совсем уверен, что вы пытаетесь сделать, но похоже, что все, что соответствует 1 - 3, также будет соответствовать 4. – mckeed

+0

Я пытаюсь найти похожие слова в поиске –

+0

Похожий по смыслу или подобный в орфографии? Если орфография на самом деле все, о чем вы заботитесь, я бы пошел с идеей Levenshtein Distance, о которой упоминал @AlexReisner. В противном случае, идите с реальной поисковой системой. В любом случае, я не думаю, что вы получите очень благоприятные результаты, обрезая ведущие/трясущиеся буквы из ваших поисковых запросов. – pkaeding

ответ

6

Почему вы удаляете эти буквы? Вы пытаетесь убедиться, что если кто-то ищет «виджеты», вы также будете соответствовать «виджету»?

Если так, то, что вы пытаетесь сделать, называется 'stemming', и это действительно намного сложнее, чем удаление ведущих и завершающих букв. Вы также можете быть заинтересованы в удалении 'stop words' из вашего запроса. Это те самые распространенные слова, которые необходимы для формирования грамматически правильных предложений, но не очень полезны для поиска, такие как «a», «the» и т. Д.

Получение прав поиска - очень сложная и сложная проблема , Я бы предположил, что вы не пытаетесь решить его самостоятельно, а вместо этого сосредоточьтесь на основной цели вашего сайта. Возможно, вы можете использовать функцию поиска из проекта Lucene в своем коде. Эта ссылка также может быть полезной для using Lucene in Ruby on Rails.

Я надеюсь, что это поможет; Я понимаю, что я как-то перепутал ваш первоначальный вопрос, но я бы не стал рекомендовать это самостоятельно.

+0

Это то, что мы называем хорошим советом. – jonnii

+0

solr выглядит очень хорошо, я думаю, что буду использовать его. :) –

+1

Прохладный, я рад, что это помогло! – pkaeding

2

Как говорит pkaeding, стебли слишком сложны, чтобы попытаться реализовать себя. Однако, если вы хотите искать похожие (не точные) строки в MySQL, а условия поиска пользователей очень близки к полному значению поля базы данных (т. Е. Вы не ищете большой текст текста для слова или фраза), вы можете попробовать использовать Levenshtein distance. Вот MySQL implementation.

Алгоритм Levenshtein позволит вам выполнить «нечеткое» совпадение, дать вам оценку подобия и помочь вам избежать установки и настройки демон-поиска, что сложно. Тем не менее, это действительно только для очень конкретного случая, а не для общего поиска по сайту.

+0

Это хорошая идея, если она подходит для ваших целей. Я буду отмечать эту ссылку :) – pkaeding

+0

Этот алгоритм кажется интересным, но я думаю, что это не сработает для моего дела. Во всяком случае, закладки. –

1

Хотя все были предполагающие другие возможные решения, проверьте:

Sphinx - Как реализовать полнотекстовый поиск для этой таблицы 10+ миллионов строк, идти в ногу с нагрузкой, и оставаться актуальными? Сфинкс хорош в таких загадках.

Thinking Sphinx - Рубиновый соединитель между Sphinx и ActiveRecord.

+0

, но sphinx будет искать похожие слова? –