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

Форум MySQL

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

 

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

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

тема: Проверить базу на вхождение слова в составное слово
 
 автор: Port_Artur1   (04.06.2008 в 19:34)   письмо автору
 
 

Например есть слово и база существующих слов

вводим слово парламент - получаем

парламент
парламент
парламент

подсвеченные слова есть в базе нужно только проверить слово на их (слов из базы) вхождение в него и вывести с подсветкой на экран .
Для удобства можно фильтровать слова длиной равной или менее данного - понятно же что слово длиной 8 букв не может входить в слово длиной 7 или 5 букв
Есть идеи?

   
 
 автор: Port_Artur1   (04.06.2008 в 21:29)   письмо автору
 
   для: Port_Artur1   (04.06.2008 в 19:34)
 

можно перебирать все записи бвзы проверять с помощью strpos и потом подсвечивать вхождения $otvet = str_replace($zapros, "<b>".$zapros."</b>", $otvet);

А можно ли составить запрос к базе чтобы в результате сразу были слова входящие в искомое слово. Я просто не знаю поэтому спрашиваю может есть более простой способ чем перебор всех значений в базе. Просто значений в базе более 100000 и немного долго, учитывая что проверяемых слов на вхождение слов из базы порядка 2-3 тысяч. а надо чтобы оперативно.

   
 
 автор: Port_Artur1   (04.06.2008 в 22:26)   письмо автору
 
   для: Port_Artur1   (04.06.2008 в 21:29)
 

HELP!

   
 
 автор: Port_Artur1   (05.06.2008 в 10:45)   письмо автору
 
   для: Port_Artur1   (04.06.2008 в 22:26)
 

Мало того что медленно , ещё и не работает

 $prefix = preg_replace("|[^\d\(\)-+]|", "", $prefix);

                 echo "<tt>$prefix<br/>\r\n</tt>";
                dbConnect();
                $result = mysql_query( "SELECT word FROM word" ) or error( mysql_error() );
                 $totalMsg = mysql_num_rows( $result );
                       echo ($totalMsg."c");
                       $i=1;
              if( $totalMsg != 0 )
              {
                 while( $row = mysql_fetch_array( $result ) )

                {        $i++;
                      if (strpos($prefix,$row['word']) !== false)
                     {
                      $otvet = str_replace($row['word'], "<b>".$row['word']."</b>",$prefix);
                    //  echo ($row);
                      echo ($otvet."x");
                        }
                 }
                 }


таблица создаётся и заполняется
 $word = "CREATE TABLE word
    (
        id_word MEDIUMINT UNSIGNED NOT NULL auto_increment,
        word VARCHAR(7) NOT NULL,
        PRIMARY KEY (id_word)
    )";

с таблицей всё нормально смотрел поле word заполнено во всех записях, а работать не хочет


на экране печатает только количество записей в базе - всё то что выбрали.
и больше ничего и очень очень медленно даже на localhost а через 30 секунд прерывается т.к. не хватает времени.

Неужели нельзя сделать быстрей, А?

   
 
 автор: Port_Artur1   (05.06.2008 в 11:15)   письмо автору
 
   для: Port_Artur1   (05.06.2008 в 10:45)
 

как оказалось работает но не доходит до результата поэтому и не печатает ничего.

Как ускорить процесс?

Помогите!

   
 
 автор: KPETuH   (05.06.2008 в 11:34)   письмо автору
 
   для: Port_Artur1   (05.06.2008 в 11:15)
 

а полнотекстовый поиск вас не устраивает?

   
 
 автор: Port_Artur1   (05.06.2008 в 11:36)   письмо автору
 
   для: KPETuH   (05.06.2008 в 11:34)
 

Мне нужно проверить не наличие слова подобного введённому в базе, А проверка слов из базы на вхождение в слово котороее вводит пользователь. Пример вверху.

Если укого есть примеры как это сделать быстро и качественно буду только благодарен!

   
 
 автор: olejek   (05.06.2008 в 12:04)   письмо автору
 
   для: Port_Artur1   (05.06.2008 в 11:36)
 

Насчет быстро не знаю, проверьте!

<?$string "парламент";
$min_count 3;    //минимальное количество символов в слове
$max_count strlen($string)+1;    //максиальное количество символов в слове

if ($max_count $min_count)
    {
    
//составляем массив всех возможных слов, которые могут встериться в исходном слове
    
for ($count $min_count$count $max_count$count++)
        for (
$i=0$i<strlen($string)-$count+1$i++)
            
$part_array[] = '"'.substr($string$i$count).'"';    
    
    
$part_string implode(','$part_array);
    
//получится
    //"пар","арл","рла","лам","аме","мен","ент","парл","арла","рлам","ламе","амен","мент","парла",
    //"арлам","рламе","ламен","амент","парлам","арламе","рламен","ламент","парламе","арламен",
    //"рламент","парламен","арламент","парламент"

    
$query mysql_query ("select word from word where word in ($part_string)") or die (mysql_error());
    while (
$qr mysql_fetch_array($query))
        {
        
$otvet str_replace($qr[0], "<b>".$qr[0]."</b>",$string);
        echo 
$otvet."<br>";
        }
    }
?>

   
 
 автор: Port_Artur1   (05.06.2008 в 12:56)   письмо автору
 
   для: olejek   (05.06.2008 в 12:04)
 

!

   
 
 автор: KPETuH   (05.06.2008 в 12:13)   письмо автору
 
   для: Port_Artur1   (05.06.2008 в 11:36)
 

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

   
 
 автор: Port_Artur1   (05.06.2008 в 13:35)   письмо автору
 
   для: KPETuH   (05.06.2008 в 12:13)
 

olejek спасибо за пример скорость повысилась значительно хотя хочется ещё быстрее, но к сожалению результат такой

вводим - agrod

получаем что оно может состоять из двух слов - "agro","grod"

результат выборки из базы - 0 совпадений

А базе слво "agro" есть - 6-я запись из нескольких тысяч.

 <?

dbConnect
();

                      
//    echo  $prefix;
                
$min_count 4;    //минимальное количество символов в слове
                
$max_count strlen($prefix)+1;    //максиальное количество символов в слове

                
if ($max_count $min_count)
                    {
                    
//составляем массив всех возможных слов, которые могут встериться в исходном слове
                    
for ($count $min_count$count $max_count$count++)
                        for (
$i=0$i<strlen($prefix)-$count+1$i++)
                            
$part_array[] = '"'.substr($prefix$i$count).'"';

                    
$part_string implode(','$part_array);

                    echo (
$part_string."-");//получится
                    //"agro","grod" 
                    //  echo ($part_string);
                    
$query mysql_query ("SELECT word FROM word WHERE word in ($part_string)") or error (mysql_error());
                  
//  echo $query;
                    //  $result = mysql_query( "SELECT word FROM word" ) or error( mysql_error() );
                     //  $totalMsg = mysql_num_rows( $result );
                     //  echo ($totalMsg."c");



                      
$totalMsg mysql_num_rows($query);
                    echo (
$totalMsg."c");
                  
//     $i=1;
                        
if( $totalMsg != )
                      {
                       while (
$qr mysql_fetch_array($query))
                        {
                        
$otvet str_replace($qr['word'], "<b>".$qr['word']."</b>",$prefix);
                        echo 
"<tt>$otvet<br/>\r\n</tt>";
                        }
                      }
                   }

?>


Что то нигде не могу найти пример с этим оборотом

WHERE word in ($part_string)


Хотя и ошибок не выдаёт!

   
 
 автор: olejek   (05.06.2008 в 14:09)   письмо автору
 
   для: Port_Artur1   (05.06.2008 в 13:35)
 

Ну не знаю, не знаю. У меня такой код вывел:
"agr","gro","rod","agro","grod","agrod"-1cagrod

Ищите ошибку в другом месте, может при передаче переменных.

Из справочника MySQL:

expr IN (value,...) 

Returns 1 if expr is equal to any of the values in the IN list, else returns 0. 
If all values are constants, they are evaluated according to the type of expr and sorted. 
The search for the item then is done using a binary search. 
This means IN is very quick if the IN value list consists entirely of constants. 
Otherwise, type conversion takes place according to the rules described in Section 10.2.2,
 “Type Conversion in Expression Evaluation”, but applied to all the arguments. 

mysql> SELECT 2 IN (0,3,5,7);
        -> 0
mysql> SELECT 'wefwf' IN ('wee','wefwf','weg');
        -> 1

   
 
 автор: Port_Artur1   (05.06.2008 в 15:29)   письмо автору
 
   для: olejek   (05.06.2008 в 14:09)
 

нашёл ошибку оказывается длина слов в базе из 4 букв = 5 , видимо в конце или пробел или ещё что то



   $fm=file('file.txt');
    foreach ($fm as $value){

    mysql_query( "INSERT INTO word ( word )
     VALUES ( '$value')" )
             or error( mysql_error() );
 }



Как избавиться от лишних символов при создании базы?

   
 
 автор: olejek   (05.06.2008 в 15:34)   письмо автору
 
   для: Port_Artur1   (05.06.2008 в 15:29)
 

Используйте функцию trim()

   
 
 автор: Port_Artur1   (05.06.2008 в 16:22)   письмо автору
 
   для: olejek   (05.06.2008 в 15:34)
 

Перед последним сообщением также использовал эту функцию, но база отказывалась создаваться почему не знаю.
А сейчас всё нормально работает.
Щас займусь дальнейшей доработкой идеи.

Огромное Вам спасибо за помощь!

   
 
 автор: Port_Artur1   (06.06.2008 в 10:54)   письмо автору
 
   для: Port_Artur1   (05.06.2008 в 16:22)
 

Всё работает,
но может можно что-то подправить в коде что-бы работало быстрее
а то иногда не укладывается в 30 секунд,
а надо бы побыстрее.

   
 
 автор: Port_Artur1   (06.06.2008 в 13:57)   письмо автору
 
   для: Port_Artur1   (06.06.2008 в 10:54)
 

Спасибо всё устраивает, так как упростил в другом месте, а в этом теперь быстрее звука!

   
Rambler's Top100
вверх

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