#php #mysql #search
#php #mysql #Поиск
Вопрос:
Мне нужно реализовать опцию поиска пользовательских комментариев, которые хранятся в базе данных MySQL. Я бы оптимально хотел, чтобы он работал аналогично стандартной поисковой системе веб-страницы, но я стараюсь избегать крупномасштабных решений. Я хотел бы просто получить представление о запросах, которые дали бы мне достойные результаты. Есть предложения? Спасибо.
Комментарии:
1. Взгляните на документы: dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
2. Это не совсем то, для чего создан SQL.
3. Конечно, я нигде в своем тексте не использовал вопросительный знак. Вопрос в том, есть ли у кого-нибудь какие-либо предложения относительно того, как я мог бы это сделать?
Ответ №1:
Можно создать полноценное решение для индексации с помощью нескольких простых шагов. Вы могли бы создать таблицу, которая сопоставляет слова каждому сообщению, а затем при поиске некоторых слов находить все сообщения, которые соответствуют.
Вот краткий алгоритм:
- Когда комментарий опубликован, преобразуйте строку в нижний регистр и разделите ее на слова (разделите пробелами и, необязательно, тире / пунктуацией).
- В таблице «words» сохраните каждое слово с идентификатором, если его еще нет в таблице. (Здесь вы можете проигнорировать такие распространенные слова, как «the» или «for».)
- В таблице «indexedwords» сопоставьте идентификаторы слов, которые вы только что вставили, с идентификатором публикации комментария (или статьи, если это то, что вы хотите вернуть).
- При поиске разделите поисковый запрос на слова и найдите все записи, содержащие каждое из слов. (Опять же, здесь вы можете захотеть игнорировать общие слова.)
- Упорядочите результаты по количеству вхождений. Если результаты должны содержать все слова, вам нужно будет найти объединение ваших разных массивов записей.
Ответ №2:
В качестве точки входа вы можете использовать MySQL ПОДОБНЫЕ запросы.
Например, если у вас есть таблица ‘comments’ со столбцом с именем ‘comment’, и вы хотите найти все комментарии, содержащие слово ‘red’, используйте:
SELECT comment FROM comments WHERE comment LIKE '% red %';
Пожалуйста, обратите внимание, что полнотекстовый поиск может быть медленным, поэтому, если ваша база данных очень большая или если вы часто выполняете этот запрос, вам захочется найти оптимизированное решение, такое как Sphinx (http://sphinxsearch.com ).
Комментарии:
1. Я на самом деле не беспокоюсь о скорости или эффективности, но я хотел бы иметь возможность также учитывать фразу, такую как «нетбук для поездки в Eluna». Но вот тут я немного теряюсь. Я мог бы разобрать строку и выполнить LIKE для каждого термина, но мне, вероятно, не нужны результаты для каждого экземпляра слова «for». Как это обычно обрабатывается?
2. Если вы хотите выполнить поиск по всей фразе, инкапсулируйте ее в одно предложение LIKE: ВЫБЕРИТЕ комментарий Из комментариев, ГДЕ комментарий LIKE ‘% netbook for Eluna trip %’;
3. Но что, если они неправильно напишут слово во фразе, например «netbok», означает ли это, что результаты не возвращаются?
4. Совпадения будут точными, поэтому неправильно написанные слова будут соответствовать только комментариям с таким же неправильным написанием. Процесс реализации функции «Вы имели в виду …» (ala Google Search) чрезвычайно сложен, и вам, вероятно, следует начать с использования стороннего инструмента для предоставления такой услуги. Если вы решите использовать свой собственный, вам нужно будет создать базу данных слов, связанных с их распространенными ошибками в написании, и ссылаться на этот словарь при каждом поиске.
5. Я думаю, что после изучения предложений полнотекстовый поиск — это решение, которое я искал.