高效 MySQL 文本搜索

Efficient MySQL text search

我有一个使用 MySQL 用 PHP 编写的论坛,我想提供论坛搜索功能。它将允许用户搜索特定字符串,以及过滤 post 日期和主题等元数据。可以有效地搜索元数据,因为这些字段中的大多数都已编入索引,但我认为主要用例当然是普通文本搜索,并且不使用可能 trim 结果的元数据过滤器。

经过一些测试我发现,与大多数人的设置相反,SQL_CALC_FOUND_ROWS 比查询两次以获得结果数量要快得多(大约 1.5 倍),所以最好的查询我有是:

SQL_CALC_FOUND_ROWS * from blahblah where content like '%term%' limit whatever whatever;

毫不奇怪,这真的很慢,因为它必须对数据库中的每个论坛 post 进行文本匹配。我可以做些什么来改善这一点吗?在使用 LIKE 运算符时,在内容 (TEXT) 字段上放置索引是否会有帮助?通常如何做到这一点?

列上的索引会有所帮助,即使使用 like 运算符也是如此,但当您在开头也有通配符时则无济于事。所以对于 term% 索引将是有益的,但对于 %term% 它不会。

但是,您可以查看 FULLTEXT 索引。如果您将这样的索引添加到 TEXT 字段,MySQL 索引单独的单词并允许您进行各种类似搜索引擎的搜索。要进行搜索,请使用 MATCH() ... AGAINST 而不是 LIKE

查看文档: https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

免责声明:我建议您在第一次实验后仔细阅读文档。 FULLTEXT 索引功能强大,但仍有其局限性。

全文索引占用了相当一部分 space,它们的构建方式取决于 MySQL 中的核心设置,因此它们在本地设置和服务器之间的行为可能不同。

例如,他们索引完整的单词但遗漏了非常短的单词和某些停用词。此外,因为它们索引单词,您将无法搜索部分单词。寻找 'term' 将找不到开箱即用的 'determine'。

因此请确保这些索引可以执行您想要的操作,如果您有共享主机,请确保在进行大型实施之前可以按照您喜欢的方式配置和调整它们。