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

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

Найти: со всеми словами, с точной фразой, с хотя бы одним из слов, без слов

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

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, и я не знаю о максимальном количестве предложений, которые могут быть.

Я бы предложил использовать MySQL FullText Search, используя это с помощью функции Boolean Full-Text Searches, с которой вы сможете получить желаемый результат.

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

Запрошенный пример основан на ваших запрошенных условиях («Его только одно поле и они могут выбрать один из 4 вариантов (например, одно слово, точные слова, как минимум 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)"); } ?> 

надеюсь, что это поможет для полного использования операторов в логических совпадениях см. Boolean Full-Text Searches

Вы можете использовать

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

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

Без слова

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

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

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

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

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

Поиск, как известно, трудно сделать хорошо.

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

Жираф и ReOsless pooseted 2 хорошие ответы.

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

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