Почему не проходит поиск по цифрам? PHP: SELECT image.*, MATCH (hash) AGAINST ("0100011111011001111111100110011111011001001101110111111111001111111101111111111111111111111111111111") AS rel FROM image WHERE MATCH (`hash`) AGAINST ("0100011111011001111111100110011111011001001101110111111111001111111101111111111111111111111111111111" IN BOOLEAN MODE) AND access = '0' order by id desc LIMIT 0,50;
Ты уперся в лимит innodb_ft_max_token_size По дефолту(насколько я знаю) значение = 84 символа ( в твоем запросе 100 символов ). Если искомый текст (слово) в таблице базы данных превышает это кол-во, то оно не будет индексироваться, можешь попробовать использовать например LIKE Либо увеличить значение innodb_ft_max_token_size При тестировании (значения искомых слов/букв достаточно меньше твоего), поиск происходит нормально. Структура: Код (Text): CREATE TABLE `image` ( `id` bigint NOT NULL, `hash` text NOT NULL, `access` smallint NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; Данные: Код (Text): INSERT INTO `image` (`id`, `hash`, `access`) VALUES (1, '0100011111011001111111100110011111011001001101110111111111001111111101111111111111111111111111111111', 0), (2, '333', 0), (3, '4444', 0), (4, '555', 0); Индексы: Код (Text): ALTER TABLE `image` ADD PRIMARY KEY (`id`); ALTER TABLE `image` ADD FULLTEXT KEY `hash` (`hash`); Запрос (вроде как прекрасно работает) Код (Text): SELECT *, MATCH (hash) AGAINST ('+444*' IN BOOLEAN MODE) as REL FROM `image` WHERE MATCH (hash) AGAINST ('+444*' IN BOOLEAN MODE) ORDER BY REL;
для этого создается доп поле и строку 10101 конвертируешь в md5 hash, а не искать в "MySQL" по длиной строке. В добавок - это равноценно что, сохранить изображение в БД
У меня ядерный "затуп" после тяжелого рабочего дня. Можно элементарный пример по описанию? Теоретически я понял, мы сохраняем 1) AAA (t1) 2) md5(AAA) (t2) Используем как md5($_POST["aaa"]) == t2 Какие-то сложности если честно, нужно ли вообще такое кол-во данных в таблице хранить и зачем))
Изначально, у автора есть пред тема, где можно понять зачем ему это всё да и картину всего этого увидеть. Чтобы не искать по БД с задаваемой искомой информации, делается 48 символьный хэш данных. Он служит своего рода короткий адрес, по которому и можно искать данные. Тоже самое как с id. Теперь, автор пытается реализовать поиск этими же данными, но пришел к главной проблеме... Большими данными не рекомендуется искать информацию по БД, т.к. на них тратятся большие ресурсы для обработки и т.д. Что мы делаем ? Мы просто конвертируем данные в md5 48 символьную строку и используем как ссылку. Изи. Другой момент разберем. Откуда автор берет эти 101010101 ? В прошлой теме искал как распознавать изображения. Тобишь 10 это белый/черный пиксель, а у него в изображении 10х10 = 100 пикселей. Эти данные он сохраняет в MySQL - это тоже самое что в бд сохранять данные самой картинки (почти). Я не буду расписывать как иначе бы сделал если юзал MySQL. У меня SQLite для этих целей и храню там данные с быстрым доступом, если происходит обучение. Мне не нужно будет 100 файлов трогать, не нужно будет при обучении в каждой картинке вычитывать 1001 пиксели и сверять с новыми данными на схожесть. Всё заранее подготовлено и с быстрым доступом.
Не стал конвертировать в MD5, т.к. требуется находить приблизительные совпадения, например 11001 и 10001 (совпадение 99%), как это через md5 реализовать не знаю пока