Mysql

在 MySQL 中通過許多表進行全文搜尋

  • August 9, 2013

我們有高流量的新聞網站,我想添加一個功能,每個使用者都可以搜尋網站的所有內容,例如news, polls, comments,galleries等。每種內容類型都有自己的表格。

我決定創建一個包含所有類型的所有內容的表:

CREATE TABLE full_text_search
(
   master_id INT NOT NULL,
   content_text TEXT NOT NULL,
   PRIMARY KEY ( master_id )
);

我為所有類型的每個內容生成一個唯一編號,以master_id辨識表中的每個內容。content_text``full_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      |
+----+-------------+---------+------------------+---------+------------+

如您所見master_id,上述表格之間是獨一無二的。當插入每種類型的新內容時,我也應該INSERT將其放入full_text_search表格中。

問題

  • 對於一天的許多插入(所有類型大約 3000 個),這是一個好的解決方案還是反模式?
  • 如果我將此表與其他表分開並將其放入任何其他數據庫(例如其他 RDBMS 或 NoSQL)中,這是更好的選擇嗎?
  • 還有其他解決方案嗎?

當然,可以將可搜尋的內容複製到您的 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 |     ...       |
+----+--------------+---------------+

另一種選擇是在另一種專業技術(例如 Sphinx Search 或 Apache Solr)中創建全文搜尋索引。但同樣的模式也很有用——儲存主鍵欄位內容類型的欄位。

引用自:https://dba.stackexchange.com/questions/47704