在 MySQL 中的许多表中进行全文搜索

Ara*_*avi 7 mysql nosql rdbms database-design full-text-search

我们有高流量的新闻网站,我想添加一个功能,每个用户都可以搜索网站的所有内容,例如newspollscommentsgalleries,等。每种内容类型都有自己的表。

我决定创建一个包含所有类型的所有内容的表:

CREATE TABLE full_text_search
(
    master_id INT NOT NULL,
    content_text TEXT NOT NULL,
    PRIMARY KEY ( master_id )
);
Run Code Online (Sandbox Code Playgroud)

master_id为所有类型的每个内容生成一个唯一编号以识别每个content_textfull_text_search表中。

例如:

News table:
+----+-------------+---------+---------+----------+------------+
| id | news_title  | lead    | subtitle|  content | master_id  |
+----+-------------+---------+---------+----------+------------+
|  1 |  sometitle  |some lead| subtitle|content 1 |     3      |
|  2 |  some title |some lead| subtitle|content 2 |     5      |
+----+-------------+---------+---------+----------+------------+

article table:
+----+-------------+---------+------------------+---------+------------+
| id | title       | author  | short description| content | master_id  |
+----+-------------+---------+------------------+---------+------------+
|  1 |  sometitle  | someone | very short desc  |content1 |     1      |
|  2 |  some title | otherone|  some short desc |content2 |     4      |
+----+-------------+---------+------------------+---------+------------+
Run Code Online (Sandbox Code Playgroud)

如您所见master_id,上表之间是唯一的。当插入每种类型的新内容时,我也应该INSERT其放入full_text_search表格中。

问题

  • 对于一天的多次插入(所有类型约 3000 次),这是一个好的解决方案还是反模式?
  • 如果我将此表与其他表分开,并将其放在任何其他数据库(例如其他 RDBMS 或 NoSQL)中,是否更好?
  • 还有其他解决方案吗?

Bil*_*win 3

当然,可以将可搜索内容复制到 full_text_search 表中。

MySQL仅在MyISAM存储引擎中支持FULLTEXT索引(直到MySQL 5.6,但MySQL 5.6中InnoDB中的全文似乎仍然有点不稳定)。因此,您可以将规范数据存储在 InnoDB 中以确保安全,并将副本存储在 MyISAM 中以进行索引。MyISAM 很容易受到数据损坏的影响,但如果它只是一个副本,那么您只需在 MyISAM 表损坏时重新填充它即可。

您使用 master_id 来区别于每个表的主键有点奇怪。为什么不使用主键,并在 full_text_search 表中添加另一列来表示内容类型?

CREATE TABLE full_text_search
(
    id INT NOT NULL,
    content_type ENUM('news','polls','comments','galleries','articles') NOT NULL,
    content_text TEXT NOT NULL,
    PRIMARY KEY ( id, content_type )
);

full_text_search table:
+----+--------------+---------------+
| id | content_type | content_text  |
+----+--------------+---------------+
|  1 |         news |     ...       |
|  1 |     articles |     ...       |
|  2 |     articles |     ...       |
+----+--------------+---------------+
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用另一种专业技术(例如 Sphinx Search 或 Apache Solr)创建全文搜索索引。但相同的模式很有用——存储主键字段内容类型字段。