Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34

Умный поиск по БД

21.09.2015, 16:33. Показов 4705. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Как реализовать умный поиск по бд mysql, в следуюшем виде.
К примеру в базе есть названия песен и их исполнителей:

Михаил круг - песня 1
Михаил круг - песня 2
Михаил круг - песня 3

Человек в поиске может ввести

Михаил круг
круг михаил
мммиихаил
мхал крг
псня 1
песня 1

Можно ли это реализовать? и конечно же как?) спасибо заранее, буду рад наставлению на пусть истенный
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.09.2015, 16:33
Ответы с готовыми решениями:

Умный поиск папок
Доброго дня. Прошу помощи, совета Задача такова Нужно создать умный поиск папок К примеру имею такие пути ( зная что D:\Music\ -...

умный поиск текста
есть файл, в нем текст вида <br/>Деньги: 50000<br/> как реализовать поиск иммено Деньги: 50000 вот этой части при условии что...

Умный поиск по сайту
Здравствуйте, у меня такая проблема: сайт работает с большим количеством книг, и мне нужно сделать поиск, который будет искать нужные...

18
 Аватар для JIeniviy
17 / 17 / 0
Регистрация: 12.03.2013
Сообщений: 83
22.09.2015, 14:36
Я бы разбил пользовательский запрос на символы (например "мхал крг" -> м х а л к р г) и использовал каждый символ для поиска
Пример запроса select Композиции from таблица where Композиции LIKE '%м%' and Композиции LIKE '%х%' and Композиции LIKE '%а%' and Композиции LIKE '%л%' and Композиции LIKE '%к%' and Композиции LIKE '%р%' and Композиции LIKE '%г%';
0
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34
22.09.2015, 14:46  [ТС]
Так не ищет(
0
 Аватар для JIeniviy
17 / 17 / 0
Регистрация: 12.03.2013
Сообщений: 83
22.09.2015, 14:49
на что ругается? или просто ничего не выдает?
Потому что я сейчас этот запрос переделал под один из своих проектов - сработал
щас скрин даже выложу, чтоб сомнений не было
0
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34
22.09.2015, 14:53  [ТС]
Нет он выдает, но не то что ищем. Ищем михаила круга, а предлагает он :

dj грув - юность в сапогах (feat конец фильма)
dj грув feat. людмила гурченко and александр михай...
александрович михаил - ночное танго
александрович михаил - солнечный город
....

Ну и очень много исполнителей... может где то из них круг то и есть ) но хотелось бы что бы он сверху выводился)
0
 Аватар для JIeniviy
17 / 17 / 0
Регистрация: 12.03.2013
Сообщений: 83
22.09.2015, 14:56
Вот результат
Миниатюры
Умный поиск по БД  
0
 Аватар для JIeniviy
17 / 17 / 0
Регистрация: 12.03.2013
Сообщений: 83
22.09.2015, 15:10
Щас ради интереса забью пару тройку этих записей и посмотрю что мне выдаст

Добавлено через 12 минут
Поменяй условие на первые символы слов
то есть на м и на к сделай 'м%' и 'к%'
0
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34
22.09.2015, 15:26  [ТС]
Да попробовал) всё равно первым выдает не круга)

Добавлено через 7 минут
Если полностью делать запрос правильно
SELECT name FROM music where (name LIKE '%к%') AND (name LIKE '%р%') AND (name LIKE '%у%') AND (name LIKE '%г%') AND (name LIKE '%м%') AND (name LIKE '%и%') AND (name LIKE '%х%') AND (name LIKE '%а%') AND (name LIKE '%и%') AND (name LIKE '%л%')

То выводит. Ка только делаю хоть одну ошибку выводит уже других исполнителей.

Поменяй условие на первые символы слов
то есть на м и на к сделай 'м%' и 'к%'
Добавлено через 6 минут
Так к сожалению вообще не выводит, пустой результат.
0
 Аватар для JIeniviy
17 / 17 / 0
Регистрация: 12.03.2013
Сообщений: 83
22.09.2015, 15:30
можно еще такую конструкцию попробовать
WHERE (Name LIKE 'м%х%а%л') AND (Name LIKE 'к%р%г')
а вот с вариантом "мммиихаил" я бы посоветовал отслеживать и исключать дубликаты символов на уровне слова.
0
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34
22.09.2015, 15:36  [ТС]
можно еще такую конструкцию попробовать
WHERE (Name LIKE 'м%х%а%л') AND (Name LIKE 'к%р%г')
Нулевой результат

а вот с вариантом "мммиихаил" я бы посоветовал отслеживать и исключать дубликаты символов на уровне слова.
Ну это я к примеру, я думаю что прям вот так будут вводить ) но задумаюсь про исключение.
0
 Аватар для JIeniviy
17 / 17 / 0
Регистрация: 12.03.2013
Сообщений: 83
22.09.2015, 15:43
разумеется исключать программно их

Добавлено через 6 минут
Как вариант можно ещё похимичить с предикатом SIMILAR, но не забывай и про LIKE.
На сколько я знаю эти вещи должны решить твою проблему, ну как минимум частично.
Но что-то мне подсказывает, что без хорошей логики в программной части тоже не обойтись.
Пока у меня мысли кончились. Если вдруг нахлынет озарение - отпишусь.
1
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34
22.09.2015, 15:59  [ТС]
Спасибо) будут думать и пробовать.
0
80 / 73 / 25
Регистрация: 26.10.2010
Сообщений: 231
26.09.2015, 20:41
Цитата Сообщение от Maxnival Посмотреть сообщение
можно еще такую конструкцию попробовать
WHERE (Name LIKE 'м%х%а%л') AND (Name LIKE 'к%р%г')
Нулевой результат
Конечно нулевой результат, проценты в начале и в конце тоже нужно ставить.
Именно по этому поиску будет выбирать следующим образом:
SQL
1
WHERE Name LIKE '%м%х%а%л% %к%р%г%'
в общем получается приблизительно следующая логика:
в начале и конце ставим %, между всеми символами тоже;
пробел считаем тоже символом, который нужно обрамлять в % как символ
0
4 / 4 / 3
Регистрация: 25.09.2015
Сообщений: 19
27.09.2015, 16:23
а для чего пробел обрамлять? пробел всё сломает

входную строку разбили по пробелам на слова (пробелы отбросили)
каждое слово начинается и заканчивается процентом, между каждым символом процент
каждое слово заворачивается в свой отдельный LIKE
минимальную длину строки, после которой стартует поиск задаём в программно

Результирующий запрос должен выглядеть:
T-SQL
1
WHERE (Name LIKE "%м%х%л%" AND Name LIKE "%к%р%г%")
Это обработает варианты:
"михаил круг"
"круг михаил"
"михаилкруг"
"кругмихаил"
"кгмхл"
0
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34
27.09.2015, 23:21  [ТС]
а для чего пробел обрамлять? пробел всё сломает

входную строку разбили по пробелам на слова (пробелы отбросили)
каждое слово начинается и заканчивается процентом, между каждым символом процент
каждое слово заворачивается в свой отдельный LIKE
минимальную длину строки, после которой стартует поиск задаём в программно

Результирующий запрос должен выглядеть:
Код T-SQLВыделить код
1
WHERE (Name LIKE "%м%х%л%" AND Name LIKE "%к%р%г%")
Это обработает варианты:
"михаил круг"
"круг михаил"
"михаилкруг"
"кругмихаил"
"кгмхл"
Спасибо, помогло, стало лучше искаться, но некоторые исполнители теперь не ищутся, т.е они находятся но не первыми, например "баста", "каста" они могут выводиться на 20 и 30 позиции. Может будут ещё мысли как улучшить поиск?
0
4 / 4 / 3
Регистрация: 25.09.2015
Сообщений: 19
28.09.2015, 00:40
ну есть пара идей..)
такого рода Like, который мы описали, позволил искать исполнителей, если пользователь - школьник с плохой грамматикой..) и этот запрос хорош.

а теперь представь, что человек реально правильно указал исполнителя нету острой необходимости включать такого рода параноидальный поиск.

идея в том чтобы объединить два запроса. запрос типа
T-SQL
1
Name LIKE "%к%а%с%т%а%"
объединить с запросом типа
T-SQL
1
Name LIKE "%каста%"
Причём второй запрос должен иметь больший вес, чем "параноидальный". я не знаю как сделать более красиво, но решение в лоб

T-SQL
1
2
3
4
5
6
SELECT * FROM (
   SELECT SignerID, 500 as [Weight] WHERE Name LIKE "%каста%"
   UNION ALL
   SELECT SignerID, 100 as [Weight] WHERE Name LIKE "%к%а%с%т%а%"
) t
ORDER BY t.Weight desc
Основная корявость, которая меня злит в том, что запрос по полному имени отработает быстрее, чем параноидальный, но результат мы получим только одновременно. имеет смысл union выполнять не на уровне СУБД, а уже в программе.

*запросы могут иметь синтаксические ошибки, мне не на чем проверить
1
80 / 58 / 11
Регистрация: 16.12.2013
Сообщений: 175
28.09.2015, 12:27
Если вы хотите получить качественное решение, то вам придётся создать собственную меру сходства строк (её иногда иначе называют расстоянием) и вычислять её в коде. За основу можно взять, например, расстояние Левенштейна. При этом придётся вычислять это расстояние между образцом и каждой записью в БД. Прокатит, если записей сравнительно немного, например, 100 тыс. А код выполняется на клиентской стороне.

Причём, в чистом виде расстояние Левенштейна вам вряд ли подойдёт, так как между строками "М. Круг" и "Михаил Круг" вы получите значительную величину расстояния, в то время как ясно, что это одно и то же.

Эта задача часто встречается при сравнении имён, названий предприятий, адресов и т.п. Однако, удовлетворительного общего решения нет. Нужно разрабатывать свой алгоритм вычисления меры сходства, в зависимости от природы данных, возможных способов перестановки слов, возможных сокращений и т.д.

Существует так же подход, основанный на записи в БД синонимов - всех возможных сокращений и перестановок. База синонимов получается здоровенной. В несколько раз больше, чем исходная. Но поиск можно выполнить быстрее, чем вычисление расстояния полным перебором.
1
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 34
28.09.2015, 14:17  [ТС]
SELECT * FROM (
SELECT SignerID, 500 as [Weight] WHERE Name LIKE "%каста%"
UNION ALL
SELECT SignerID, 100 as [Weight] WHERE Name LIKE "%к%а%с%т%а%"
) t
ORDER BY t.Weight desc
К сожалению не могу не как его выполнить, не знаком с таким построением запроса.

Если вы хотите получить качественное решение, то вам придётся создать собственную меру сходства строк (её иногда иначе называют расстоянием) и вычислять её в коде. За основу можно взять, например, расстояние Левенштейна. При этом придётся вычислять это расстояние между образцом и каждой записью в БД. Прокатит, если записей сравнительно немного, например, 100 тыс. А код выполняется на клиентской стороне.

Причём, в чистом виде расстояние Левенштейна вам вряд ли подойдёт, так как между строками "М. Круг" и "Михаил Круг" вы получите значительную величину расстояния, в то время как ясно, что это одно и то же.

Эта задача часто встречается при сравнении имён, названий предприятий, адресов и т.п. Однако, удовлетворительного общего решения нет. Нужно разрабатывать свой алгоритм вычисления меры сходства, в зависимости от природы данных, возможных способов перестановки слов, возможных сокращений и т.д.

Существует так же подход, основанный на записи в БД синонимов - всех возможных сокращений и перестановок. База синонимов получается здоровенной. В несколько раз больше, чем исходная. Но поиск можно выполнить быстрее, чем вычисление расстояния полным перебором.
Пробовал расстояние Левенштейна, но столкнулся с такой проблемой о которой вы и сказали
так как между строками "М. Круг" и "Михаил Круг" вы получите значительную величину расстояния, в то время как ясно, что это одно и то же.
, по этому вариант отпал, и стал искать другой способ. Вариант с LIKE более менее устраивает, но вот не могу разобраться с запросом который мне посоветовали выше.
0
4 / 4 / 3
Регистрация: 25.09.2015
Сообщений: 19
01.10.2015, 11:19
Maxnival, извините, был занят. сейчас тоже не смогу развёрнуто ответить.

посмотрите команду UNION ALL. эта конструкция объединяет наборы результатов от двух запросов. Это вот про этот фрагмент:
Цитата Сообщение от Maxnival Посмотреть сообщение
SELECT SignerID, 500 as [Weight] WHERE Name LIKE "%каста%"
UNION ALL
SELECT SignerID, 100 as [Weight] WHERE Name LIKE "%к%а%с%т%а%"
дальше я эту конструкцию использую... грубо говоря, как таблицу/представление... выбираю из неё данные отсортированные по полю Weight от большего к меньшему.

Т.е. можно написать
T-SQL
1
2
SELECT * FROM Some_Table t
ORDER BY t.Weight desc
а можно вместо Some_Table указать запрос. я предложил вместо Some_Table вставить запрос с UNION ALL, описанный чуть выше.

Я думаю вы справитесь. Если будет совсем тоскливо - пишите

Добавлено через 32 минуты
А сорян. запросы-то неправильно написаны)
T-SQL
1
2
3
4
5
6
SELECT * FROM (
   SELECT SignerID, 500 as [Weight] FROM your_table WHERE Name LIKE "%каста%"
   UNION ALL
   SELECT SignerID, 100 as [Weight] FROM your_table WHERE Name LIKE "%к%а%с%т%а%"
) t
ORDER BY t.Weight desc
Видимо, это вас и смутило
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2015, 11:19
Помогаю со студенческими работами здесь

Умный поиск по нескольким таблицам Access
Уважаемые знатоки, помоги пожалуйста решить следующую задачу: Есть база данных в Access и Excel, который используется для ввода/вывода...

Стандартный и умный поиск не ищет по псевнонимам авторов и дате
Добрый день! Столкнулся с такой проблемой: блог категории содержит стандартные записи, наиболее важной частью которых является дата их...

Ошибка при индексации в "Умный поиск"
Друзья, подскажите как решить проблему, при индексации выдает такую ошибку, я так понял, что таблица y9hmp_finder_tokens заполнена, записей...

Умный указатель
Не могу понять тему с перегрузкой оператора селектор и найти понятное объяснение этой темы. А так же реализацию умного указателя. ...

Умный фильтр
как реализовать умный фильтр по таблице в базе данных? Есть база данных. Там 10000 товаров. Нужно сделать фильтр что то типо того...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru