Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: что можно использовать вместо LIKE (искать похожие слова-теги)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Lolya
Отправлено: 13 Июня, 2021 - 22:00:38
Post Id


Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018  


Помог: 2 раз(а)




Собственно есть таблица, в ней ячейка keywords с ключевыми словами-тегами, перечисленными через запятую для каждой новой строчки-новости.
Пример таблицы (урезанный):

CODE (htmlphp):
скопировать код в буфер обмена
  1. CREATE TABLE `movies` (
  2.   `id` mediumint(7) unsigned NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(175) NOT NULL DEFAULT '',
  4.   `keywords` varchar(3072) NOT NULL,
  5.   `image1` varchar(15) NOT NULL,
  6.   `descr` varchar(5000) NOT NULL,
  7.   `descr_html` varchar(5000) NOT NULL,
  8.   `fulldescr` text NOT NULL,
  9.   `fulldescr_html` text NOT NULL,
  10.   `category` tinyint(1) unsigned NOT NULL DEFAULT '0',
  11.   `added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  12.   `comments` tinyint(3) unsigned NOT NULL DEFAULT '0',
  13.   `owner` mediumint(5) unsigned NOT NULL DEFAULT '0',
  14.   `allow_comments` enum('yes','no') NOT NULL DEFAULT 'yes',
  15.   `dostup` enum('adm','mod','upl','vip','uhd','1080p','user') NOT NULL DEFAULT 'mod',
  16.   PRIMARY KEY (`id`),
  17.   UNIQUE KEY `indexss` (`added`) USING BTREE,
  18.   UNIQUE KEY `name_added` (`added`,`name`) USING BTREE,
  19.   UNIQUE KEY `category_added` (`category`,`added`) USING BTREE,
  20.   KEY `index` (`added`,`id`,`name`,`image1`,`category`,`owner`,`dostup`) USING BTREE,
  21.   KEY `keywords` (`keywords`(333)),
  22.   KEY `index_bookmarks` (`added`,`id`,`name`,`image1`,`category`,`owner`,`dostup`) USING BTREE
  23. ) ENGINE=MyISAM AUTO_INCREMENT=295 DEFAULT CHARSET=utf8;


для поиска по словам-тегам:
CODE (htmlphp):
скопировать код в буфер обмена
  1. WHERE t.keywords LIKE '%мама%' ORDER BY t.added DESC LIMIT 0,25


Запрос выходит проблемный очень. Грузит сильно мускуль, в таблице много строк - около 1500 и будет еще больше со временем. Индексы есть, но хочется убрать этот костыль и как-то по другому поиск организовать.

Есть мысль о внешней (другой) таблице, где будут все теги и искать там, получая цифру-ID и по ней уже искать в таблице movies. Но это опять вопрос - как именно?

Кто что подскажет?

Заранее спасибо.
 
 Top
don.bidon
Отправлено: 13 Июня, 2021 - 22:39:23
Post Id


Гость


Покинул форум
Сообщений всего: 79
Дата рег-ции: Март 2019  


Помог: 2 раз(а)




Таблица тегов: `id` ~int (primary key), `tag` varchar
Таблица связей: `id_tag` ~int, `id_movie` ~int
Сами додумаете?

(Отредактировано автором: 13 Июня, 2021 - 22:39:59)

 
 Top
Lolya
Отправлено: 13 Июня, 2021 - 23:16:51
Post Id


Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018  


Помог: 2 раз(а)




don.bidon пишет:
Сами додумаете?

Один черт через LIKE искать? Без него никак ? Я под старый пых пока делаю - FastCGI (Nginx + PHP-FPM) PHP 5.4.45

Под ПЫХ 8.0.3 то на Редбине проще поиск оформить, тут-же подумать надо...
 
 Top
don.bidon
Отправлено: 14 Июня, 2021 - 00:29:29
Post Id


Гость


Покинул форум
Сообщений всего: 79
Дата рег-ции: Март 2019  


Помог: 2 раз(а)




Есть варики, но там гугл в помощь, а по тегам я бы на полное соответствие искал.
 
 Top
Lolya
Отправлено: 14 Июня, 2021 - 06:23:21
Post Id


Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018  


Помог: 2 раз(а)




don.bidon пишет:
Есть варики, но там гугл в помощь, а по тегам я бы на полное соответствие искал.

Пробовали, не выходит. Гугл пока ничего не нашел лучше чем лайкать.

Чтобы понимали о чём идёт речь, вот страница всех релизов с поиском: https://github[dot]com/lolyworlds/Lo[dot][dot][dot]aster/browse.php
Вот доп.страница функции построения строк: https://github[dot]com/lolyworlds/Lo[dot][dot][dot]torrenttable.php

Теперь идём дальше. Пришла мысль такая:
Искать ид для тега через лайк. То-есть запрос будет только такой:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Select id from torrents where keywords like '%$search%'
  3.  

Потом подключать к уже найденному результату все остальные обвесы. Вот думаю как это реализовать с подгрузкой доп.запросов.

Я так думаю что в этом варианте поиска только ид через лайк тега будет индекс пользоваться и не нагружаться сильно мускуль поиском по тысячам строкам.

Есть идеи как это провернуть?
 
 Top
don.bidon
Отправлено: 14 Июня, 2021 - 08:32:29
Post Id


Гость


Покинул форум
Сообщений всего: 79
Дата рег-ции: Март 2019  


Помог: 2 раз(а)




если ничего не путаю, при LIKE индексуй-не индексуй, всё равно без индекса буде
а по поводу запросов, вначале запроса на выборку DESCRIBE подставляем и смотрим, что происходит, какие индексы используются и прочее.

> Есть идеи как это провернуть?
Какой бюджет?
 
 Top
Lolya
Отправлено: 14 Июня, 2021 - 09:21:22
Post Id


Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018  


Помог: 2 раз(а)




don.bidon пишет:
если ничего не путаю, при LIKE индексуй-не индексуй, всё равно без индекса буде
а по поводу запросов, вначале запроса на выборку DESCRIBE подставляем и смотрим, что происходит, какие индексы используются и прочее.

> Есть идеи как это провернуть?
Какой бюджет?


Нет, индекс будет использоваться для поля тегов

>Бюджет: €0.00000000000 Улыбка
Я не на продажу, видите же что на ГИТ выложено обновлениями бесплатно. Есть конечно свои моды, которые не будут в свободном доступе, но именно этот фришный.

Итак, идея назрела, чуток обмозговала. И.... Ерунда получилась. Показываю по вариантам.
_--------
Вариант 1.
Запрос:
PHP:
скопировать код в буфер обмена
  1. Select id from torrents where keywords like '%$search%'

Получаем ид, потом в торрент-табле.пхп подключать через него весь основной обвес старого запроса в цикле. Но это выходит не 1 запрос на страницу с 25 фильмами, а 1+25=26. Да, они будут быстрыми по исполнению, но 25!!! Короче этот вариант попа*.

Вариант 2.
Получать опять же через запрос ид, но впихнуть в array(); - список ид, которые потом скормить второму запросу, который будет уже цикличным и выдавать результат по 25 фильмов на страницу с всего 2 запросами...
Как-то так:

Осталось написать цикл для списка составления этих ид.
Надеюсь правильно мысль толкнула, поймёте?

Вариант 3. Неверный как по мне.
Запрос в запросе. Выборка всего основного запроса по ид что берем в этом же запросе второй выборкой.
PHP:
скопировать код в буфер обмена
  1. select torrents.*, bookmarks.*, users.* from torrents, bookmarks, users where id = (Select id from torrents where keywords like '%$search%')

Ну, как то так примерно. Но на таком варианте будет только один фильм всегда на выходе. Вроде так, поправьте если ошиблась.

(Отредактировано автором: 14 Июня, 2021 - 09:28:12)

 
 Top
Мелкий Супермодератор
Отправлено: 14 Июня, 2021 - 15:44:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Lolya пишет:
Нет, индекс будет использоваться для поля тегов

don.bidon совершенно прав. Речь совершенно определённо о mysql, значит совершенно рядовой btree и никаких триграмных индексов. btree не может эффективно ускорять like '%const%' запросы.
Планировщик в принципе может сказать, что пойдёт в индекс - но лишь чтобы прочитать полностью весь индекс потому что он чуть компактнее чем вся таблица.

Lolya пишет:
Получаем ид, потом в торрент-табле.пхп подключать через него весь основной обвес старого запроса в цикле. Но это выходит не 1 запрос на страницу с 25 фильмами, а 1+25=26. Да, они будут быстрыми по исполнению

Не будут. Даже на смешных объёмах данных в сотни тысяч строк.

Lolya пишет:
перечисленными через запятую для каждой новой строчки-новости

Сначала приведите в нормальную форму.
Затем уже можно думать, какую дальнейшую задачу необходимо решать. Поиск по тегам? В нормальной форме элементарен.
Похожие слова как подсказка ввода? Это like 'const%' обычно, чудесно работающие по btree т.к. префиксный поиск.
Похожие теги относительно того тега что сейчас смотрит пользователь? Отдельная таблица, из веба только читаемая, а заполняемая асинхронно в фоне (крон, брокер очередей, etc)

К примерно половине индексов показанных в начале темы есть вопросы "зачем оно вам понадобилось".


-----
PostgreSQL DBA
 
 Top
Lolya
Отправлено: 15 Июня, 2021 - 11:20:11
Post Id


Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018  


Помог: 2 раз(а)




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

(Отредактировано автором: 26 Июня, 2021 - 20:23:50)

 
 Top
Lolya
Отправлено: 26 Июня, 2021 - 20:25:08
Post Id


Гость


Покинул форум
Сообщений всего: 69
Дата рег-ции: Май 2018  


Помог: 2 раз(а)




Вопрос решен, просьба закрыть тему.
Сделана отдельная таблица с id, keywords, name. По ней поиск в 10 раз быстрее чем по основной странице.
 
 Top
Строитель Модератор
Отправлено: 11 Июля, 2021 - 23:34:09
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Lolya пишет:
просьба закрыть тему
Ок )
Тема закрыта!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB