• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Хак Отключение поиска по полным новостям

lift

Читатель
Заблокирован
Регистрация
1 Июл 2007
Сообщения
2.222
Реакции
1.487
Возникла такая потребность. Чисто теоретически - отключить отправку запроса из поисковых форм и модулей + дропнуть индексы у поля полной новости, чтоб места не занимали столько.

engine\ajax\search.php
найти
PHP:
$db->query("SELECT id, short_story, title, date, alt_name, category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.approve=1".$this_date." AND (short_story LIKE '%{$query}%' OR full_story LIKE '%{$query}%' OR xfields LIKE '%{$query}%' OR title LIKE '%{$query}%') ORDER by date DESC LIMIT 5");
заменить на
PHP:
$db->query("SELECT id, short_story, title, date, alt_name, category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.approve=1".$this_date." AND (short_story LIKE '%{$query}%' OR xfields LIKE '%{$query}%' OR title LIKE '%{$query}%') ORDER by date DESC LIMIT 5");


engine\modules\search.php
найти
PHP:
$titleonly_where = array ('0' => "MATCH(title,short_story,full_story,xfields) AGAINST ('{story}')",
заменить на
PHP:
$titleonly_where = array ('0' => "MATCH(title,short_story,xfields) AGAINST ('{story}')",

и

найти
PHP:
$titleonly_where = array ('0' => "short_story LIKE '%{story}%' OR full_story LIKE '%{story}%' OR xfields LIKE '%{story}%' OR title LIKE '%{story}%'",
заменить на
PHP:
$titleonly_where = array ('0' => "short_story LIKE '%{story}%' OR xfields LIKE '%{story}%' OR title LIKE '%{story}%'",

С базой не смог придумать ничего умнее, чем дампануть ее и заменить
Код:
DROP TABLE IF EXISTS `dle_post`;
CREATE TABLE `dle_post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `autor` varchar(40) NOT NULL DEFAULT '',
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `short_story` text NOT NULL,
  `full_story` longtext NOT NULL,
  `xfields` text NOT NULL,
  `title` varchar(255) NOT NULL DEFAULT '',
  `descr` varchar(200) NOT NULL DEFAULT '',
  `keywords` text NOT NULL,
  `category` varchar(200) NOT NULL DEFAULT '0',
  `alt_name` varchar(200) NOT NULL DEFAULT '',
  `comm_num` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `allow_comm` tinyint(1) NOT NULL DEFAULT '1',
  `allow_main` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `approve` tinyint(1) NOT NULL DEFAULT '0',
  `fixed` tinyint(1) NOT NULL DEFAULT '0',
  `allow_br` tinyint(1) NOT NULL DEFAULT '1',
  `symbol` varchar(3) NOT NULL DEFAULT '',
  `tags` varchar(255) NOT NULL DEFAULT '',
  `metatitle` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `autor` (`autor`),
  KEY `alt_name` (`alt_name`),
  KEY `category` (`category`),
  KEY `approve` (`approve`),
  KEY `allow_main` (`allow_main`),
  KEY `date` (`date`),
  KEY `symbol` (`symbol`),
  KEY `comm_num` (`comm_num`),
  KEY `tags` (`tags`),
  KEY `fixed` (`fixed`),
  FULLTEXT KEY `short_story` (`short_story`,`full_story`,`xfields`,`title`)
) ENGINE=MyISAM AUTO_INCREMENT=15 /*!40101 DEFAULT CHARSET=utf8 */;
на
Код:
DROP TABLE IF EXISTS `dle_post`;
CREATE TABLE `dle_post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `autor` varchar(40) NOT NULL DEFAULT '',
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `short_story` text NOT NULL,
  `full_story` longtext NOT NULL,
  `xfields` text NOT NULL,
  `title` varchar(255) NOT NULL DEFAULT '',
  `descr` varchar(200) NOT NULL DEFAULT '',
  `keywords` text NOT NULL,
  `category` varchar(200) NOT NULL DEFAULT '0',
  `alt_name` varchar(200) NOT NULL DEFAULT '',
  `comm_num` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `allow_comm` tinyint(1) NOT NULL DEFAULT '1',
  `allow_main` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `approve` tinyint(1) NOT NULL DEFAULT '0',
  `fixed` tinyint(1) NOT NULL DEFAULT '0',
  `allow_br` tinyint(1) NOT NULL DEFAULT '1',
  `symbol` varchar(3) NOT NULL DEFAULT '',
  `tags` varchar(255) NOT NULL DEFAULT '',
  `metatitle` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `autor` (`autor`),
  KEY `alt_name` (`alt_name`),
  KEY `category` (`category`),
  KEY `approve` (`approve`),
  KEY `allow_main` (`allow_main`),
  KEY `date` (`date`),
  KEY `symbol` (`symbol`),
  KEY `comm_num` (`comm_num`),
  KEY `tags` (`tags`),
  KEY `fixed` (`fixed`),
  FULLTEXT KEY `short_story` (`short_story`,`xfields`,`title`)
) ENGINE=MyISAM AUTO_INCREMENT=15 /*!40101 DEFAULT CHARSET=utf8 */;
в дампе и залить обратно его.

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

Собственно пара вопросов:
1) Больше не надо нигде ничего еще выпиливать?
2) Кто накинет человеческий запрос SQL чтоб не через дамп убирать создание индекса? А то набить быстренько демо базу не проблема, но у меня тут лежит уже реально большая база рабочего сайта, с которой через правку дампа это делать сродни идиотизму будет.

В идеале полная новость на сайте должна только для отображения юзеру выдергиваться и то, если ее нет в актуальном кеше движка. Тоесть хочется снизить нагрузку на БД максимально а поиск по полной новости - как раз и есть очень ненужная и замусоривающая выдачу функция.
 
Человеческий запрос SQL:
Код:
ALTER TABLE `dle_post`
DROP INDEX `short_story` ,
ADD FULLTEXT INDEX `short_story` (`short_story`, `xfields`, `title`) ;

Для MyISAM таблица и индексы будут пересоздаваться - для очень больших баз это медленный процесс, наберитесь терпения... Но это явно быстрее чем дампы туда сюда гонять :)
 
Назад
Сверху