我有一个问题,可以通过两个非常简单的表来重新创建。这些表的定义如下:

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表上进行全文本搜索时,我没有得到任何点击


  MariaDB [stackoverflow]> SELECT名称,代码FROM Temp_Table_MyISAM
  匹配(名称)反对('38');
  空置(0.00秒)
  
  MariaDB [stackoverflow]> SELECT名称,代码FROM Temp_Table_MyISAM
  在哪里匹配(名称)反对(“ POLARIS”);
  空置(0.00秒)


当我在InnoDB表上执行FULLTEXT搜索时,仅当要匹配的模式不是以数值开头时,我才会被点击


  MariaDB [stackoverflow]> SELECT名称,代码FROM Temp_Table_InnoDB
  在哪里匹配(名称)反对('38');
  空置(0.00秒)
  
  MariaDB [stackoverflow]> SELECT名称,代码FROM Temp_Table_InnoDB
  在哪里匹配(名称)反对(“ POLARIS”);


+----------------+---------+
| name           | code    |
+----------------+---------+
| POLARIS VENTRI | DE-3514 |
+----------------+---------+


任何见识将不胜感激。

最佳答案

MyISAM的FULLTEXT中有3条规则需要注意:


少于ft_min_word_len(默认4个字符)的文本单词将不被索引。 (“ 38”)
在超过50%或更多行中显示的搜索词将被忽略。 (“北极星”)
文本中的“停止词”未编制索引。 (“ the”,“ and”,...)


由于InnoDB现在支持FULLTEXT,因此您应该转到该引擎。 (那里的规则是不同的。)

关于mysql - 使用MyISAM表的MySQL(Windows10)FULLTEXT搜索不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48415088/

10-10 02:48