Лучший способ создать ИНТЕЛЛЕКТУАЛЬНУЮ поисковую систему MySQL и PHP?
Каков наилучший способ построения поиска в MySQL и PHP?
В настоящее время я использую такие вещи, как
%термин%
Я хочу, чтобы он мог найти результат, даже если они пишут его немного неправильно, например:
Значение поля= "Один: Остановка магазина:
Они ищут:
Остановка в одном магазине
ИЛИ
Магазин с одним окном
И т. Д. Я хочу действительно умный поиск, чтобы они находили информацию, даже если они не ищут точную вещь.
Каков наилучший способ создания такого интеллектуального поиска?
4 answers
like '%term%'
ужасно медленный и неоптимизированный, вы можете добавить полный текст для этого столбца и использовать для этого логический режим
Такие как
match(column) against('+One +Shop +Stop' in boolean mode)
Обратите внимание, что минимальная длина слова равна 4, поэтому вам нужно рассмотреть возможность изменения ее на три, а полнотекстовый поиск доступен только для myisam
Другая поисковая система с открытым исходным кодом, такая как sphinx, также идеально подходит для этого
Поиск по необработанным данным не может быть наиболее эффективным. Этот вид текстового поиска зависит от того, как индексируются данные (именно здесь для Google используется бот Google).
Итак, шаг 1 - индексирование. Если ваши данные находятся на некоторых веб-страницах, вы можете использовать доступные стандартные искатели (или даже легко создать свой собственный искатель, я бы предложил python для создания искателя). Если ваши данные находятся в каком-либо файле (недоступном для просмотра в Интернете), то для индексирования вам необходимо написать программу для чтения всех данных и проиндексируйте их.
Шаг 2 - это поиск. Подход к поиску зависит от стратегии индексирования.
Если вы ищете систему на основе php-mysql, просмотрите коды этих проектов:
Если вы хотите узнать больше, поищите в архивах публикаций IEEE Xplore/ACM. Вы получите множество статей, опубликованных на эту тему.
АДЖреал прав...просто подумал, что я хотел бы добавить пример, чтобы помочь:
$query = sprintf("SELECT *, "
. " MATCH(data) AGAINST('%s' IN BOOLEAN MODE) AS relevance "
. " FROM table_name"
. " ORDER BY relevance DESC LIMIT 20 ",
Надеюсь, это поможет
Вы можете использовать функцию SOUNDEX(), она доступна как в PHP, так и в MYSQL SOUNDEX() с MYSQL