Как интегрировать функциональность "Вы имели в виду" в rails?

Как вы можете реализовать "Вы имели в виду:", как Google делает в некоторых поисковых запросах?

PS: Я использую sphinx в своем продукте. Можете ли вы предложить, как я могу это реализовать. Любые руководства или предложения для некоторых других поисковых систем, которые имеют эту функциональность, наиболее приветствуются. Я использую rails2.3.8, если это помогает

Одно решение может быть:

Сделайте словарь известных "ключевых слов" или "фраз", а в действии поиска, если ничего не найдено, запустите вторичный запрос в этом словаре. Обновите этот словарь всякий раз, когда создается запись для поиска, скажем, сообщение в блоге или имя пользователя.

  • query = "supreman"

  • dictionary = [ "superman", "batman", "hanuman"...] (в таблице DB)

  • поиск (запрос)

  • Если результатов нет, то

искать в словаре (где "ключевое слово" LIKE-запрос или "фраза" LIKE-запрос) = > "супермен"

Проверьте документацию sphinx или solr. Они могут лучше реализовать этот запрос "Like", который возвращает соответствие%.

  • display → Вы имели в виду "superman"?

Но дело в том, как сделать его эффективным?

Ответ 1

Посмотрите на алгоритм дистанции Damerau-Levenshtein. Он вычисляет "расстояние" между двумя строками и определяет, сколько шагов требуется для преобразования одной строки в другую. Чем меньше шагов, тем ближе две строки.

В этой статье описывается алгоритм, реализованный как хранимая функция MySQL.

Алгоритм намного лучше, чем LIKE или SOUNDEX.

Я считаю, что Google использует данные, полученные из источников, а не алгоритм. т.е. если пользователь вводит в abcd, нажимает на кнопку "Назад", а затем немедленно ищет abd, тогда устанавливается связь между двумя условиями поиска, так как пользователь не был доволен результатами. Когда у вас будет очень большой поиск сообщества, появится шаблон.

Ответ 3

Я думаю, вы ищете алгоритмы соответствия строк.

Я помню mislav gist, используемый для повышения ошибок, когда инициализация была слегка ошибочной. Это может быть хорошо прочитано.

Кроме того, взгляните на некоторые из статей, которые он предлагает:

Ответ 4

Теперь дни означали, что функция реализована на основе фонетического корректора заклинаний. Когда мы ошибаемся, мы обычно пишем фонетически похожие слова. Исходя из этой идеи, фонетический корректор заклинаний ищет свою базу данных для наиболее похожего слова. Связи сходства нарушаются с использованием контекста (для многословного запроса другие слова также помогают в определении правильного слова) и популярности слова. Если два слова фонетически очень близки к слову с ошибкой, чем слово, которое соответствует контексту и чаще используется в повседневной жизни, выбирается.

Ответ 5

это работает для меня:

SELECT * FROM table_name WHERE soundex(field_name) LIKE CONCAT('%', soundex('searching_element'), '%')