InnoDB 上的類全文搜索:另一種方法
雖然MyISAM 表本身支持全文搜索,但InnoDB 用戶可能會面臨嘗試實現類似功能時的限制。為了應對這項挑戰,出現了一個有趣的解決方案,其中涉及利用 MyISAM 全文表來索引回 InnoDB 資料庫。
建立 InnoDB 表
初始步驟涉及建立必要的 InnoDB 表。這些表將作為核心資料存儲庫。例如,考慮以下模式:
CREATE TABLE users (...) ENGINE=InnoDB; CREATE TABLE forums (...) ENGINE=InnoDB; CREATE TABLE threads ( forum_id SMALLINT UNSIGNED NOT NULL, thread_id INT UNSIGNED NOT NULL DEFAULT 0, user_id INT UNSIGNED NOT NULL, subject VARCHAR(255) NOT NULL, created_date DATETIME NOT NULL, next_reply_id INT UNSIGNED NOT NULL DEFAULT 0, view_count INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (forum_id, thread_id) ) ENGINE=InnoDB;
建立全文表
接下來,建立一個專用於全文索引的 MyISAM 表。此表將有助於指定 InnoDB 表格欄位的索引。
CREATE TABLE threads_ft ( forum_id SMALLINT UNSIGNED NOT NULL, thread_id INT UNSIGNED NOT NULL DEFAULT 0, subject VARCHAR(255) NOT NULL, FULLTEXT (subject), PRIMARY KEY (forum_id, thread_id) ) ENGINE=MyISAM;
維護表資料
為了確保 InnoDB 和 MyISAM 表之間的同步,請實作更新方法全文表。這可以透過觸發器或夜間批次來實現。
用於搜尋的預存程序
為了促進類似全文的搜尋功能,請在 MySQL 中建立一個預存程序。此程序將查詢 MyISAM 表,根據提供的搜尋字詞過濾結果,並傳回最相關的匹配項。
DELIMITER # CREATE PROCEDURE ft_search_threads ( IN p_search VARCHAR(255) ) BEGIN SELECT t.*, f.title AS forum_title, u.username, MATCH(tft.subject) AGAINST (p_search IN BOOLEAN MODE) AS rank FROM threads_ft tft INNER JOIN threads t ON tft.forum_id = t.forum_id AND tft.thread_id = t.thread_id INNER JOIN forums f ON t.forum_id = f.forum_id INNER JOIN users u ON t.user_id = u.user_id WHERE MATCH(tft.subject) AGAINST (p_search IN BOOLEAN MODE) ORDER BY rank DESC LIMIT 100; END;
透過呼叫此預存程序並提供搜尋字詞,使用者可以檢索相關結果來自 InnoDB 表。
這種方法為在 InnoDB 表中實現類似全文的搜尋功能提供了一種可行的替代方案,利用了 InnoDB 和 MyISAM 的優勢引擎。
以上是如何使用MyISAM索引實現InnoDB表的全文檢索?的詳細內容。更多資訊請關注PHP中文網其他相關文章!