За последние 24 часа нас посетили 94674 программиста и 5090 роботов. Сейчас ищут 2234 программиста ...

FULLTEXT не ищет цифры

Тема в разделе "MySQL", создана пользователем zhenia3003, 5 май 2024.

  1. zhenia3003

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

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Почему не проходит поиск по цифрам?
    PHP:
    1. 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;
     
  2. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    93
    Симпатии:
    19
    Ты уперся в лимит innodb_ft_max_token_size
    По дефолту(насколько я знаю) значение = 84 символа ( в твоем запросе 100 символов ).
    Если искомый текст (слово) в таблице базы данных превышает это кол-во, то оно не будет индексироваться, можешь попробовать использовать например LIKE
    Либо увеличить значение innodb_ft_max_token_size

    При тестировании (значения искомых слов/букв достаточно меньше твоего), поиск происходит нормально.

    Структура:
    Код (Text):
    1.  
    2. CREATE TABLE `image` (
    3.   `id` bigint NOT NULL,
    4.   `hash` text NOT NULL,
    5.   `access` smallint NOT NULL DEFAULT '0'
    6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    Данные:
    Код (Text):
    1.  
    2. INSERT INTO `image` (`id`, `hash`, `access`) VALUES
    3. (1, '0100011111011001111111100110011111011001001101110111111111001111111101111111111111111111111111111111', 0),
    4. (2, '333', 0),
    5. (3, '4444', 0),
    6. (4, '555', 0);
    Индексы:
    Код (Text):
    1.  
    2. ALTER TABLE `image`
    3.   ADD PRIMARY KEY (`id`);
    4. ALTER TABLE `image` ADD FULLTEXT KEY `hash` (`hash`);
    Запрос (вроде как прекрасно работает)
    Код (Text):
    1.  
    2. SELECT *,
    3. MATCH (hash) AGAINST ('+444*' IN BOOLEAN MODE) as REL
    4. FROM `image`
    5. WHERE MATCH (hash) AGAINST ('+444*' IN BOOLEAN MODE)
    6. ORDER BY REL;
     
    #2 Survivor, 6 май 2024
    Последнее редактирование: 6 май 2024
  3. zhenia3003

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

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Да, верно, вчера почитал о fulltext, у меня превышена максимальная длина запроса
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    для этого создается доп поле и строку 10101 конвертируешь в md5 hash, а не искать в "MySQL" по длиной строке. В добавок - это равноценно что, сохранить изображение в БД
     
  5. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    93
    Симпатии:
    19
    У меня ядерный "затуп" после тяжелого рабочего дня.
    Можно элементарный пример по описанию?

    Теоретически я понял, мы сохраняем
    1) AAA (t1)
    2) md5(AAA) (t2)
    Используем как md5($_POST["aaa"]) == t2

    Какие-то сложности если честно, нужно ли вообще такое кол-во данных в таблице хранить и зачем))
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    Изначально, у автора есть пред тема, где можно понять зачем ему это всё да и картину всего этого увидеть.

    Чтобы не искать по БД с задаваемой искомой информации, делается 48 символьный хэш данных. Он служит своего рода короткий адрес, по которому и можно искать данные. Тоже самое как с id.

    Теперь, автор пытается реализовать поиск этими же данными, но пришел к главной проблеме... Большими данными не рекомендуется искать информацию по БД, т.к. на них тратятся большие ресурсы для обработки и т.д. Что мы делаем ? Мы просто конвертируем данные в md5 48 символьную строку и используем как ссылку. Изи.
    Другой момент разберем. Откуда автор берет эти 101010101 ? В прошлой теме искал как распознавать изображения. Тобишь 10 это белый/черный пиксель, а у него в изображении 10х10 = 100 пикселей. Эти данные он сохраняет в MySQL - это тоже самое что в бд сохранять данные самой картинки (почти).

    Я не буду расписывать как иначе бы сделал если юзал MySQL.

    2024-05-08_16-18-22.png
    У меня SQLite для этих целей и храню там данные с быстрым доступом, если происходит обучение. Мне не нужно будет 100 файлов трогать, не нужно будет при обучении в каждой картинке вычитывать 1001 пиксели и сверять с новыми данными на схожесть. Всё заранее подготовлено и с быстрым доступом.
     
  7. zhenia3003

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

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Не стал конвертировать в MD5, т.к. требуется находить приблизительные совпадения, например 11001 и 10001 (совпадение 99%), как это через md5 реализовать не знаю пока
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.841
    Симпатии:
    1.338
    Адрес:
    Лень
    перечитывай еще раз