对短于 3 个字符的字符串的 MySQL 全文搜索不返回任何行

Ego*_*gor 5 mysql innodb index full-text-search

我有一个包含一些地址的 MySQL 表。假设我有以下两行:

"10 Fake Street"
"101 Fake Street"
Run Code Online (Sandbox Code Playgroud)

我正在尝试将全文搜索与 MATCH() AGAINST() 一起使用。我已将 ft_min_word_len 设置为 1,重新启动服务器并删除,然后通过运行重建索引

ALTER TABLE addresses DROP INDEX address_index
CREATE FULLTEXT INDEX address_index ON addresses(street)
Run Code Online (Sandbox Code Playgroud)

我已经通过运行验证我的 ft_min_word_len 确实设置为 1

show global variables like 'ft_min_word_len'
Run Code Online (Sandbox Code Playgroud)

如果我在搜索中包含任何少于 3 个字符的单词,则不会返回任何结果,除非我在其中添加了一个野星。例如

SELECT * FROM addresses WHERE MATCH(street) AGAINST('+101' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

或者

SELECT * FROM addresses WHERE MATCH(street) AGAINST('+10*' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

两者都返回 1 行“101 Fake Street”。跑步

SELECT * FROM addresses WHERE MATCH(street) AGAINST('+10' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

返回 0 行。为什么?我可以在网上找到的唯一建议都是关于设置最小长度的,但我已经确认我的设置为 1 并重建了索引。

Rol*_*DBA 9

设置ft_min_word_len只影响 MyISAM。

您需要将innodb_ft_min_token_size设置为 1,因为默认值为 3。

innodb_ft_min_token_size设置为 1 后,返回并执行

ALTER TABLE addresses DROP INDEX address_index
CREATE FULLTEXT INDEX address_index ON addresses(street);
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

  • 谢谢!我猜因为 InnoDB 最近才开始支持全文搜索,所以网上的大部分资源和答案都只提到了 MyISAM 变量。 (3认同)