Есть некоторая БД, в которой хранятся документы и сопоставленные им ключевые слова. Связь между документами и КС - "многие ко многим". Пока не знаю, как лучше это организовать: то ли ввести в таблице документов поля КС1, КС2, КС3, КС4 (ключевых слов не больше 4 для каждого документа), то ли сделать поле типа "массив" (оно, кстати, есть в MySQL вообще?), то ли сделать таблицу с парами "КС - документ".
Так вот, доступ к БД происходит через РНР-скрипт: пользователь в строке вводит несколько ключевых слов, база должна выдать ему те документы, для которых все ключевые слова присутствуют в этой строке. Как лучше сделать: разбить строку на отдельные слова средствами РНР, а потом передать в MySQL массив слов (если да, то как это делается?), либо передать строку и разбивать ее уже средствами MySQL (если да, то опять же, как это делается?)
Доступ к документам по ключевым словам
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
1) Массив передаётся через IN, т.е. что-то вроде
2) Возможно, имеет смысл ознакомится с fulltext search...
Код: Выделить всё
... where text in ('слово1', 'слово2','словоN')
Даже самый дурацкий замысел можно воплотить мастерски
-
- Сообщения: 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 (искать все словоформы данного документа), хотя последнее - не очень информативно.
1. Табла Docs:
- IdDocs - счётчик
- Doc - мемо, текст документа
- куча полей типа Аффтар, дата, тема, и т.д.
2. Табла Dict:
- IdWord - счётчик
- Word - текстовый, само слово
- несколько полей типа признак слова (глагол, сказуемое, причастие...), словоформы и т.д.
3. Табла Scan
- IdScan - счётчик
- IdDocs - связь с таблицей Docs
- IdWord - связь с таблицей Dict
Далее, требуется модуль обработки (парсинга) документов, который производит поиск по документу слов и их форм (выпить, выпивать, напиться, напоить, запить...), вычленяет его (слова) основную форму и производит поиск в таблице Dict. Если не нашел, то заносит в таблицу Dict это слово и его формы (грамотный парсер нужон, или вручную). Когла и если в таблице Dict есть это слово, то в таблу Scan нужно внести IdDocs и IdWord.
Далее, весь поиск осуществляется выборкой по таблице Scan, либо по полю IdWord (ищутся документы, содержащие такое слово и/или его словоформы), либо по IdDocs (искать все словоформы данного документа), хотя последнее - не очень информативно.
А где можно с этим зверем поближе познакомиться?AiK писал(а):2) Возможно, имеет смысл ознакомится с fulltext search...
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Он есть в MySQL'е. Смотри здесь: http://dev.mysql.com/doc/refman/4.1/en/ ... earch.htmlХыиуду писал(а):А где можно с этим зверем поближе познакомиться?