Добрый день. Есть таблица tPost, в ней хранятся заголовки постов. Есть таблица tSearch, в ней хранятся "наборы поисковых слов", например "набор Google" это: Google, Gmail, Android. Нужно из tPost выбирать заголовки, в которых есть хотя бы одно слово из набора, для которого ищутся посты. На ум сразу приходит лобовое решение: СЕЛЕКТом выбрать все слова для данного набора из tSearch в массив. $res = mysql_query (SELECT * FROM tPost WHERE queryBundle_name = "$queryBundle_name"); search_arr = mysql_fetch_array ($res); Получили массив search_arr [0] = 'Google'; search_arr [1] = 'Gmail'; search_arr [2] = 'Android'; И дальше брать каждое слово из массива и искать его в заголовках, хранящихся в tPost. Но мне кажется, что должно быть более изящное решение. Что-то вроде "Если любое слово из строки Б присутствует в строке А, то ОК". Есть возможность составить такой запрос к MySQL? Или реализовать на уровне PHP? PS: И, видимо, в зависимости от выбранного решения станет понятно, как лучше хранить "наборы запросов": как одну строку ($query = "Google, Gmail, Android", или каждое слово в отдельной колонке? В общем, буду признателен советам, какой дорожкой пойти Спасибо!
Re: Как оптимально искать в строке любое слово из другой стр Есть два разных подхода: - полнотестовый поиск, нативный MySQL/PgSQL, Sphinx и др. и - поиск в таблице распарсенных постов. если бы был очевидный и безоговорочный чемпион в этом деле, то выбора уже не было бы ))) Sphinx крут, но доступен не везде. я мало с ним знаком, поэтому no comment. расскажу про второй вариант. нужна процедура индексации: при этом составляется глобальная таблица слов и таблица сылок пост-слово. при поиске искомые слова сравниваются не с постами напрямую, а с таблицей имеющихся слов, это очень эффективно. затем для совпадений добываются ссылки на посты. структуру таблиц можешь подглядеть например здесь: http://fluxbb.org/docs/v1.5/dbstructure там таблицы, начинающиеся на search*
Re: Как оптимально искать в строке любое слово из другой стр Идею понял. Спасибо! Очень круто. Но правильно я понимаю, что давая ответ вы держали фокус на правильное построение системы с потенциально высокими нагрузками? А если дело о системе с небольшим объемом данных? И речь скорее, как сформировать неизбыточный код. Меня вот "нативный MySQL" заинтересовал: правильно я понимаю, что все-таки есть возможность написать некий SQL запрос, который будет решать эту задачу, пусть и не оптимально? Или проблема в том, что такого способа нет и надо в любом случае разбирать на запчасти и заголовки, и запросы, а дальше - вопрос об оптимальной стратегии манипулирования этими частями? Если возможность решить эту задачу каким-то хитрым SQL запросом есть, буду признателен подсказкам. Ну и в любом случае спасибо! Это отличная пища для размышлений! ))
Re: Как оптимально искать в строке любое слово из другой стр Вот как я сделал (работает): Код (Text): // Создаем демонстрационный массив ("набор поисковых слов"): $search_arr = array ("Facebook", "Airbnb", "Google"); // Выбираем все заголовки из базы: $sel = mysql_query("SELECT post_title FROM tPost"); // Разбираем массив с заголовками по строкам while ($row = mysql_fetch_array($sel, MYSQL_ASSOC)) { $post_title = $row['post_title']; // Берем по очереди каждое слово из массива с "набором слов" foreach ($search_arr as $search_word) { // Если хотя бы одно слово из массива есть в строке заголовка, то печатаем, если нет - берем следующий заг. if ($pos = strpos($post_title, $search_word)) { echo $post_title . "</br>"; } } Все работает. Но мне интуитивно кажется, что есть возможность решить эту задачу каким-то составным SQL запросом и уменьшить количество PHP, что по идее и на скорости должно позитивно сказаться. Ну, или скажите мне, что это и так ОК, и я успокоюсь )) Спасибо!
Re: Как оптимально искать в строке любое слово из другой стр я считаю что задача должна сначала решаться, а уже потом оптимизироваться. так что, нормуль. конечно это ужасно ))). но если в таблице 100 строк то практически пофигу. а "годное" решение ты уже знаешь. для собственного развития попробуй все способы, какие найдешь. менее ужасно было бы сделать в запросе WHERE post_title LIKE '%слово%'. правда здесь (как и в твоем решении) есть недостаток — ты будешь искать, например, "сок", а найдешь "сосок" и "сокращение". нет возможности ограничиться точным совпадением. ну и медленно, да. что пофигу есть еще регулярки в SQL запросах, забавно, но они чувствительны к регистру и совсем медленные. дальше можешь попробовать MySQL FULLTEXT SEARCH и т.д.
Re: Как оптимально искать в строке любое слово из другой стр когда уже совсем дозреешь - sphinx search Добавлено спустя 48 секунд: Re: Как оптимально искать в строке любое слово из другой строки? а зря, там пять минут разбираться. могу дать рекомендации + конфиг, если выложишь на форум свой успех с пошаговым описанием.
Re: Как оптимально искать в строке любое слово из другой стр Про sphinx я читал, + как-то смотрел видео с выступлением кого-то из Dostavka.ru, где он рассказывал, как они внедряли sphinx (и почему). Очень позитивные впечатления остались. Но в моей реальности, в рамках проекта, над которым я сейчас работаю, до sphinx я дойду в лучшем случае через пару тройку месяцев, а то и через год )) Но если уж дойду - отпишусь тут за рекомендациями и советами )) Спасибо!
Re: Как оптимально искать в строке любое слово из другой стр Заинтриговали! А сколько времени уйдет, чтобы сконфигурировать под него запросы, которые сейчас у меня написали для PHP/MySQL? Ну или как это правильно назвать... Вот есть у меня сейчас пусть и неоптимальный код (см выше), который соответствует моему уровню владения темой. А если я установлю sphinx, то как вы оцениваете, насколько сложно "переподключиться" на него? Написать запросы, связать с PHP так, чтобы он решал мою задачу? В общем, если все не так страшно, как кажется, готов пробовать ))
Re: Как оптимально искать в строке любое слово из другой стр Попробуй сам. денёк займёт от начала до конца. а то и меньше. вот тебе удобный альяс для экспериментов, который переиндексирует заново. приспособишь. Код (Text): alias resphinx='service searchd stop;indexer --config /etc/sphinx/sphinx.conf --all;service searchd start'