11

我对 MATCH AGAINST 函数有疑问。

以下查询给了我相同的结果:

SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')

如何在 FULL TEXT 表的列中同时搜索字符串和数字?

谢谢

4

2 回答 2

37

如果您需要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');

试试看 !!!

更新 2013-01-28 18:28 EDT

以下是全文搜索的默认设置

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) 件事:

步骤 01:配置较小的字符串令牌

将此添加到/etc/my.cnf

[mysqld]
ft_min_word_len = 1

步骤 02:重启 mysql

service mysql restart

STEP 03 : 重新索引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;

试试看 !!!

于 2013-01-28T22:28:08.660 回答
4

以防万一它对其他人有帮助,如果您使用的是 InnoDB,则需要使用一组不同的 mysql.cnf 属性

例如

show variables like 'innodb_ft%';

并在 my.cnf 中设置以下值而不是 ft_min_word_len

innodb_ft_min_token_size=1
于 2018-02-22T02:11:08.553 回答