|
|
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Добрый день, имеется достаточно большая база данных (СУБД MySQL). Необходимо реализовать "умный" поиск в данной БД (а точнее в цепочке связанных таблиц). Под умным поиском я понимаю поиск, в котором заданный ключ (ключи) ищется по многим таблицам, поиск, в котором можно влиять на порядок отображения результатов (сортировку). Отвлеченный пример: Некий каталог объектов предостовляет поиск по своим объектам. У каждого объекта могут имется различные категории, подкатегории, каждый объект может быть связан с различными видами услуг. Для каждого объекта может быть написано 1 или более описаний (статей). Простой (simple) поиск должен принимать в качестве ключей 1..n слов и искать данные слова во всей связке таблиц (связи между таблицами 1-1, 1-M, M-M), а затем отображать объекты, которые соответствуют критериям поиска в определенном порядке (некая релевантность) + учитывать возможность жесткого указания позиции объекта. Понятно, что одним запросом тут обойтись будет достаточно сложно. Как следует поступить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 11:40 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Что-то мне подсказывает, что структура базы далека от нормализованной) Вообще, с учётом этого следовало и разрабатывать структуру базы, все описания разместить в одной таблице, и использовать полнотекстовый поиск, как раз для такой функциональности и предназначенный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 12:42 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
DocAlЧто-то мне подсказывает, что структура базы далека от нормализованной) Вообще, с учётом этого следовало и разрабатывать структуру базы, все описания разместить в одной таблице, и использовать полнотекстовый поиск, как раз для такой функциональности и предназначенный. Структура бд в 3 НФ. Нельзя разместить все описания в одной таблице. Тогда бы о нормализации пришлось забыть и иметь дело с баааааальшой избыточностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 12:53 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Какой избыточностью? Если речь идёт об описании -- так описание само по себе вполне объект, под который разумно выделить таблицу. Может быть сам пример неудачен, и в реальной базе это действительно приведёт к некой избыточности, но чтоб к огромной -- у меня воображения не хватает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 13:02 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
DocAlКакой избыточностью? Если речь идёт об описании -- так описание само по себе вполне объект, под который разумно выделить таблицу. Может быть сам пример неудачен, и в реальной базе это действительно приведёт к некой избыточности, но чтоб к огромной -- у меня воображения не хватает) Связь М-М подразумевает, что к одна статья может быть у разных объектов и, в свою очередь, у одного объекта могут быть разные статьи. Следует дублировать статьи в таблице объектов, чтобы проводить полнотекстовый поиск? Разве это не "баааальшая" избыточность? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 13:20 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Дублировать??? А один id указать -- религия не позволяет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 13:24 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
DocAlДублировать??? А один id указать -- религия не позволяет? Это к чему? Если не ошибаюсь мы начали с: DocAlВообще, с учётом этого следовало и разрабатывать структуру базы, все описания разместить в одной таблице, и использовать полнотекстовый поиск, как раз для такой функциональности и предназначенный. Я сказал, что нельзя объединить все описания, по которым надо будет вести поиск в одной таблице. Сейчас это все реализовано через таблицу связку (Или вы знаете более совершенный способ, как реализовать м-м?). Честно, я не понимаю к чему вы ведете. Может подробнее опишите свою идею? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 13:33 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Рассматриваем описание как объект, минимальные возможные атрибуты для него id и собственно текст описания. На него могут быть довешены дополнительные рюшечки, типа там иллюстраций, ещё чего-то, это уж в зависимости от структуры базы и вывода. Не важно, относится ли одна статья к нескольким объектам, или несколько объектов ссылается на одну статью, в любом случае указывается id этой статьи, и только он может быть, в некотором роде, "продублирован" в базе, но это же неизбежная и очевидная особенность отношения М-М, причём, формально записанная, она вообще превращается в тафтологию: ссылка на объект указыватся столько раз, сколько раз на объект ссылаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 13:42 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Собственно вопрос остается открытым. Как следует поступить, чтобы из такой структуры базы данных достать объекты соответствующие критериям поиска. Если использовать полнотекстовой поиск в разных частях базы данных, то как объединить результаты поиска в единое целое? Как определить релевантность и как влиять на сортировку результатов? Чуть более подробно распишу пример: Центральной таблицей является таблица объектов. К ней через 1-М присоединяется таблица типов, к которой в свою очередь через 1-М таблица надтипов. К таблице объектов через М-М присоединяется таблица артиклов. + еще n-ное кол-во таблиц через 1-М и М-М. Пользователь вводит слово "гуталин". Мы должны проверить названия типов, надтипов, названия объектов, посмотреть в описании объектов и в статьях. Отсортировать объекты так, чтобы, к примеру, сверху были те объекты у которых в названии типа есть слово гуталин, за тем те у которых в названии. Итд... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 14:02 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Объединить результаты с помощью UNION (выяснить, поддерживает ли имеющаяся версия MySQL, сиречь версия 4.0.0 или выше), про сортировку по релевантности почитать в собственно документации MySQL по полнотектовому поиску , там же почитать об влиянии на сортировку и прочие возможности, связанные с поиском. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 14:21 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
DocAlОбъединить результаты с помощью UNION (выяснить, поддерживает ли имеющаяся версия MySQL, сиречь версия 4.0.0 или выше), про сортировку по релевантности почитать в собственно документации MySQL по полнотектовому поиску , там же почитать об влиянии на сортировку и прочие возможности, связанные с поиском. Да, что-то вроде такого и надо (UNION поддерживается). Но как можно влиять на порядок сортировки? Для примера - встроенная релевантность возвращает результат на основе данных в которых она (релевантность) вычислялась. Т.е. при выборке из таблицы статей релевантность будет на основе статей, а при выборке из названий объектов,.. думаю ясно. Хотелось бы сделать сделать что-то вроде такого, чтобы учитывались количества совпадений ключа в нескольких таблицах (если ключ найден в названии объекта и в названии типа, то такой объект будет выше объекта, в котором ключ найден только в названии объекта). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 16:26 |
|
||
|
Поиск в нескольких таблицах.
|
|||
|---|---|---|---|
|
#18+
Пример №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. Пример №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. Пример №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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2005, 22:20 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=32929744&tid=1854315]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
176ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 530ms |

| 0 / 0 |
