Покинул форум
Сообщений всего: 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 '%так%'
т.е. поиск идет в 1 таблице и в 1 текстовой ячейке.
Возможно, кто-то сталкивался с такой задачей?
так же стоит учитывать множественные пробельные знаки типа: "я пишу, этот _тут несколько пробелов_ запрос, так", у меня таким образом выдается ошибка т.к. text LIKE '%%'
Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008 Откуда: Москваль
Помог: 52 раз(а)
Вы хотите запрос или приведение строки к запросу?
LEONeso
Отправлено: 18 Марта, 2011 - 16:30:54
Посетитель
Покинул форум
Сообщений всего: 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. обработать конец строки, убрав знаки препинания, пробелы и т.п.
я просто не представляю какая будет регулярка и это даже сложно понять как её написать.
Покинул форум
Сообщений всего: 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.
Всё.
EuGen
Отправлено: 18 Марта, 2011 - 19:51:49
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
... А я бы, как всегда, порекомендовал sphinx. Тут и стемминг, и морфология, и.. да что перечислять, можно просто посмотреть: http://sphinxsearch[dot]com/
Надо, наверное, здесь на форуме урок по sphinx писать - так как он уже в некотором роде почти стандарт в сфере "легкого поиска" (как и некоторые другие вещи, ставшие почти эталоном в web-разработке - наподобие memcached)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
LEONeso
Отправлено: 18 Марта, 2011 - 23:01:01
Посетитель
Покинул форум
Сообщений всего: 499
Дата рег-ции: Янв. 2010 Откуда: Россия, Москва
Помог: 1 раз(а)
EuGen, ни разу не слышал об этом =) было бы интересно почитать и попробовать (если дойдет)
----- Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
EuGen
Отправлено: 18 Марта, 2011 - 23:03:20
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Постараюсь выкроить время и написать по sphinx краткий (или, может, развернутый) мануал или статью. Может, даже приведу конкретные цифры из нагрузочных тестов. Но пока, к сожалению, не могу точно обещать.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DeepVarvar
Отправлено: 19 Марта, 2011 - 00:25:58
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
EuGen пишет:
memcached
Мммм... Очень хотелось бы поговорить об этом.
Могу в "пользовательских функциях" темку поднять по этому поводу.
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
По поводу memcached, возможно, тоже стоит написать статью. Просто там не очень сложно и материала полно в интернете.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
DeepVarvar
Отправлено: 19 Марта, 2011 - 01:32:39
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
EuGen пишет:
материала полно
Но там либо обобщенные примеры, либо узкая специализация.
Мне хотелось бы некоторое осветить некоторое кол-во примеров для возможных задач.
0. Правильная настройка (это очень важно).
1. Кеширование переменной.
2. Кеширование массива... или ...кеширование его значений по отдельности?
3. Блокировка на чтение/запись "ячейки данных" (ну не поддердивается сейчас)
4. Ожидание чтения.
В новой версии - да, блокировка при перезаписи поддерживается, но эта версия nonstable...
Отписал класс в "пользовательских ф-циях" для работы с memcached.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.