Страница Php / MySql "Расширенный поиск"

Я работаю над страницей «расширенного поиска» на сайте, где вы должны ввести ключевое слово, например «Мне нравятся яблоки», и она может выполнять поиск в базе данных, используя следующие параметры:

Find : With all the words, With the exact phrase , With at least one of the words, Without the words

Я могу позаботиться о "Точной фразе" с помощью:

SELECT * FROM myTable WHERE field='$keyword';

«Хотя бы одно из слов»:

SELECT * FROM myTable WHERE field LIKE '%$keyword%';//Let me know if this is the wrong approach

Но это «С хотя бы одним из слов» и «Без слов», на которых я застрял.

Любые предложения о том, как реализовать эти два?

Редактировать: Что касается «По крайней мере одно слово», было бы не лучшим подходом использовать explode (), чтобы разбить ключевые слова на слова и запустить цикл для добавления

(field='$keywords') OR ($field='$keywords) (OR)....

Потому что в запросе есть и другие предложения AND / OR, и я не знаю, какое максимальное количество предложений может быть.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
11 166
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы могли бы использовать

По крайней мере, с одним из слов

SELECT * FROM myTable WHERE field LIKE '%$keyword%' 
or field LIKE '%$keyword2%' 
or field LIKE '%$keyword3%';

Без слова

SELECT * FROM myTable WHERE field NOT LIKE '%$keyword%';

См. Мою правку выше. Как вы думаете, это хорошее решение, т.е. есть ли ограничение на количество предложений OR, которые можно добавить в запрос?

Click Upvote 02.01.2009 15:05

Вероятно, есть предел, но я никогда не достигал его и делал гораздо дольше операторов where, но чем больше вы добавляете, тем медленнее будет запрос, а like особенно медленный.

Re0sless 02.01.2009 15:07

Практического предела нет. Если у вас есть другие предложения WHERE, заключите поиск по ключевым словам в скобки: "WHERE something = x AND (поле LIKE ... OR поле LIKE ... OR ...)

Greg 02.01.2009 15:08

Я не уверен, что вы могли бы легко использовать эти параметры поиска наивным образом, как два других.

Было бы неплохо внедрить лучшую поисковую систему, если вам нужно поддерживать эти сценарии. Простой, который, вероятно, мог бы вас обойти, - это что-то в этом роде:

Когда элемент добавляется в базу данных, он разбивается на отдельные слова. На этом этапе удаляются «общие» слова (the, a и т. д.) (Возможно, на основе таблицы common_words). Остальные слова добавляются в таблицу слов, если их еще нет. Затем устанавливается связь между вводом слова и записью элемента.

Затем при поиске происходит получение идентификаторов слов из таблицы слов и соответствующий поиск идентификаторов элементов в объединяющей таблице.

Ответ принят как подходящий

Я бы посоветовал использовать Полнотекстовый поиск MySQL, используя его с функциональностью Логический полнотекстовый поиск, чтобы вы могли получить желаемый результат.

Редактировать:

Запрошенный пример основан на ваших запрошенных условиях («Это всего лишь одно поле, и они могут выбрать любой из 4 вариантов (т.е. 1 слово, точные слова, по крайней мере 1 слово, без термина)»).

Я предполагаю, что вы используете php на основе вашего первоначального сообщения

<?php
$choice = $_POST['choice'];
$query = $_POST['query'];

if ($choice == "oneWord") {
    //Not 100% sure what you mean by one word but this is the simplest form
    //This assumes $query = a single word
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "exactWords") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('\"{$query}\"' IN BOOLEAN MODE)");
} elseif ($choice == "atLeastOneWord") {
    //The default with no operators if given multiple words will return rows that contains at least one of the words
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('{$query}' IN BOOLEAN MODE)");
} elseif ($choice == "withoutTheTerm") {
    $result = mysql_query("SELECT * FROM table WHERE MATCH (field) AGAINST ('-{$query}' IN BOOLEAN MODE)");
}
?>

надеюсь, что это поможет в полной мере использовать операторы в логических совпадениях, см. Логический полнотекстовый поиск

+1, это лучший ответ, но я бы также подробно остановился на том, что полный текст в mysql доступен только для таблиц myisam, а не для таблиц innodb. Таким образом, вы выбираете между согласованностью транзакций или поиском.

Adriano Varoli Piazza 02.01.2009 15:29

Если вы дадите некоторый исходный код, который показывает, как две функции (т.е. все слова и без слов) могут быть выполнены с полным текстом, я могу принять ваш ответ.

Click Upvote 02.01.2009 15:38

Я был бы рад предоставить вам образец кода. Если вы можете сказать мне, есть ли в вашей форме поиска два отдельных поля для с и без, или вы используете одно поле? Если это одно поле, вы можете просто разрешить пользователю добавлять слова, которые нужно исключить, с помощью знака -.

Mark Davidson 02.01.2009 16:06

Это всего лишь одно поле, и они могут выбрать любой из 4 вариантов (т.е. 1 слово, точные слова, как минимум 1 слово, без термина).

Click Upvote 02.01.2009 17:08

Хорошо, я буду публиковать несколько примеров кода, основанных на этом, в ближайшее время.

Mark Davidson 02.01.2009 18:10

Известно, что поиск - это трудная задача.

Вам следует рассмотреть возможность использования сторонней поисковой системы, использующей что-то вроде Lucene или Сфайдер.

Giraffe и Re0sless прислали 2 хороших ответа.

заметки: «SELECT *» отстой ... выбирайте только те столбцы, которые вам нужны. Re0sless ставит «ИЛИ» между ключевыми словами. - вы должны исключить общеупотребительные слова ("", "я", "я", "... и т. д.) - mysql имеет ограничение на размер запроса 8kb, поэтому для действительно длинных SELECTS вы должны разделить его на отдельные запросы. - попробуйте исключить повторяющиеся ключевые слова (если я ищу «вы знаете, что вам это нравится», SELECT должен в основном искать только «вы» один раз и исключать общие слова как «оно»)

Также попробуйте использовать «LIKE» и «MATCH LIKE» (см. Справочную страницу mysql), это может творить чудеса при «нечетком» поиске.

Другие вопросы по теме