powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триграммный поиск или Поиск с опечатками
20 сообщений из 20, страница 1 из 1
Триграммный поиск или Поиск с опечатками
    #38663534
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Сейчас изучаю данный вопрос, подскажите у кого такое реализовано....
Что да как?
Нужен поиск по любой части слова с возможностью исправить ошибки в опечатке
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663541
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересует именно на MySQL без надстроек типо сфинкса, nosql
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663603
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
DROP FUNCTION IF EXISTS `levenshtein`;
CREATE FUNCTION `levenshtein`(`s1` VARCHAR(255) CHARACTER SET utf8, `s2` VARCHAR(255) CHARACTER SET utf8)
    RETURNS TINYINT UNSIGNED
    NO SQL
    DETERMINISTIC
BEGIN
    DECLARE s1_len, s2_len, i, j, c, c_temp TINYINT UNSIGNED;
    -- max strlen=255 for this function
    DECLARE cv0, cv1 VARBINARY(256);
    
    -- if any param is NULL return NULL
    -- (consistent with builtin functions)
    IF (s1 + s2) IS NULL THEN
        RETURN NULL;
    END IF;
    
    SET s1_len = CHAR_LENGTH(s1),
        s2_len = CHAR_LENGTH(s2),
        cv1 = 0x00,
        j = 1,
        i = 1,
        c = 0;
    
    -- if any string is empty,
    -- distance is the length of the other one
    IF (s1 = s2) THEN
        RETURN 0;
    ELSEIF (s1_len = 0) THEN
        RETURN s2_len;
    ELSEIF (s2_len = 0) THEN
        RETURN s1_len;
    END IF;
    
    WHILE (j <= s2_len) DO
        SET cv1 = CONCAT(cv1, CHAR(j)),
        j = j + 1;
    END WHILE;
    
    WHILE (i <= s1_len) DO
        SET c = i,
            cv0 = CHAR(i),
            j = 1;
        
        WHILE (j <= c_temp) THEN
                SET c = c_temp;
            END IF;
            
            SET c_temp = ORD(SUBSTRING(cv1, j+1, 1)) + 1;
            IF (c > c_temp) THEN
                SET c = c_temp;
            END IF;
            
            SET cv0 = CONCAT(cv0, CHAR(c)),
                j = j + 1;
        END WHILE;
        
        SET cv1 = cv0,
            i = i + 1;
    END WHILE;
    
    RETURN c;
END;



вот нашел функцию с алгоритмом Левенштейна, результат кол-во преобразований для трансформации одной строки в другую
а как теперь продолжить идею.....
нужно использовать это в БД и выводить текстовый результат
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663636
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем полнотекст не подошел?
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663664
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowа чем полнотекст не подошел?А что, он умеет игнорировать опечатки?
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663686
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,
у меня InnoDb а с ним головняк сделать такой поиск
у меня всего одна колонка с наименованиями не более 50 символов, сегодня встречал кучу сайтов где такое реализовано и довольно быстро работает
попробывал с данным алгоритмом, выполняется 15сек - очень долго
нашол два алгоритма Левенштейна , сча буду тестить
мне по сути надо не более 2-ух преобразований, чтобы получилось вхождение, а тут выполняеться походу до конца
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663691
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vip-yсегодня встречал кучу сайтов где такое реализовано и довольно быстро работаета вы уверены, что там не сфинкс или еще что-то? ведь снаружи-то этого не видно.
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663742
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
один сайт конкурента) я уверен что там никакого сфинкса и т.д. нету
там чисто Mysql
способов куча, но пока 13сек)
ищу дальше
если у кого есть какие идеи или готовое решение буду благодарен в помощи
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663754
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vip-y,

И, опять же, вы уверены, что там есть какие-то навороты типа "триграммного поиска", а не тупой LIKE '%подстрока%' ?

Теоретически на таблицах можно построить структуры для имитации работы того же сфинкса, только смысла в этом не вижу.
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663788
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
да там не просто LIKE, т.к. если ошибка в одной или двух буквах, то заменяет на правильно
но если для замены две буквы вместе стоят - то не работает
Пример:
Автамобиль, Автамабиль - > Автомобиль
Автапобиль - > ничего не найдет
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663831
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftScareCrowа чем полнотекст не подошел?А что, он умеет игнорировать опечатки?
а он не умеет???
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663852
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowmiksoftпропущено...
А что, он умеет игнорировать опечатки?
а он не умеет???Мне казалось, что нет. В доку лезть, честно говоря, лень.
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38663859
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftScareCrowпропущено...

а он не умеет???Мне казалось, что нет. В доку лезть, честно говоря, лень.

тред нечетателей доки.

http://dev.mysql.com/doc/internals/en/full-text-search.html
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38664013
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
итак:
1. Sphinx нельзя ставить на виртуальный хостинг на котором я, там запрещены все демоны
2. FullText на InnoDB - костыли
другие варианты?
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38664027
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор. FullText на InnoDB - костыли
эм? штатный полнотекст - уже костыли?
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38664028
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это виртуальных хостинг, то FullText на InnoDB там, скорее всего, нету. Он появился только в версии 5.6, а хостеры не торопятся ставить эту ветку.
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38664301
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если использовать like то нет необходимости набирать полностью слова. достаточно использовать только чать слов," информативную часть" и для одной колонки в 50 символов роиск
like %zxzx% and like %sdas% and ...
работает достаточно быстро
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38666242
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я сделал зеркало таблицы на MyIsam и через JOIN можно делать Fulltext по ней и выводить данные INNODB
но как сделать поиск с учетом ошибок?
я делал так:
Код: sql
1.
2.
3.
4.
5.
    SELECT `preparat`.`prep` FROM `preparat` 
    INNER JOIN `preparat_myisam` 
    ON `preparat_myisam`.`id` = `preparat`.`id` 
    WHERE MATCH(`preparat_myisam`.prep) AGAINST ('пирин' IN BOOLEAN MODE) >0
    ORDER BY MATCH(`preparat_myisam`.prep) AGAINST ('пирин' IN BOOLEAN MODE) DESC
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38668462
InterSky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vip-yодин сайт конкурента) я уверен что там никакого сфинкса и т.д. нету
там чисто MysqlА я больше всего не помнимаю - откуда у вас уверенность, что у сайта-конкурента " никакого сфинкса и т.д. нету, там чисто Mysql "?
Уверенность может быть только если вы видили код или вам это сказал их разработчик (причём и разработчик мог бы обмануть или не разбираться в MySQL и посчитать сфинксовые запросы обычными MySQL'овскими). Если бы у вас была возможность получить информацию о том что там " никакого сфинкса и т.д. нету, там чисто Mysql ", то вы бы с такой же лёгкостью получили бы ответ - каким образом там этот поиск делается.
Единственная малюсенькая надежда на то, что там нету ничего кроме MySQL, у вас могла бы быть если бы конкурент работал бы на том же хостинге, что и вы, и в условиях этого хостинга написано что НИКОМУ ни за какие деньги нельзя поставить там сфинкс (на котором работает 90% сайтов с поиском допускающим опечатки). А может они позвонили тому хостеру и за дполнительные 5$ в месяц подключили сфинкс? А может у них не тот тарифный план что у вас, и у них можно поставить любой демон? Может у них не виртуальный хостинг? А может они вообще не пользуются MySQL'ом предоставленным хостером, а за 2$ в месяц заказали виртуальный MySQL у другого провайдера в который входит сфинкс? А может там опечатки PHP исправляет? Да сотня вариантов есть...

В общем, если бы у вас была возможность знать что там сфинкса нет, то у вас была бы возможность и на чём они работают.

Да и зачем нужны демоны сфинкса? Только для автоматизации? Никто не мешает вам это делать самостоятельно. 10 лет назад и без сфинкса обходились для поиска с учётом опечаток, самостоятельно хранили триграммы в словорях...

У вас кстати какой объём текста по которому производится поиск? Может там быстрее создать LIKE со всеми вариантами опечаток, чем триграммы строить.
...
Рейтинг: 0 / 0
Триграммный поиск или Поиск с опечатками
    #38670677
Фотография vip-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterSky,
5к строк для поиска

P.S. у меня заканчиваеться хостинг, буду переходить на евро сервера в облаках - дешевле и лучше)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триграммный поиск или Поиск с опечатками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]