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

Форум PHP

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

 

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

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

тема: логика поиска
 
 автор: moonfox   (10.08.2009 в 19:24)   письмо автору
 
 

подскажите пожалуйста как построена логика поиска:
вводим в поле, например, фразу ааа ббб ввв, и выборка вернет искомую строку из БД и при ааа ббб ввв и при ббб ааа ввв и при ввв ааа ббб - тоесть любом чередование двух, трех и более слов из запроса.

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

  Ответить  
 
 автор: t3ma   (10.08.2009 в 19:32)   письмо автору
 
   для: moonfox   (10.08.2009 в 19:24)
 


<?php
WHERE poisk
='$slova'
?>

  Ответить  
 
 автор: moonfox   (10.08.2009 в 19:40)   письмо автору
 
   для: t3ma   (10.08.2009 в 19:32)
 

так будет искать только жестко введенную строку и при перестановке местами слов не выдаст результата.

  Ответить  
 
 автор: t3ma   (10.08.2009 в 20:02)   письмо автору
 
   для: moonfox   (10.08.2009 в 19:40)
 

<?php 
WHERE poisk
='%$slova%' 
?>

  Ответить  
 
 автор: moonfox   (10.08.2009 в 20:14)   письмо автору
 
   для: t3ma   (10.08.2009 в 20:02)
 

вот что я на писал

<?
function massive($lang$st)
     {
     
     
$in addslashes($st);
     
$sh 0;
     
$str explode(' '$in);
        
       for(
$x 0$x count($str); $x ++)
       {
       
$l strlen($str[$x]);
       if(
$l 2)
                     {
                    
        
$res mysql_query('SELECT `id`, `title_'.$lang.'`, `content_'.$lang.'` FROM `catalog` 
        WHERE `title_'
.$lang.'` LIKE "%'.trim($str[$x]).'%"');
        
        while(
$m mysql_fetch_array($res))
               { 
         
        
$this->out[$sh]['title'] = $m[1];
        
$this->out[$sh]['text'] = stripslashes($m[2]);
        
$this->out[$sh]['id'] = $m['id'];
        
$this->out[$sh]['sort'] = substr_count(strtolower($m[2]),strtolower($str[$x]));
                                            
        
$sh++;
               }
                    } 
       }
     
     function 
compare($a$b)
     {     
     return (
$a['sort'] > $b['sort']) ? -1;
     }
    
     if(
is_array($this->out)) 
                    {
     
usort($this->out'compare');
     return 
$this->out;
                    }
     
     
//print_r($this->out);
     
}

?>

  Ответить  
 
 автор: nikita2206   (11.08.2009 в 00:05)   письмо автору
 
   для: moonfox   (10.08.2009 в 20:14)
 

выглядет ужасающе)

  Ответить  
 
 автор: Trianon   (10.08.2009 в 21:50)   письмо автору
 
   для: moonfox   (10.08.2009 в 19:24)
 

Обычно в таких ситуациях применяют полнотекстовый поиск.
Либо разбирают поисковый запрос на слова, а затем из слов составляют сложное выражение через операцию AND

  Ответить  
 
 автор: nikita2206   (11.08.2009 в 00:07)   письмо автору
 
   для: moonfox   (10.08.2009 в 19:24)
 

смотрите в эту сторону: http://www.mysql.ru/docs/man/Fulltext_Search.html

  Ответить  
 
 автор: moonfox   (11.08.2009 в 01:45)   письмо автору
 
   для: nikita2206   (11.08.2009 в 00:07)
 

знаем про это. у меня 3 буквы, много.

да спасибо разобрался, вот так запрос формирую

<?

function massive($lang$st)
     {
     
     
$in addslashes($st);
     
$sh 0;
     
$str explode(' '$in);
     
     if(
count($str) > 1)
                            {
                               for(
$test 1$test count($str); $test ++)
                                   
$add ' && `title_'.$lang.'` LIKE "%'.trim($str[$test]).'%"';
                            }
       
       
$res mysql_query('SELECT `id`, `title_'.$lang.'`, `content_'.$lang.'` FROM `catalog` 
       WHERE `title_'
.$lang.'` LIKE "%'.trim($str[0]).'%"'.$add);
     
        
       for(
$x 0$x count($str); $x ++)
       {
       
$l strlen($str[$x]);
       
       if(
$l 2)
         {
             
        while(
$m mysql_fetch_array($res))
               { 
              
$this->out[$sh]['id'] = $m['id'];
        
$this->out[$sh]['title'] = $m[1];
        
$this->out[$sh]['text'] = stripslashes($m[2]);        
        
$this->out[$sh]['sort'] = substr_count(strtolower($m[2]),strtolower($str[$x]));
                                                                
                                            
        
$sh++;
               }
          } 
       }
     
     function 
compare($a$b)
     {     
     return (
$a['sort'] > $b['sort']) ? -1;
     }
    
     if(
is_array($this->out)) 
                    {
     
usort($this->out'compare');
     return 
$this->out;
                    }
     
     
//print_r($this->out);
     
}

?>

  Ответить  
 
 автор: Trianon   (11.08.2009 в 01:48)   письмо автору
 
   для: moonfox   (11.08.2009 в 01:45)
 

  $add =  ' && `title_' ... 


Здесь ничего не напутали?

  Ответить  
 
 автор: moonfox   (11.08.2009 в 02:03)   письмо автору
 
   для: Trianon   (11.08.2009 в 01:48)
 

точку пропустил )

  Ответить  
Rambler's Top100
вверх

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