我们有一个使用 MySQL 全文搜索的站点,但存在一个问题,即需要索引的字符串长度为 3 个字符。我知道 MySQL 的默认设置是不索引这个长度的字符串,但我也知道可以在 my.cnf 中覆盖它。我认为限制的原因主要是基于性能,所以我不确定我们是否应该考虑改变这一点?我们这里有什么选择?此服务器上有许多站点,因此任何性能下降都可能导致许多站点出现问题。
mysql 版本:5
答案1
原因在于性能,是的。降低默认限制将增加存储索引所需的空间,而增加的索引大小需要更长的搜索时间。影响将取决于使用情况(执行的查询类型)和当前数据集的大小。默认最小值为 4,您可以像这样降低它:
[mysqld]
ft_min_word_len=3
重建索引时(必须重建),请确保不要修复索引,而是删除并重建索引。这比修复索引要快得多。
mysql> ALTER TABLE tbl_name DROP INDEX ft_index;
Query OK, 9999 rows affected (0.00 sec)
Records: 9999 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE tbl_name CREATE INDEX ft_index( searchable_text );
Query OK, 9999 rows affected (0.00 sec)
Records: 9999 Duplicates: 0 Warnings: 0
可能最好的解决方案是在索引长度改变之前和之后监视开发服务器上的索引大小。
最好的选择(我已推迟)是忽略 MySQL 全文匹配(它具有严重的限制,包括仅限 MyISAM、无法匹配前缀通配符、禁止使用的默认停用词列表)并实施第三方解决方案。可用的最佳选项是:
- Lucene- 基于 Java 的 Apache 项目,占用空间小,速度快,很受欢迎
- 狮身人面像- 基于 SQL(适用于 MySQL、PostgreSQL 或 XML 的连接器),不是 1.0(当前为 0.9.10),被广泛接受
我个人会选择 Lucene,尽管它需要本地 Java 实例。如果这不可能,Sphinx 很容易为 PHP 配置(此处进行演练) 以及许多其他语言。
答案2
作为安迪答案的替代,您可以不用更改全局设置,而是在短词末尾添加一个虚拟字符来人为地增加其长度。
例如,对于单词“at”,您可以将其替换为“at--”(长度为 4);对于单词“see”,您可以将其替换为“see-”(长度也是 4)。
您可以派生出这样的列并在其上建立索引但返回原始数据。