MySQL 到 PostgreSQL 的 to_tsvector、@@ 和 to_tsquery?

标签 mysql sql postgresql full-text-search

在 PostgreSQL 中,我们可以像这样基于全文搜索来搜索表 -

SELECT title
FROM pgweb
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'friend');

来源 - http://www.postgresql.org/docs/current/static/textsearch-tables.html

我们如何在 MySQL 5.5 中进行类似的搜索,这在 PostgreSQL 中很容易完成?

最佳答案

您可能需要 MySQL 的 full text search功能。本质上,您创建一个 FULLTEXT 索引,然后使用 MATCH() ... AGAINST 对其进行搜索。 。

我不知道 MySQL 中是否有设置每个查询的搜索语言的功能,但这并不意味着不存在这样的支持。目前尚不清楚您是否需要每个查询的语言设置。

MySQL 的最新稳定版本支持对现代事务性和崩溃安全的 InnoDB 表类型以及不安全的 MyISAM 表类型进行全文搜索。如果您的 MySQL 只在 MyISAM 上进行 FTS,那么是时候升级了。 5.6支持InnoDB全文搜索。

或者,如果您确实无法升级,您可以将重要数据存储在 InnoDB 表中,并运行定期查询来更新用作仅用于全文搜索的物化 View 的 MyISAM 表:

  • 创建一个新的 MyISAM 表
  • INSERT INTO ... SELECT 将 InnoDB 表中的数据插入到新的 MyISAM 表中
  • CREATE 新 MyISAM 表上的全文索引
  • DROP 用于全文索引的旧 MyISAM 表;和
  • 最后ALTER TABLE ... RENAME新的 MyISAM 表具有旧表的名称。

在删除旧表和重新创建新表之间,您将有一个非常短的窗口,在此期间全文索引不可用。在 View 刷新之间,您的数据也会过时和过时,尽管您可以使用触发器来解决这个问题(我对 MySQL 的使用还不够了解)。如果您无法忍受这些限制,请升级到 5.6。

MySQL 的全文搜索提供对停用词和其他调整的控制。这是一个可靠的产品,应该能很好地完成这项工作。

关于MySQL 到 PostgreSQL 的 to_tsvector、@@ 和 to_tsquery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15567839/

相关文章:

java - MySQL - 单一连接与池

C# 数据读取期间遇到 fatal error

sql - 如何将列转换为行?

mysql - 每种防止部分页面写入的方法有何优点?

php - 如何返回 pdo 准备好的语句来检查用户是否存在,然后从数据库返回 id?

php - Zend_Db_Abstract 子类(模型)

php - 如何在 Doctrine 2 中按日期时间排序?

sql - 我将如何在 mysql 查询中检索父类别?

ruby-on-rails - Rails 无法将主机名 "postgres"转换为地址:名称或服务未知 (PG::ConnectionBad)

python - SQL 跨列绝对值