【发布时间】:2018-07-03 01:29:17
【问题描述】:
我有一个问题,我可以用两个非常简单的表重新创建它。表定义如下:
create table Temp_Table_MyISAM(
id INT UNSIGNED AUTO_INCREMENT,
code VARCHAR(10) NOT NULL,
name VARCHAR(256) NOT NULL,
PRIMARY KEY (id),
KEY (code),
FULLTEXT (name)
) ENGINE = MYISAM;
create table Temp_Table_InnoDB(
id INT UNSIGNED AUTO_INCREMENT,
code VARCHAR(10) NOT NULL,
name VARCHAR(256) NOT NULL,
PRIMARY KEY (id),
KEY (code),
FULLTEXT (name)
);
每张表有两行,从下面两个查询的结果可以看出:
从 Temp_Table_MyISAM 中选择 *;
+----+---------+----------------+
| id | code | name |
+----+---------+----------------+
| 1 | AC-7865 | 38 NORTHRIDGE |
| 2 | DE-3514 | POLARIS VENTRI |
+----+---------+----------------+
从 Temp_Table_InnoDB 中选择 *;
+----+---------+----------------+
| id | code | name |
+----+---------+----------------+
| 1 | AC-7865 | 38 NORTHRIDGE |
| 2 | DE-3514 | POLARIS VENTRI |
+----+---------+----------------+
当我对 MyISAM 表进行 FULLTEXT 搜索时,我没有得到任何结果
MariaDB [stackoverflow]> 选择名称,代码 FROM Temp_Table_MyISAM WHERE MATCH(name) 反对('38');
空集(0.00 秒)MariaDB [stackoverflow]> 选择名称,代码 FROM Temp_Table_MyISAM WHERE MATCH(name) AGAINST('POLARIS');
空集(0.00 秒)
当我对 InnoDB 表进行 FULLTEXT 搜索时,只有当要匹配的模式不是以数值开头时,我才会得到命中
MariaDB [stackoverflow]> 选择名称,代码 FROM Temp_Table_InnoDB WHERE MATCH(name) 反对('38');
空集(0.00 秒)MariaDB [stackoverflow]> 选择名称,代码 FROM Temp_Table_InnoDB WHERE MATCH(name) AGAINST('POLARIS');
+----------------+---------+
| name | code |
+----------------+---------+
| POLARIS VENTRI | DE-3514 |
+----------------+---------+
任何见解将不胜感激。
【问题讨论】:
-
我建议阅读fulltext manual。最后一段涵盖了您的第一个问题,也方便地提取了here(以及更多类似的问题)。第二个问题在该手册的上面 14 行被覆盖(“38”这个词太短而不能包含在索引中),例如解释in this question(还有更多)。但同样,你真的应该阅读手册,因为还有更多的事情需要考虑(例如停用词列表)。