Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триграммный поиск или Поиск с опечатками / 20 сообщений из 20, страница 1 из 1
06.06.2014, 13:22:00
    #38663534
vip-y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
Добрый день!
Сейчас изучаю данный вопрос, подскажите у кого такое реализовано....
Что да как?
Нужен поиск по любой части слова с возможностью исправить ошибки в опечатке
...
Рейтинг: 0 / 0
06.06.2014, 13:26:14
    #38663541
vip-y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
интересует именно на MySQL без надстроек типо сфинкса, nosql
...
Рейтинг: 0 / 0
06.06.2014, 14:15:27
    #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
06.06.2014, 14:40:48
    #38663636
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
а чем полнотекст не подошел?
...
Рейтинг: 0 / 0
06.06.2014, 14:55:46
    #38663664
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
ScareCrowа чем полнотекст не подошел?А что, он умеет игнорировать опечатки?
...
Рейтинг: 0 / 0
06.06.2014, 15:02:24
    #38663686
vip-y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
ScareCrow,
у меня InnoDb а с ним головняк сделать такой поиск
у меня всего одна колонка с наименованиями не более 50 символов, сегодня встречал кучу сайтов где такое реализовано и довольно быстро работает
попробывал с данным алгоритмом, выполняется 15сек - очень долго
нашол два алгоритма Левенштейна , сча буду тестить
мне по сути надо не более 2-ух преобразований, чтобы получилось вхождение, а тут выполняеться походу до конца
...
Рейтинг: 0 / 0
06.06.2014, 15:03:42
    #38663691
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
vip-yсегодня встречал кучу сайтов где такое реализовано и довольно быстро работаета вы уверены, что там не сфинкс или еще что-то? ведь снаружи-то этого не видно.
...
Рейтинг: 0 / 0
06.06.2014, 15:25:40
    #38663742
vip-y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
miksoft,
один сайт конкурента) я уверен что там никакого сфинкса и т.д. нету
там чисто Mysql
способов куча, но пока 13сек)
ищу дальше
если у кого есть какие идеи или готовое решение буду благодарен в помощи
...
Рейтинг: 0 / 0
06.06.2014, 15:32:33
    #38663754
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
vip-y,

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

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

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

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

http://dev.mysql.com/doc/internals/en/full-text-search.html
...
Рейтинг: 0 / 0
06.06.2014, 18:09:21
    #38664013
vip-y
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
итак:
1. Sphinx нельзя ставить на виртуальный хостинг на котором я, там запрещены все демоны
2. FullText на InnoDB - костыли
другие варианты?
...
Рейтинг: 0 / 0
06.06.2014, 18:22:26
    #38664027
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
автор. FullText на InnoDB - костыли
эм? штатный полнотекст - уже костыли?
...
Рейтинг: 0 / 0
06.06.2014, 18:27:04
    #38664028
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
Если это виртуальных хостинг, то FullText на InnoDB там, скорее всего, нету. Он появился только в версии 5.6, а хостеры не торопятся ставить эту ветку.
...
Рейтинг: 0 / 0
07.06.2014, 00:55:09
    #38664301
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
если использовать like то нет необходимости набирать полностью слова. достаточно использовать только чать слов," информативную часть" и для одной колонки в 50 символов роиск
like %zxzx% and like %sdas% and ...
работает достаточно быстро
...
Рейтинг: 0 / 0
10.06.2014, 12:57:12
    #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
12.06.2014, 15:12:18
    #38668462
InterSky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триграммный поиск или Поиск с опечатками
vip-yодин сайт конкурента) я уверен что там никакого сфинкса и т.д. нету
там чисто MysqlА я больше всего не помнимаю - откуда у вас уверенность, что у сайта-конкурента " никакого сфинкса и т.д. нету, там чисто Mysql "?
Уверенность может быть только если вы видили код или вам это сказал их разработчик (причём и разработчик мог бы обмануть или не разбираться в MySQL и посчитать сфинксовые запросы обычными MySQL'овскими). Если бы у вас была возможность получить информацию о том что там " никакого сфинкса и т.д. нету, там чисто Mysql ", то вы бы с такой же лёгкостью получили бы ответ - каким образом там этот поиск делается.
Единственная малюсенькая надежда на то, что там нету ничего кроме MySQL, у вас могла бы быть если бы конкурент работал бы на том же хостинге, что и вы, и в условиях этого хостинга написано что НИКОМУ ни за какие деньги нельзя поставить там сфинкс (на котором работает 90% сайтов с поиском допускающим опечатки). А может они позвонили тому хостеру и за дполнительные 5$ в месяц подключили сфинкс? А может у них не тот тарифный план что у вас, и у них можно поставить любой демон? Может у них не виртуальный хостинг? А может они вообще не пользуются MySQL'ом предоставленным хостером, а за 2$ в месяц заказали виртуальный MySQL у другого провайдера в который входит сфинкс? А может там опечатки PHP исправляет? Да сотня вариантов есть...

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

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

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

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


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