За последние 24 часа нас посетили 36668 программистов и 1707 роботов. Сейчас ищут 1009 программистов ...

Как оптимально искать в строке любое слово из другой строки?

Тема в разделе "PHP для новичков", создана пользователем bocharsky, 22 апр 2014.

  1. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Добрый день.
    Есть таблица 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";), или каждое слово в отдельной колонке?

    В общем, буду признателен советам, какой дорожкой пойти

    Спасибо!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Как оптимально искать в строке любое слово из другой стр

    Есть два разных подхода:
    - полнотестовый поиск, нативный MySQL/PgSQL, Sphinx и др. и
    - поиск в таблице распарсенных постов.
    если бы был очевидный и безоговорочный чемпион в этом деле, то выбора уже не было бы )))

    Sphinx крут, но доступен не везде. я мало с ним знаком, поэтому no comment.

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

    структуру таблиц можешь подглядеть например здесь: http://fluxbb.org/docs/v1.5/dbstructure там таблицы, начинающиеся на search*
     
  3. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Re: Как оптимально искать в строке любое слово из другой стр

    Идею понял. Спасибо! Очень круто.

    Но правильно я понимаю, что давая ответ вы держали фокус на правильное построение системы с потенциально высокими нагрузками?
    А если дело о системе с небольшим объемом данных? И речь скорее, как сформировать неизбыточный код. Меня вот "нативный MySQL" заинтересовал: правильно я понимаю, что все-таки есть возможность написать некий SQL запрос, который будет решать эту задачу, пусть и не оптимально?

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

    Если возможность решить эту задачу каким-то хитрым SQL запросом есть, буду признателен подсказкам.

    Ну и в любом случае спасибо! Это отличная пища для размышлений! ))
     
  4. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Re: Как оптимально искать в строке любое слово из другой стр

    Вот как я сделал (работает):

    Код (Text):
    1.  
    2.        // Создаем демонстрационный массив ("набор поисковых слов"):
    3.  
    4.     $search_arr = array ("Facebook", "Airbnb", "Google");
    5.  
    6.     // Выбираем все заголовки из базы:
    7.  
    8.     $sel = mysql_query("SELECT post_title FROM tPost");
    9.  
    10.     // Разбираем массив с заголовками по строкам
    11.  
    12.     while ($row = mysql_fetch_array($sel, MYSQL_ASSOC)) {
    13.         $post_title = $row['post_title'];
    14.            
    15.             // Берем по очереди каждое слово из массива с "набором слов"
    16.                 foreach ($search_arr as $search_word) {
    17.                     // Если хотя бы одно слово из массива есть в строке заголовка, то печатаем, если нет - берем следующий заг.
    18.                     if ($pos = strpos($post_title, $search_word)) {
    19.                         echo $post_title . "</br>";
    20.                     }
    21.  
    22.                 }
    Все работает. Но мне интуитивно кажется, что есть возможность решить эту задачу каким-то составным SQL запросом и уменьшить количество PHP, что по идее и на скорости должно позитивно сказаться.

    Ну, или скажите мне, что это и так ОК, и я успокоюсь ))

    Спасибо!
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: Как оптимально искать в строке любое слово из другой стр

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

    для собственного развития попробуй все способы, какие найдешь.

    менее ужасно было бы сделать в запросе WHERE post_title LIKE '%слово%'. правда здесь (как и в твоем решении) есть недостаток —
    ты будешь искать, например, "сок", а найдешь "сосок" и "сокращение". нет возможности ограничиться точным совпадением. ну и медленно, да. что пофигу ;) есть еще регулярки в SQL запросах, забавно, но они чувствительны к регистру и совсем медленные.

    дальше можешь попробовать MySQL FULLTEXT SEARCH
    и т.д.
     
  6. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Re: Как оптимально искать в строке любое слово из другой стр

    Спасибо
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Как оптимально искать в строке любое слово из другой стр

    когда уже совсем дозреешь - sphinx search ;)

    Добавлено спустя 48 секунд:
    Re: Как оптимально искать в строке любое слово из другой строки?
    а зря, там пять минут разбираться. могу дать рекомендации + конфиг, если выложишь на форум свой успех с пошаговым описанием.
     
  8. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Re: Как оптимально искать в строке любое слово из другой стр

    Про sphinx я читал, + как-то смотрел видео с выступлением кого-то из Dostavka.ru, где он рассказывал, как они внедряли sphinx (и почему). Очень позитивные впечатления остались.
    Но в моей реальности, в рамках проекта, над которым я сейчас работаю, до sphinx я дойду в лучшем случае через пару тройку месяцев, а то и через год ))
    Но если уж дойду - отпишусь тут за рекомендациями и советами ))

    Спасибо!
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Как оптимально искать в строке любое слово из другой стр

    десять минут на это уходит
     
  10. bocharsky

    bocharsky Новичок

    С нами с:
    18 апр 2014
    Сообщения:
    77
    Симпатии:
    1
    Re: Как оптимально искать в строке любое слово из другой стр

    Заинтриговали!

    А сколько времени уйдет, чтобы сконфигурировать под него запросы, которые сейчас у меня написали для PHP/MySQL? Ну или как это правильно назвать... Вот есть у меня сейчас пусть и неоптимальный код (см выше), который соответствует моему уровню владения темой. А если я установлю sphinx, то как вы оцениваете, насколько сложно "переподключиться" на него? Написать запросы, связать с PHP так, чтобы он решал мою задачу?

    В общем, если все не так страшно, как кажется, готов пробовать ))
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Как оптимально искать в строке любое слово из другой стр

    Попробуй сам. денёк займёт от начала до конца. а то и меньше.

    вот тебе удобный альяс для экспериментов, который переиндексирует заново. приспособишь.
    Код (Text):
    1. alias resphinx='service searchd stop;indexer --config /etc/sphinx/sphinx.conf --all;service searchd start'