|
|
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Появилась довольно не тривиальная задача сравнения строк между собой. Дано: БД: MySQL Поле для поиска содержит строку произвольной длины (TEXT). (от 200 до 2000 символов) Всего в таблице около 4млн. строк. Задача: Выбрать из таблицы строки, где имеется частичные совпадения со строкой (совпадающие символы должны идти подряд, а суммарное количество совпадающих символов должно быть не меньше N) Для примера: Исходные данные (Жирным выделены совпадения строк): N=15 ksdlkfj2k3 FDSJKHfka2fsddasFSDKJ HKfsdfsv3vxcsplkfgjlkhjfg dklashdklJHKfSFLKHSOsdfsv3vxcsplkfgjlL FKHLSIDFflksmdflkjsLDkfOF UEwjp234682 LKHSOsdfsv3vxcsplkfgjlL FKHLSIDFflksmdflkjsLDkfOFfkJEFNKwefojoiw enfKFJ372 Строка запроса: FKHLSIDFflksmdflkjsLDkfOFfkJEFNKwefojoiwADAKFDSJKHfka2fsddasFSDKJJH32h В базах данных дилетант, так что будут рассматриваться любые способы рационализации поиска (Вплоть до переезда на другую СУБД) P.S. Возможно можно решить с помощью Sphinx (решения именно моей задачи не нашел) Спасибо за внимание! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2014, 00:04:27 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
substr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2014, 00:12:16 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
ScareCrow, Проблема в том, что я не знаю, какая именно часть из исходной строки совпадет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2014, 00:38:55 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
CthulhUzzz, Говоря русским народным языком -- вы заколебётесь считать. 4 млн строк, скажем 1020 буковок в среднем. Внутри каждой (каждой из 4 млн!) такой записи есть 1000 подстрок длиной 20 символов. Т.е. строку запроса, в которой 1.000 20-буквеных варинтов надо проверить против 1.000 х 4.000.000.000 20-буквеных вариантов в базе. Т.е. 1.000 х 1.000 х 4.000.000.000 тобишь 4 квадрилиона проверок. В мире баз данных любят делать разные индексы. Например можно каждой (в среднем 1020 размерной) записи сделать 1000 дочерних записей 20-буквеных отрезков. получится 4 трилиона записей. Построить индекс и на каждый 1020 размерный запрос запускать 1000 проверок по индексу. Кстати, а почему бы нет? размер дочерней таблицы будет все в 20 раз больше исходника, индек можно сделать на 5-10 символов, в зависимости от кардиналити данных... Т.е. рамер системы поднимется на два порядка -- если потянете, то может и взлетит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2014, 06:12:12 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
CthulhUzzz, сканировать по-любому придется всю исходную таблицу, т.к. универсальных индексов на все случаи (на различные N) не напасешься. То есть минимум - это полный скан таблицы. Чтобы он же был и максимумом - достаточно написать функцию сравнения строк заданной длины (т.е. с параметрами "длина подстроки", "шаблон поиска", "очередная анализируемая строка"), и возвращающи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2014, 08:53:54 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
сорь, с планшета улетело раньше времени:) ... и возвращающая либо 1 (подстрока найдена), либо 0. Тогда запрос тривиален: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2014, 08:57:40 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
PS. хотя, конечно, скан огромной таблицы недешевое удовольствие... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2014, 09:02:45 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
тут один реализовавыла(на форуме) свои шейлы, или шейпинги, .... короче суть в том, что он берёт строку исходную разбивает её на части, и в таблицу шейлов вставлеёт хеши этих частей... строка запроса разбиваеться также на шейлы, хешируеться, и ищуться строки с максимальным числов совпавших шейлов. термин точно не помню... мне кажеться изначальная затея не совсем верна, совпадение строк со случайного символа с частью искомой начиная тоже с любого символа. Это где такое понадобилось ....чтоб подобные запросы были многоразовые??? цепочка днк, это по сути строка , где каждая буква означает аминокислоту. и есть сравнения разные цепочек днк(поиск вхождений частей одной в другую) строиться на математическом алгоритме, забыл название, - поиск похожести строк - задача медленная, но решаемая чем полные переборы быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 13:20:53 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
Если "не меньше N" трансформировать в "равно N", то: 1. Для начала разбить ту большую строку (длины L) на L-N+1 строчек длины N, сформировать из них таблицу из одной колонки, и проиндексировать ее. например: из "abgnthr" и N=5 получается "abgnt", "bgnth", "gnthr". 2. Ну и дальше одноразовым проходом по 4милионной таблице, берем одно слово за другим, если его длина больше или равна N, то методом, как и в п.1 делим слово на много N-значных подслов и каждое подслово сравниваем на равенство с табличкой из п.1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 20:25:09 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
.. а если есть возможность, этот алгоритм и данные впихнуть в какую-нибудь in-memory database, то получится может быть не так уж и медленно ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 20:27:09 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
Существуют достаточно эффективные алгоритмы поиска наибольшей общей подстроки. Можно запрограммить, но лучше не пользовательской функцией, а UDF. Впрочем, всё равно может оказаться тяжеловато. Можно пойти по пути предобработки - т.е. подготовить исходный массив данных для быстрой реализации такого алгоритма. Построение суффиксного дерева для каждой записи - это, наверное, уже перебор, а вот словаризация всех подстрок заданной длины (оптимально - наверное, около 2N/3) для предварительного отбора записей перед прогоном через поиск общей подстроки вполне подойдёт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2014, 22:19:18 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
Все вышесказанное, конечно, справедливо - для какого-то одного конкретного значения N. Но ТС хочет N менять произвольно от запроса к запросу. Размер таблицы с одним (на самом деле с двумя, про базовый ПК забыли, ну да не суть) полем, сформированной для всевозможных значений N, можете оценить? Пусть даже с дополнительным UNIQUE(pk, substr), IGNORE ON DUPLICATE (или реализованным через триггер отсевом дубликатов подстрок, для экономии места). Впрочем, если таблицу создать удастся, и даже проиндексировать по CRC (точнее, по CRC32() ), - то результат может стоить затраченных усилий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2014, 07:45:24 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
AkinaМожно запрограммить, но лучше не пользовательской функцией, а UDF. Жутко извиняюсь - а что такое UDF? Для MS SQL, вероятно, имелось бы в виду CLR , а вот в MySQL - о чём это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2014, 08:00:24 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, похожая штука: http://dev.mysql.com/doc/refman/5.6/en/adding-functions.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2014, 08:36:45 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
Cygapb-007ТС хочет N менять произвольно от запроса к запросуНо тем не менее это значение укладывается в некоторые вменяемые рамки - в заданных задачных условиях вряд ли оно будет равно двум-трём, и тысяче тоже вряд ли... Рекомендации было бы вырабатывать легче, если бы ТС сфорумлировал хотя бы приблизительно, за каким фаллосом ему всё это нужно, какова предметная область и физика процесса, и что ему нужно делать с полученным результатом, а также какими ресурсами он согласен жертвовать для решения задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2014, 08:56:27 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
Akina, Всем откликнувшимся - спасибо ! Попробую описать поподробнее: Строки - аудио-отпечатки (По природе последовательность чисел, для удобства закодированные в строку). N в данном случае - порог вхождения ввиду погрешности (Будет статическим). Логичным вопросом будет, почему я не хочу пользоваться традиционным методом поиска подстроки. Допустим на вход будет подан микстейп или дорожка из фильма. В таком случае, максимум на что можно будет расчитывать - это сообщение о том, что в базе совпадений не найдено, хотя композиции наверняка в ней присутствуют. В результате я хочу получить список строк, где есть совпадения и процент соответствия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 18:05:13 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
CthulhUzzz, делаешь из водной строки M = length(входная_строка) - N +1 строк. Код: sql 1. 2. 3. 4. 5. Собираешь запрос Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 19:04:59 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
CthulhUzzzСтроки - аудио-отпечатки (По природе последовательность чисел, для удобства закодированные в строку). ... Допустим на вход будет подан микстейп или дорожка из фильма. То есть, вы ищете совпадения *звука*, через строки? Конкретнее, если есть мелодия из фильма в формате aac, и та же мелодия в формате mp3, вы рассчитываете найти похожесть, сравнивая побайтно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 19:33:41 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
S.G., Именно, но сравнение конечно будет не аудио-потоков или файлов, а акустических отпечатков (Примерно также работает всем известный Shazam). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2014, 20:20:27 |
|
||
|
Выборка частично совпадающих строк
|
|||
|---|---|---|---|
|
#18+
CthulhUzzzS.G., Именно, но сравнение конечно будет не аудио-потоков или файлов, а акустических отпечатков (Примерно также работает всем известный Shazam). странно, я читал что подобные вещи работают немного по другому. из участка звука выбираються кусочки, по принципу - определённого старта. тоесть старт кусочка берёться не рандомно, а скажем для определёной частоты(редкой) нулевое значение - когда она молчит, и определёной дилнны. и того получаеться. для исходной песни при наполнении базы, мы из разных частей песни выискиваем наш страт и берем заданый промеждуток времени. при опознавании при кусочке песни, мы выискиваем наш старт и строем этот отпечаток, и потом ищем точное совпадение! там не возникает поиска что сдесь описан ТС ЗЫ имено поэтому иногда при даже длинном кусочке, подобные программы отказываються пытаться, а при других даже болле коротких, ищут. - ибо на кусочке может не быть точки старта...ну вот изза шумов сильных или изза специфичности контента... подобные вещи плохо распознают класическую музыку - по той же причине - трудно искать точки старта - там не прерывное звучание задействованых инструментов, а не как говорил задорнов - дунда дунда дунда дунда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2014, 10:56:59 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38669224&tid=1834616]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 355ms |

| 0 / 0 |
