powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поиск в нескольких таблицах.
12 сообщений из 12, страница 1 из 1
Поиск в нескольких таблицах.
    #32929612
vecalion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
имеется достаточно большая база данных (СУБД MySQL). Необходимо реализовать "умный" поиск в данной БД (а точнее в цепочке связанных таблиц). Под умным поиском я понимаю поиск, в котором заданный ключ (ключи) ищется по многим таблицам, поиск, в котором можно влиять на порядок отображения результатов (сортировку).

Отвлеченный пример:
Некий каталог объектов предостовляет поиск по своим объектам. У каждого объекта могут имется различные категории, подкатегории, каждый объект может быть связан с различными видами услуг. Для каждого объекта может быть написано 1 или более описаний (статей). Простой (simple) поиск должен принимать в качестве ключей 1..n слов и искать данные слова во всей связке таблиц (связи между таблицами 1-1, 1-M, M-M), а затем отображать объекты, которые соответствуют критериям поиска в определенном порядке (некая релевантность) + учитывать возможность жесткого указания позиции объекта.

Понятно, что одним запросом тут обойтись будет достаточно сложно. Как следует поступить?
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929674
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то мне подсказывает, что структура базы далека от нормализованной)
Вообще, с учётом этого следовало и разрабатывать структуру базы, все описания разместить в одной таблице, и использовать полнотекстовый поиск, как раз для такой функциональности и предназначенный.
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929696
vecalion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlЧто-то мне подсказывает, что структура базы далека от нормализованной)
Вообще, с учётом этого следовало и разрабатывать структуру базы, все описания разместить в одной таблице, и использовать полнотекстовый поиск, как раз для такой функциональности и предназначенный.

Структура бд в 3 НФ.

Нельзя разместить все описания в одной таблице. Тогда бы о нормализации пришлось забыть и иметь дело с баааааальшой избыточностью.
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929714
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой избыточностью?
Если речь идёт об описании -- так описание само по себе вполне объект, под который разумно выделить таблицу.
Может быть сам пример неудачен, и в реальной базе это действительно приведёт к некой избыточности, но чтоб к огромной -- у меня воображения не хватает)
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929739
vecalion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlКакой избыточностью?
Если речь идёт об описании -- так описание само по себе вполне объект, под который разумно выделить таблицу.
Может быть сам пример неудачен, и в реальной базе это действительно приведёт к некой избыточности, но чтоб к огромной -- у меня воображения не хватает)

Связь М-М подразумевает, что к одна статья может быть у разных объектов и, в свою очередь, у одного объекта могут быть разные статьи. Следует дублировать статьи в таблице объектов, чтобы проводить полнотекстовый поиск? Разве это не "баааальшая" избыточность?
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929744
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дублировать???
А один id указать -- религия не позволяет?
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929757
vecalion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlДублировать???
А один id указать -- религия не позволяет?
Это к чему? Если не ошибаюсь мы начали с:
DocAlВообще, с учётом этого следовало и разрабатывать структуру базы, все описания разместить в одной таблице, и использовать полнотекстовый поиск, как раз для такой функциональности и предназначенный.

Я сказал, что нельзя объединить все описания, по которым надо будет вести поиск в одной таблице. Сейчас это все реализовано через таблицу связку (Или вы знаете более совершенный способ, как реализовать м-м?). Честно, я не понимаю к чему вы ведете. Может подробнее опишите свою идею?
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929765
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рассматриваем описание как объект, минимальные возможные атрибуты для него id и собственно текст описания. На него могут быть довешены дополнительные рюшечки, типа там иллюстраций, ещё чего-то, это уж в зависимости от структуры базы и вывода. Не важно, относится ли одна статья к нескольким объектам, или несколько объектов ссылается на одну статью, в любом случае указывается id этой статьи, и только он может быть, в некотором роде, "продублирован" в базе, но это же неизбежная и очевидная особенность отношения М-М, причём, формально записанная, она вообще превращается в тафтологию: ссылка на объект указыватся столько раз, сколько раз на объект ссылаются.
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929789
vecalion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно вопрос остается открытым. Как следует поступить, чтобы из такой структуры базы данных достать объекты соответствующие критериям поиска.
Если использовать полнотекстовой поиск в разных частях базы данных, то как объединить результаты поиска в единое целое? Как определить релевантность и как влиять на сортировку результатов?

Чуть более подробно распишу пример:
Центральной таблицей является таблица объектов. К ней через 1-М присоединяется таблица типов, к которой в свою очередь через 1-М таблица надтипов. К таблице объектов через М-М присоединяется таблица артиклов.
+ еще n-ное кол-во таблиц через 1-М и М-М.

Пользователь вводит слово "гуталин". Мы должны проверить названия типов, надтипов, названия объектов, посмотреть в описании объектов и в статьях. Отсортировать объекты так, чтобы, к примеру, сверху были те объекты у которых в названии типа есть слово гуталин, за тем те у которых в названии. Итд...
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929811
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объединить результаты с помощью UNION (выяснить, поддерживает ли имеющаяся версия MySQL, сиречь версия 4.0.0 или выше), про сортировку по релевантности почитать в собственно документации MySQL по полнотектовому поиску , там же почитать об влиянии на сортировку и прочие возможности, связанные с поиском.
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32929939
vecalion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAlОбъединить результаты с помощью UNION (выяснить, поддерживает ли имеющаяся версия MySQL, сиречь версия 4.0.0 или выше), про сортировку по релевантности почитать в собственно документации MySQL по полнотектовому поиску , там же почитать об влиянии на сортировку и прочие возможности, связанные с поиском.

Да, что-то вроде такого и надо (UNION поддерживается). Но как можно влиять на порядок сортировки? Для примера - встроенная релевантность возвращает результат на основе данных в которых она (релевантность) вычислялась. Т.е. при выборке из таблицы статей релевантность будет на основе статей, а при выборке из названий объектов,.. думаю ясно. Хотелось бы сделать сделать что-то вроде такого, чтобы учитывались количества совпадений ключа в нескольких таблицах (если ключ найден в названии объекта и в названии типа, то такой объект будет выше объекта, в котором ключ найден только в названии объекта).
...
Рейтинг: 0 / 0
Поиск в нескольких таблицах.
    #32930193
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример №1
SELECT title, description, MATCH (title, description) AGAINST ('pattern') AS rel FROM items WHERE MATCH(title, description) AGAINST ('pattern') ORDER BY rel DESC;

Выводит результат в последовательности, определяемой совокупной релевантностью обоих столбцов. (кажется, это вывод по умолчанию для таких запросов, но для наглядности он приведён с ORDER BY)
Требует
Код: plaintext
1.
FULLTEXT(title, description)

Пример №2
SELECT title, description, MATCH (title) AGAINST ('pattern') AS rel_title FROM items WHERE MATCH(title, description) AGAINST ('pattern') ORDER BY rel_title DESC;

В результате все записи, в которых шаблон найден в заголовке -- выводятся первыми (согласно релевантности).
Требует
Код: plaintext
1.
2.
FULLTEXT(title, description)
FULLTEXT(title)

Пример №3
SELECT title, description, MATCH (title) AGAINST ('pattern') AS rel_title, MATCH (description) AGAINST ('pattern') AS rel_description FROM items WHERE MATCH(title) AGAINST ('pattern') OR MATCH(description) AGAINST ('pattern') ORDER BY rel_title DESC, rel_description DESC;

Результат понятен по аналогии и суперпозиции)
Требует
Код: plaintext
1.
2.
FULLTEXT(description)
FULLTEXT(title)
И т.п., надеюсь, эти примеры помогут создать требуемую функциональность.)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поиск в нескольких таблицах.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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