| |
|
|
| | Хочу добавить к своему скрипту поиска по сайту функцию выбора логики И / ИЛИ (как на этом формуе). Но не понимаю, какой запрос составлять при И, а какой при ИЛИ. Почему-то мне так кажется, что при ИЛИ нужно использовать LIKE, а при И разбивать сроку на подстроки по пробелу и использовать поиск MATCH...AGAINST по индексам FULLTEXT (yj как именно тоже не понимаю, MATCH...AGAINST OR MATCH...AGAINST или MATCH...AGAINST AND MATCH...AGAINST). Просветите меня пожалуйста :)
PS: и можно ли вместо ИЛИ использовать "хотя бы одно слово", а вместо И "все слова" ? | |
| |
|
|
| |
|
|
| |
для: NIK
(26.12.2006 в 23:16)
| | | Всё правильно, полнотекстовый поиск выдаст результат даже если найдёт совпадение лишь с одним словом в запросе... что соответствует логике ИЛИ. Однако обычно и для И идля ИЛИ фраза разбивается на отдельные слова, а далее используется либо LIKE либо полнотектовый поиск. Вы движитесь правильно.
>PS: и можно ли вместо ИЛИ использовать "хотя бы одно слово", а вместо И "все слова" ?
Да, более того, вменяемому человеку так будет даже понятнее... | |
| |
|
|
| |
|
|
| |
для: cheops
(27.12.2006 в 00:51)
| | | вот набросал примерную схему, посмотрите пожалуйста, всё ли правильно с логикой? Меня в принципе устраивает, но может быть скрипт можно как-то улучшить?
$search = FormDataCheck($_POST['search'], 62);
if (empty($search) OR $search == "Поиск по сайту") $search = "Поиск по сайту";
echo "<form action='../search/' name='search' method='post'>
<input class='text' type='text' name='search' value='$search' maxlength='50' onClick=this.value='';>
<input class='submit' type='submit' value='Поиск'> <br />
<input type='radio' name='logic[]' value='or' checked><sup>хотя бы одно слово</sup>
<input type='radio' name='logic[]' value='and'><sup>все слова</sup>
<input type='hidden' name='action' value='true'>
</form>";
if (!empty($_POST['action'])) {
# Проверяем на заполнение
if (empty($search) OR $search == "Поиск по сайту") {
echo "<center><b>Введите слова для поиска</b></center>";
} else {
echo "<br /><br /> <center><font class='page_title'><b>Поиск</b></font></center> <br /><br />";
# Выбираем логику
$logic = $_POST['logic'];
if ($logic[0] == "or") {
$search_par = "caption LIKE '%$search% OR description LIKE '%$search%'";
} elseif ($logic[0] == "and") {
# Разделяем фразу для поиска на слова
$word = strtok($search, " ");
while ($word) {
$search_par = $search_par." AND MATCH (caption, description) AGAINST ('$word')";
$word = strtok(" ");
}
$search_par = substr($search_par, 4);
}
# Составляем запрос
$query_sel = "SELECT * FROM goods WHERE $search_par";
# выводим результат ...
}
}
|
| |
| |
|
|
| |
|
|
| |
для: cheops
(27.12.2006 в 00:51)
| | | вот набросал примерную схему, посмотрите пожалуйста, всё ли правильно с логикой? Меня в принципе устраивает, но может быть скрипт можно как-то улучшить?
$search = FormDataCheck($_POST['search'], 62);
if (empty($search) OR $search == "Поиск по сайту") $search = "Поиск по сайту";
echo "<form action='../search/' name='search' method='post'>
<input class='text' type='text' name='search' value='$search' maxlength='50' onClick=this.value='';>
<input class='submit' type='submit' value='Поиск'> <br />
<input type='radio' name='logic[]' value='or' checked><sup>хотя бы одно слово</sup>
<input type='radio' name='logic[]' value='and'><sup>все слова</sup>
<input type='hidden' name='action' value='true'>
</form>";
if (!empty($_POST['action'])) {
# Проверяем на заполнение
if (empty($search) OR $search == "Поиск по сайту") {
echo "<center><b>Введите слова для поиска</b></center>";
} else {
echo "<br /><br /> <center><font class='page_title'><b>Поиск</b></font></center> <br /><br />";
# Выбираем логику
$logic = $_POST['logic'];
if ($logic[0] == "or") {
$search_par = "caption LIKE '%$search% OR description LIKE '%$search%'";
} elseif ($logic[0] == "and") {
# Разделяем фразу для поиска на слова
$word = strtok($search, " ");
while ($word) {
$search_par = $search_par." AND MATCH (caption, description) AGAINST ('$word')";
$word = strtok(" ");
}
$search_par = substr($search_par, 4);
}
# Составляем запрос
$query_sel = "SELECT * FROM goods WHERE $search_par";
# выводим результат ...
}
}
|
| |
| |
|
|
| |
|
|
| |
для: NIK
(27.12.2006 в 13:10)
| | | извиняюсь за повтор, глюк какой-то с форумом.. | |
| |
|
|
| |
|
|
| |
для: NIK
(27.12.2006 в 14:39)
| | | Когда слова разбиваешь, нужно учитывать что тебе могут напихать всякой чуши в запрос.
Сначала очисти запрос от мусора, оставь только буквы и цыфры, потом выровняй пробелы, а потом бей на слова:
$strmsg=eregi_replace("[^A-Za-zА-Яа-я0-9]", " ", $strmsg);
$strmsg=trim($strmsg);
$strmsg=eregi_replace(" ", " ", $strmsg);
|
Потом в цикле иди по словам и выкидывай все короче трех символов.
А остальные организовывай в строку вида "+слово* +слово* +слово*".
Потом делай запрос с IN BOOLEAN MODE, всего один, а не кучу повторов MATCH.
SELECT * FROM table WHERE MATCH (field_name) AGAINST ('+слово* +слово* +слово*' IN BOOLEAN MODE)
|
Он вернет тебе все результаты AND. Если логика OR то слова без плюсов в начале организовывай, он вернет тебе все записи с любым из слов. | |
| |
|
|