У меня есть веб-сайт, на котором я индексирую информацию о фильмах. Чтобы найти фильм, пользователь может ввести название фильма, и этот запрос будет отправлен в базу данных:
SELECT IMDB, Name, Year, Views
FROM Movies
WHERE Name LIKE '%$search%'
Я использовал функцию «похожий_текст», чтобы исправить небольшие ошибки. Например, если имя «Криминальное чтиво», а пользователь вводит: «Криминальное чтиво», поскольку я не получаю никаких результатов, я запускаю этот небольшой код для каждого фильма.
similar_text($search, $Name, $percent);
if ($percent > $ValMax) {
$ValMax = $percent;
$PosMax = $i;
}
Я использую этот код, так как у меня в базе данных всего пара сотен фильмов, а в будущем их будет около двадцати тысяч. Кроме того, название каждого фильма состоит в среднем из 20 символов, не считая таких фильмов, как Dr. Strangelove, или Как я перестал волноваться и полюбил бомбу
Настоящая проблема начинается с запроса, используемого пользователем: «Капитан Америка» (по-итальянски «Капитан Америка»), где название фильма было «Капитан Америка — Il primo vendicatore».
Используя функцию Левенштейна, я получил ужасные результаты, тогда как с similar_text они были как минимум приличными. Вы можете увидеть полные результаты этого запроса здесь. Я создал эту страницу, чтобы увидеть для каждого поиска, каким будет левенштейн и аналогичный_текст.
Фильм, который был бы выбран, если бы я не поставил блокировку на 60%, был бы «C'era una volta in America» («Однажды в Америке»).
Однако «Капитан Америка» и «Капитан Америка» очень похожи, поэтому мне было интересно, есть ли способ проверить каждое слово. Я также слышал о Lucene, но не знал, с чего начать и подходит ли он для моих нужд.
Спасибо :)