我对 MATCH AGAINST 函数有疑问。
以下查询给了我相同的结果:
SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')
如何在 FULL TEXT 表的列中同时搜索字符串和数字?
谢谢
我对 MATCH AGAINST 函数有疑问。
以下查询给了我相同的结果:
SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')
如何在 FULL TEXT 表的列中同时搜索字符串和数字?
谢谢
如果您需要Fiat
并且500
在任何订单无关紧要的地方,那么
SELECT * FROM models MATCH(name) AGAINST('+Fiat +500');
如果你需要Fiat 500
一起,那么
SELECT * FROM models MATCH(name) AGAINST('+"Fiat 500"');
如果你需要Fiat
和零个或多个500
,那么
SELECT * FROM models MATCH(name) AGAINST('+Fiat 500');
如果你需要500
和零个或多个Fiat
,那么
SELECT * FROM models MATCH(name) AGAINST('Fiat +500');
试试看 !!!
以下是全文搜索的默认设置
mysql> show variables like 'ft%';
+--------------------------+----------------+
| Variable_name | Value |
+--------------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
| ft_max_word_len | 84 |
| ft_min_word_len | 4 |
| ft_query_expansion_limit | 20 |
| ft_stopword_file | (built-in) |
+--------------------------+----------------+
5 rows in set (0.00 sec)
mysql>
请注意,ft_min_word_len默认为 4。令牌 500 的长度为 3。因此它根本不会被索引。您将不得不做三 (3) 件事:
将此添加到/etc/my.cnf
[mysqld]
ft_min_word_len = 1
service mysql restart
models
表中的所有索引您可以只删除并添加 FULLTEXT 索引
或者分阶段做,提前看看能有多大
CREATE TABLE models_new LIKE models;
ALTER TABLE models_new DROP INDEX name;
ALTER TABLE models_new ADD FULLTEXT name (name);
ALTER TABLE models_new DISABLE KEYS;
INSERT INTO models_new SELECT * FROM models;
ALTER TABLE models_new ENABLE KEYS;
ALTER TABLE models RENAME models_old;
ALTER TABLE models_new RENAME models;
当您对此感到满意时,然后运行
DROP TABLE models_old;
试试看 !!!
以防万一它对其他人有帮助,如果您使用的是 InnoDB,则需要使用一组不同的 mysql.cnf 属性
例如
show variables like 'innodb_ft%';
并在 my.cnf 中设置以下值而不是 ft_min_word_len
innodb_ft_min_token_size=1