Я работаю над страницей «расширенного поиска» на сайте, где вы должны ввести ключевое слово, например «Мне нравятся яблоки», и она может выполнять поиск в базе данных, используя следующие параметры:
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, и я не знаю, какое максимальное количество предложений может быть.






Вы могли бы использовать
По крайней мере, с одним из слов
SELECT * FROM myTable WHERE field LIKE '%$keyword%'
or field LIKE '%$keyword2%'
or field LIKE '%$keyword3%';
Без слова
SELECT * FROM myTable WHERE field NOT LIKE '%$keyword%';
Вероятно, есть предел, но я никогда не достигал его и делал гораздо дольше операторов where, но чем больше вы добавляете, тем медленнее будет запрос, а like особенно медленный.
Практического предела нет. Если у вас есть другие предложения WHERE, заключите поиск по ключевым словам в скобки: "WHERE something = x AND (поле LIKE ... OR поле LIKE ... OR ...)
Я не уверен, что вы могли бы легко использовать эти параметры поиска наивным образом, как два других.
Было бы неплохо внедрить лучшую поисковую систему, если вам нужно поддерживать эти сценарии. Простой, который, вероятно, мог бы вас обойти, - это что-то в этом роде:
Когда элемент добавляется в базу данных, он разбивается на отдельные слова. На этом этапе удаляются «общие» слова (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. Таким образом, вы выбираете между согласованностью транзакций или поиском.
Если вы дадите некоторый исходный код, который показывает, как две функции (т.е. все слова и без слов) могут быть выполнены с полным текстом, я могу принять ваш ответ.
Я был бы рад предоставить вам образец кода. Если вы можете сказать мне, есть ли в вашей форме поиска два отдельных поля для с и без, или вы используете одно поле? Если это одно поле, вы можете просто разрешить пользователю добавлять слова, которые нужно исключить, с помощью знака -.
Это всего лишь одно поле, и они могут выбрать любой из 4 вариантов (т.е. 1 слово, точные слова, как минимум 1 слово, без термина).
Хорошо, я буду публиковать несколько примеров кода, основанных на этом, в ближайшее время.
Giraffe и Re0sless прислали 2 хороших ответа.
заметки: «SELECT *» отстой ... выбирайте только те столбцы, которые вам нужны. Re0sless ставит «ИЛИ» между ключевыми словами. - вы должны исключить общеупотребительные слова ("", "я", "я", "... и т. д.) - mysql имеет ограничение на размер запроса 8kb, поэтому для действительно длинных SELECTS вы должны разделить его на отдельные запросы. - попробуйте исключить повторяющиеся ключевые слова (если я ищу «вы знаете, что вам это нравится», SELECT должен в основном искать только «вы» один раз и исключать общие слова как «оно»)
Также попробуйте использовать «LIKE» и «MATCH LIKE» (см. Справочную страницу mysql), это может творить чудеса при «нечетком» поиске.
См. Мою правку выше. Как вы думаете, это хорошее решение, т.е. есть ли ограничение на количество предложений OR, которые можно добавить в запрос?