Доступ к документам по ключевым словам

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Есть некоторая БД, в которой хранятся документы и сопоставленные им ключевые слова. Связь между документами и КС - "многие ко многим". Пока не знаю, как лучше это организовать: то ли ввести в таблице документов поля КС1, КС2, КС3, КС4 (ключевых слов не больше 4 для каждого документа), то ли сделать поле типа "массив" (оно, кстати, есть в MySQL вообще?), то ли сделать таблицу с парами "КС - документ".
Так вот, доступ к БД происходит через РНР-скрипт: пользователь в строке вводит несколько ключевых слов, база должна выдать ему те документы, для которых все ключевые слова присутствуют в этой строке. Как лучше сделать: разбить строку на отдельные слова средствами РНР, а потом передать в MySQL массив слов (если да, то как это делается?), либо передать строку и разбивать ее уже средствами MySQL (если да, то опять же, как это делается?)
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

1) Массив передаётся через IN, т.е. что-то вроде

Код: Выделить всё

... where text in ('слово1', 'слово2','словоN')
2) Возможно, имеет смысл ознакомится с fulltext search...
Даже самый дурацкий замысел можно воплотить мастерски
Дионис
Сообщения: 153
Зарегистрирован: 11 июл 2005, 13:42
Откуда: Крым, Алушта
Контактная информация:

Думаю, надо делать три таблицы:
1. Табла Docs:
- IdDocs - счётчик
- Doc - мемо, текст документа
- куча полей типа Аффтар, дата, тема, и т.д.
2. Табла Dict:
- IdWord - счётчик
- Word - текстовый, само слово
- несколько полей типа признак слова (глагол, сказуемое, причастие...), словоформы и т.д.
3. Табла Scan
- IdScan - счётчик
- IdDocs - связь с таблицей Docs
- IdWord - связь с таблицей Dict

Далее, требуется модуль обработки (парсинга) документов, который производит поиск по документу слов и их форм (выпить, выпивать, напиться, напоить, запить...), вычленяет его (слова) основную форму и производит поиск в таблице Dict. Если не нашел, то заносит в таблицу Dict это слово и его формы (грамотный парсер нужон, или вручную). Когла и если в таблице Dict есть это слово, то в таблу Scan нужно внести IdDocs и IdWord.

Далее, весь поиск осуществляется выборкой по таблице Scan, либо по полю IdWord (ищутся документы, содержащие такое слово и/или его словоформы), либо по IdDocs (искать все словоформы данного документа), хотя последнее - не очень информативно.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

AiK писал(а):2) Возможно, имеет смысл ознакомится с fulltext search...
А где можно с этим зверем поближе познакомиться?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Yurich
Сообщения: 107
Зарегистрирован: 23 фев 2004, 19:07

Хыиуду писал(а):А где можно с этим зверем поближе познакомиться?
Он есть в MySQL'е. Смотри здесь: http://dev.mysql.com/doc/refman/4.1/en/ ... earch.html
Ответить