Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: поиск на сайте

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: алгоритм
LEONeso
Отправлено: 18 Марта, 2011 - 15:21:50
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Здравствуйте, испытываю проблему в написании простого поиска.

Цель:
обработать поисковый запрос типа "я пишу, этот запрос, так"
status='1' AND text LIKE '%Я%' AND text LIKE '%пишу%' OR status='1' AND text LIKE '%этот%' AND text LIKE '%запрос%' OR status='1' AND text LIKE '%так%'

пробел - AND
запятая - OR


пробую так, но не работает:
PHP:
скопировать код в буфер обмена
  1.           $search="я пишу, этот запрос, так";
  2.                 $search=explode(",",$search);
  3.                 $where="WHERE ";
  4.                 for ($i=1; $i<count($search); $i++) {
  5.                 $where .= ($search[$i-1]=='' || $i=='1'?'':" OR ")." status='1' AND ";
  6.                         $search_two=explode(" ",trim($search[$i-1]));
  7.                         echo $search[$i-1];
  8.                         for ($o=1; $o<=count($search[$i-1]) && $search_two[$o]!=''; $o++) {
  9.                                 $where .="text LIKE '%".$search_two[$o-1]."%'".(empty($search_two[$o])?' AND ':' ');
  10.                                 }
  11.                                 if ($o<=count($search_two) && $i<=count($search) && strcspn($search[$i-1],' ')==false) {
  12.                                         $where .="text LIKE '%".trim($search[$i-1])."%'";
  13.                                         }
  14.                         }        echo $where;


т.е. поиск идет в 1 таблице и в 1 текстовой ячейке.

Возможно, кто-то сталкивался с такой задачей?

так же стоит учитывать множественные пробельные знаки типа: "я пишу, этот _тут несколько пробелов_ запрос, так", у меня таким образом выдается ошибка т.к. text LIKE '%%'

--
таблица
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `smayly`.`test` (
  2. `id` INT NOT NULL AUTO_INCREMENT ,
  3. `text` TEXT NOT NULL ,
  4. `status` ENUM( '1', '2' ) NOT NULL ,
  5. PRIMARY KEY ( `id` )
  6. ) ENGINE = MYISAM ;


возможно легче обработать строку регулярным? (с этим проблема)

(Отредактировано автором: 18 Марта, 2011 - 15:29:00)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
Viper
Отправлено: 18 Марта, 2011 - 15:42:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




LEONeso все ненужное из строки естно убрать проще регуляркой.
LEONeso пишет:
обработать поисковый запрос типа "я пишу, этот запрос, так"

вам нужно получить совпадения по каждому слову или по всей фразе?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Stierus Супермодератор
Отправлено: 18 Марта, 2011 - 15:58:09
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Вы хотите запрос или приведение строки к запросу?
 
My status
 Top
LEONeso
Отправлено: 18 Марта, 2011 - 16:30:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




Ну один запрос это до запятой, разделяется пробелами (AND - и) т.е. ищется совпадения каждого слова в тексте, далее, запятая - это уже второй запрос (OR - или).
(Добавление)
Если так посудить, то от регулярки требуется:
1. убрать множественные пробелы (не более одного пробела меж словами).
2. в начале строки поставить WHERE status='1'
3. обработать слово text LIKE 'слово'
4. обработать пробел ,если он есть AND
5. обработать слово после пробела text LIKE 'слово'
6. обработать запятую (если она есть) OR status='1'
7. обработать шаг 2-6 и т.д.
8. обработать конец строки, убрав знаки препинания, пробелы и т.п.

я просто не представляю какая будет регулярка и это даже сложно понять как её написать.

(Отредактировано автором: 18 Марта, 2011 - 16:38:21)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
DlTA
Отправлено: 18 Марта, 2011 - 18:45:05
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




та вроде все просто
PHP:
скопировать код в буфер обмена
  1. $inStr = preg_replace("/\s+/"," ",$inStr);
  2. $orArr = explode(",",trim($inStr));
  3.  
  4. $orWhere=array();
  5. foreach($orArr as $orUn)
  6. {
  7.  $andArr =  explode(" ",trim($orUn));
  8.  $andWhere=array();
  9.  foreach($andArr as $andUn)
  10.  {
  11.   // а тут уже формируем части запроса к базе
  12.   $andWhere[]="`поле в котором ищем` LIKE '%$andUn%'";
  13.  }
  14.  $orWhere[]="(".implode(" AND ",$andWhere).")";
  15. }
  16. $reqWHERE = implode(" or ",$orWhere);
  17. // $reqWHERE - и есть часть условия запроса в которой запрашивается нужные элементы

(Добавление)
на входе
PHP:
скопировать код в буфер обмена
  1. $inStr = "пишу слова, еще слова";

на выходе
CODE (SQL):
скопировать код в буфер обмена
  1. (`pole` LIKE '%пишу%' AND `pole` LIKE '%слова%') OR (`pole` LIKE '%еще%' AND `pole` LIKE '%слова%')

(Отредактировано автором: 18 Марта, 2011 - 18:56:43)

 
 Top
Champion Супермодератор
Отправлено: 18 Марта, 2011 - 19:50:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




LEONeso пишет:
status='1' AND text LIKE '%Я%'... OR status='1' AND text LIKE '%этот%' AND text LIKE '%запрос%' OR status='1' AND text LIKE '%так%'
Какая интересная штуковина.
Во-первых, зачем повторяться? Во-вторых надо не забывать про скобки.
LEONeso пишет:
"я пишу, этот _тут несколько пробелов_ запрос, так"
Строку предварительно можно разбить:
$words = preg_split('/[^a-z\dа-яё]+/i',$text);
Еще, наверное, неплохо узнать про такую вещь как стемминг.

А еще можно искать не лайком, полнотекстовым поиском. В mysql полнотекстовый поис поддерживает только myisam, поэтому поиск можно реализовать с помощью Sphinx'a.
Всё.
 
 Top
EuGen Администратор
Отправлено: 18 Марта, 2011 - 19:51:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




... А я бы, как всегда, порекомендовал sphinx. Тут и стемминг, и морфология, и.. да что перечислять, можно просто посмотреть:
http://sphinxsearch[dot]com/

Надо, наверное, здесь на форуме урок по sphinx писать - так как он уже в некотором роде почти стандарт в сфере "легкого поиска" (как и некоторые другие вещи, ставшие почти эталоном в web-разработке - наподобие memcached)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LEONeso
Отправлено: 18 Марта, 2011 - 23:01:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010  
Откуда: Россия, Москва


Помог: 1 раз(а)




EuGen, ни разу не слышал об этом =) было бы интересно почитать и попробовать (если дойдет)


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
EuGen Администратор
Отправлено: 18 Марта, 2011 - 23:03:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Постараюсь выкроить время и написать по sphinx краткий (или, может, развернутый) мануал или статью. Может, даже приведу конкретные цифры из нагрузочных тестов. Но пока, к сожалению, не могу точно обещать.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Марта, 2011 - 00:25:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
memcached

Мммм... Очень хотелось бы поговорить об этом.
Могу в "пользовательских функциях" темку поднять по этому поводу.
 
 Top
EuGen Администратор
Отправлено: 19 Марта, 2011 - 00:41:01
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




По поводу memcached, возможно, тоже стоит написать статью. Просто там не очень сложно и материала полно в интернете.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DeepVarvar Супермодератор
Отправлено: 19 Марта, 2011 - 01:32:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




EuGen пишет:
материала полно

Но там либо обобщенные примеры, либо узкая специализация.
Мне хотелось бы некоторое осветить некоторое кол-во примеров для возможных задач.
0. Правильная настройка (это очень важно).
1. Кеширование переменной.
2. Кеширование массива... или ...кеширование его значений по отдельности?
3. Блокировка на чтение/запись "ячейки данных" (ну не поддердивается сейчас)
4. Ожидание чтения.

В новой версии - да, блокировка при перезаписи поддерживается, но эта версия nonstable...
Отписал класс в "пользовательских ф-циях" для работы с memcached.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB