За последние 24 часа нас посетили 17125 программистов и 1630 роботов. Сейчас ищут 1098 программистов ...

Форум. Поисковые запросы и их кеширование.

Тема в разделе "Прочие вопросы по PHP", создана пользователем X-Cray, 23 июл 2006.

  1. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Вопрос №1.

    Полнотекстовый поиск выполняется по такому методу?
    Или есть проще, быстрее и лучше?

    Код (Text):
    1.  
    2. $sql= " SELECT `text`, `theme`, `id` FROM `posts` WHERE `text` LIKE '%".addslashes($word[0])."%' AND/OR `text` LIKE '%".addslashes($word[1])."%' [...]  AND/OR `text` LIKE '%".addslashes($word[...])."%' LIMIT ".$from.", ".$count.";";
    3.  
    4. //естественно, запрос циклом создается, убрав из него короткие слова, спецсимволы и т.д. и т.п., а AND/OR выбираются, исходя из заданной логики запроса.
    5.  
    6. //слова в пределах от 4 до 13 символов, количество слов ограничено тремя.
    7.  
    8. //а поле `text` в таблице указано FULLTEXT и входит в ее PRIMARY
    Вопрос №2
    Если кешировать запросы, то лучше:
    • сохранить в базу список слов, время запроса и ответ поиска. А потом смотреть скриптом, спрашивали ли такие же слова с такими же AND/OR, выводить ответ + искать слова в постах, что были созданы после указанного времени запроса
    • сохранить в базу хеш запроса (вместе с AND/OR между словами), время поиска и ответ поиска. Скрипт делает то же самое, но не учитывает порядок слов - просто сравнивает хеши)
    • те же два варианта, но поиск по новым постам идет, только если кеш в базе старее определенного времени, например, 15 минут.
    • не сохранять ничего в базу, т.к. поиск все-равно надо дополнять еще одной выборкой из базы.

    Вопрос №3

    Стоит ли вкручивать в строку запроса AJAX с "похожими запросами, которые дали результат", чтобы повысить вероятность выбора одного из кешированных результатов. При этом в кеше не хеши, а также запросы, не давшие результата, чтобы AJAX-ом выводить, что ими ничего не найдено?

    Вопрос №4

    Есть ли смысл запретить пользователям (см. ниже кол-во постов - это причина возникновения идеи) искать "по всему форуму", указав обязательным выбор раздела.

    Вопрос №5

    Как ставить LIMIT в случае кеширования запроса для постраничного вывода?
    Ведь все равно на какой странице пользователь, а ответ надо закешировать целиком...


    P.S. (1) На форуме 100 000+ сообщений и растут, как в чате. :roll:
    P.S. (2) В исходники IPB, PHPBB и т.д. и т.п. не отправлять. :!:
    P.S. (3) Идея про "забить на поиск и вставить форму Яндекса" уже была - не подходит. Не предлагать :lol:
     
  2. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
  3. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Спасибо, читал про полнотекстовый, но не такой вариант. :(

    а AJAX относится к форме, куда юзверь вводит слова для поиска.
     
  4. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Первый вопрос отпал.
     
  5. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Чтобы думать про кэши нужно знать, как часто изменяется информация в базе.
    Если часто, то их придется постоянно сбрасывать, только гемор лишний, а пользы ноль.
     
  6. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    ... ну, не как в чате, но за день выходит 100+ точно (минимально).

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

    Насчет сброса кешей я выше предложил делать методом True-Thru на 15 минут, т.е. кеш действителен 15, а дальше его стирают.


    P.S. Чистка базы от таких мелочей производится кроном (для всего сайта хватает 5-ти запросов "DELETE FROM `bla-bla-bla` WHERE `time` < 'bla-bla-bla';".
     
  7. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Неужели никто больше не кинет дельного совета? ;)
     
  8. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    А ты сделай без кэша.
    И если будет тормозить тогда уже заморачивайся.
     
  9. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Понимаешь, "если" не устраивает, это не тот случай, когда можно на время вырубить любую часть сайта :)

    В общем, жду-с остальных мнений, как этот кеш сделать лучше )
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    тебя именно поиск интересует или впринципе кеширование?
     
  11. Vah

    Vah Активный пользователь

    С нами с:
    15 май 2006
    Сообщения:
    228
    Симпатии:
    0
    можно попробовать хранить хеши запросов
    примерно таким образом:
    PHP:
    1.  
    2. <?
    3. $sw=explode(" ", $query);
    4. asort($sw);
    5. reset($sw);
    6. $hash=md5(split("",$sw));
    7. ?>
    8.  
    и хранить такие хеши.....
    хотя я вообще не уверен нужно ли хеширование....
    если делать - то тогда впринципе это довольно сложный механизм..... и вот так за 3 минуты не решается....
     
  12. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Какой смысл хранить 15 минут? За это время эта процедура себя не окупит.
    Как хэшировать? md5()? Эта функция сама по себе весьма тормозная.
    Не тем вы, гражданин, заняты.
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    соглсен. mysql отлично все сам кеширует.
    отведите под кеш побольше памяти и все будет пучком.
     
  14. Vah

    Vah Активный пользователь

    С нами с:
    15 май 2006
    Сообщения:
    228
    Симпатии:
    0
    vasa_c
    ну md5 это к примеру....

    а вобщем согласен с вышесказанным..... mysql сам отлично кеширует запросы.....

    Хотя может возникнуть необходимость кеширования...... но думаю когда она возникнет - сайт уже надо будет глобально переписывать на С++ с оптимизацией всего что можно.... И механизмы кеширования продумывать самому...... Кешировать средствами пхп - дело достаточно малопроизводительное.....

    Я думаю у Вас не Яндекс, где кеширование реально оправдывает затраты времени..... ну а если Яндекс - то думайте сами....... думаю в таком случае девелоперы должны быть толковыми....
     
  15. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    и оплата соответствующая.
     
  16. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Угу, ясно. Спасибо.

    Так, а как насчет поиска в целом?
    Просто использовать MATCH в sql-запросах для полнотекста и на этом остановиться, а MySQL сделает все остальное за меня?
     
  17. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    да
     
  18. X-Cray

    X-Cray Активный пользователь

    С нами с:
    10 июл 2006
    Сообщения:
    255
    Симпатии:
    0
    Адрес:
    Москва
    Ну, тогда все оказалось гораздо проще, чем я ожидал... даже дописывать к коду нечего :) ..

    Что ж, думаю, все вопросы решены. Тему можно закрывать )