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中文网其他相关文章!