Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Умный поиск
 
 автор: morkovkin   (26.07.2010 в 07:59)   письмо автору
 
 

Всем привет, не получается сделать правильный поиск.

Есть три ячейки: artist, song, artsong.
artist - Название исполнителя
song - Название композиции
artsong - исполнитель и композиция

Пример: |Дима Билан|Невозможное возможно|Дима Билан Невозможное возможно|

Как сделать поиск, чтобы:
1) Введя "Дима Билан" или "Билан Дима" - выводились без мусора все "Дима Билан" и "Билан Дима" одновременно.
2) Введя "Билан Дима невозможное", могло найти по строчке из примера "Дима Билан Невозможное возможно", и чтобы вывело только одну композицию, а всех остальных "Биланов" не надо выводить...

p.s. Дошёл до того, что все 3 поля сделал fulltext, но выводит много мусора, и нужную композицию, совпавшую 100% выводит в середине списка...

Что посоветуете?

  Ответить  
 
 автор: oliss   (26.07.2010 в 10:23)   письмо автору
 
   для: morkovkin   (26.07.2010 в 07:59)
 

А если попробовать
WHERE MATCH (
`artsong`
)
AGAINST (
'Дима Билан Невозможное возможно'
IN BOOLEAN
MODE
)


Вообще-то структура бд неверная
лучше переделать сразу
и поле artsong совсем не нужно

  Ответить  
 
 автор: lElectroHardl   (26.07.2010 в 12:55)   письмо автору
 
   для: morkovkin   (26.07.2010 в 07:59)
 

Вы в примере кажется 2 раза одно и тоже имя написали.

Что бы выводились и Билан Дима и Дима Билан (если эти слова находятся в 2 поле в 2-х разных строчках (id=1 и id =2)) можно попробовать так:
WHERE MATCH ( `artsong`) AGAINST ('+Дима' IN BOOLEAN MODE );
Или
WHERE MATCH ( `artsong`) AGAINST ('+Билан' IN BOOLEAN MODE );
Т.к. в обеих строчках есть и Дима и Билан. (+ означает, что это слово должно быть в каждой возвращенной строке).

По такому же принципу (с +-ками) можно сделать и 2-ю задачу:
WHERE MATCH ( `artsong`) AGAINST ('+Билан +Дима +невозможное' IN BOOLEAN MODE );
Если даже в какой-то строке кроме этих 3-х слов есть еще какие-то, они тоже будут выведены.

Это если я правильно понял ваш вопрос.
Совет: используйте другую структуру таблиц. Выведите в отдельную таблицу имена всех исполнителей. И еще одну таблицу для названия песен. И 3-ю, для связи 1-й и 2-й. Т.е. в 3-й каждому идентификатору исполнителя будет соответствовать своя песня. И поиск будет намного легче.
И еще: http://www.mysql.ru/docs/man/Fulltext_Search.html

  Ответить  
 
 автор: Valick   (26.07.2010 в 13:21)   письмо автору
 
   для: lElectroHardl   (26.07.2010 в 12:55)
 

Выведите в отдельную таблицу имена всех исполнителей.
Однозначно да. И нужно это для того что бы отличить одного исполнителя от другого при совпадающих именах. Так как к примеру "Рваные тапки" из Бобруйска и "Рваные тапки" из Забубёновска - это совершенно разные группы.
сущность - исполнитель
еще одну таблицу для названия песен
тоже да по той же причине. так как у одной и той же песни могут быть несколько исполнителей (и не обязательно это будет дуэт), и две совершенно разные песни могут иметь одинаковые названия.
сущность - песня.
И 3-ю, для связи
связь множество ко множеству

И поиск будет намного легче.
вот под это я не подпишусь :) поиск - это всегда гемор))

  Ответить  
 
 автор: lElectroHardl   (26.07.2010 в 14:50)   письмо автору
 
   для: Valick   (26.07.2010 в 13:21)
 

Хотя, да, поиск - ужс какой-то! Я свой, примерно по той схеме которую описал, делал 2 недели(!).
Поясни, что означает "связь множество ко множеству".

  Ответить  
 
 автор: Valick   (26.07.2010 в 14:56)   письмо автору
 
   для: lElectroHardl   (26.07.2010 в 14:50)
 

одному исполнителю может соответствовать множество песен
одной песне может соответствовать множество исполнителей

  Ответить  
 
 автор: Diplex   (27.07.2010 в 03:15)   письмо автору
 
   для: Valick   (26.07.2010 в 14:56)
 

Ух, спасибо народ за советы, пошёл за веревкой и мылом))

  Ответить  
 
 автор: lElectroHardl   (27.07.2010 в 10:45)   письмо автору
 
   для: Diplex   (27.07.2010 в 03:15)
 

Стул не забудь ;)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования