【发布时间】:2016-04-05 14:00:28
【问题描述】:
这是我当前的数据库结构:
CREATE TABLE `books` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
`year` year(4) NOT NULL DEFAULT '0000',
`author` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
UNIQUE KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
CREATE TABLE `chapters` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`book_id` int(10) unsigned NOT NULL DEFAULT '0',
`number` int(10) unsigned NOT NULL DEFAULT '0',
`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `book_id` (`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
ALTER TABLE `chapters`
ADD CONSTRAINT `chapters_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
CREATE TABLE `pages` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`book_id` int(10) unsigned NOT NULL DEFAULT '0',
`chapter_id` int(10) unsigned NOT NULL DEFAULT '0',
`number` int(10) unsigned NOT NULL DEFAULT '0',
`text` text COLLATE utf8_unicode_ci NOT NULL,
`words` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `book_id` (`book_id`),
KEY `chapter_id` (`chapter_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
ALTER TABLE `pages`
ADD CONSTRAINT `pages_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `pages_ibfk_2` FOREIGN KEY (`chapter_id`) REFERENCES `chapters` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
结构非常简单...基本上我是逐页提取书籍文本并将所有内容存储到我的数据库中,该数据库被组织成书籍>章节>页面系统。我试图使其尽可能灵活,以便我可以轻松地从整本书或章节的角度汇总数据......但如果你认为我可以做得更好,我愿意接受任何建议!
现在,我想允许用户在书中执行关键字搜索...这样他们就可以在他们从下拉列表中选择的书中搜索所有出现的单个单词,甚至是短语。
我的网络服务器不在存储 MySQL 数据库的同一台机器上(我在短期内无法摆脱的技术问题)......所以为了避免两台机器之间的巨大数据流量,我更喜欢通过 SQL 查询运行文本搜索。检索所有页面并使用 PHP 分析它们每次都会转化为 5-10 Mb 的数据。
现在我的问题是:
- 是否可以仅使用查询命令(
LIKE、MATCH、REPLACE等)来执行这种过程? - 我会通过以下方式获得按页面格式化的结果:[page 1 | 0 次出现], [第 2 页 | 1 次], [第 3 页 | 1 次出现], [第 4 页 | 2 次]...这可能吗?
- 您认为在将页面文本存储到字段
pages.text之前从页面文本中去除空格字符(换行符、制表符等)和标点字符是个好主意吗?
感谢您的帮助!
【问题讨论】:
标签: mysql regex search text full-text-search