Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Логика поиска по базе данных сайта
 
 автор: NIK   (26.12.2006 в 23:16)   письмо автору
 
 

Хочу добавить к своему скрипту поиска по сайту функцию выбора логики И / ИЛИ (как на этом формуе). Но не понимаю, какой запрос составлять при И, а какой при ИЛИ. Почему-то мне так кажется, что при ИЛИ нужно использовать LIKE, а при И разбивать сроку на подстроки по пробелу и использовать поиск MATCH...AGAINST по индексам FULLTEXT (yj как именно тоже не понимаю, MATCH...AGAINST OR MATCH...AGAINST или MATCH...AGAINST AND MATCH...AGAINST). Просветите меня пожалуйста :)

PS: и можно ли вместо ИЛИ использовать "хотя бы одно слово", а вместо И "все слова" ?

   
 
 автор: cheops   (27.12.2006 в 00:51)   письмо автору
 
   для: NIK   (26.12.2006 в 23:16)
 

Всё правильно, полнотекстовый поиск выдаст результат даже если найдёт совпадение лишь с одним словом в запросе... что соответствует логике ИЛИ. Однако обычно и для И идля ИЛИ фраза разбивается на отдельные слова, а далее используется либо LIKE либо полнотектовый поиск. Вы движитесь правильно.

>PS: и можно ли вместо ИЛИ использовать "хотя бы одно слово", а вместо И "все слова" ?
Да, более того, вменяемому человеку так будет даже понятнее...

   
 
 автор: NIK   (27.12.2006 в 13:10)   письмо автору
 
   для: 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)   письмо автору
 
   для: 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 в 14:39)   письмо автору
 
   для: NIK   (27.12.2006 в 13:10)
 

извиняюсь за повтор, глюк какой-то с форумом..

   
 
 автор: XPraptor   (29.12.2006 в 03:51)   письмо автору
 
   для: 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 то слова без плюсов в начале организовывай, он вернет тебе все записи с любым из слов.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования