为什么我不能 MATCH() AGAINST() 我的 FULLTEXT 索引中的列之一?

Why can't I MATCH() AGAINST() one of the columns in my FULLTEXT index?

这是 CREATE TABLE:

CREATE TABLE `EntityAddresses` (
  `EntityAddress_ID` int(11) NOT NULL AUTO_INCREMENT,
  `Entity_ID` int(11) NOT NULL,
  `CreateDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `CreatedBy` int(11) NOT NULL,
  `UpdateDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `UpdatedBy` int(11) NOT NULL,
  `StreetAddress` varchar(150) NOT NULL DEFAULT '',
  `StreetAddress2` varchar(150) NOT NULL DEFAULT '',
  `City` varchar(50) NOT NULL DEFAULT '',
  `State` varchar(50) NOT NULL DEFAULT '',
  `PostalCode` varchar(30) NOT NULL DEFAULT '',
  `Country` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`EntityAddress_ID`),
  KEY `Entity_ID` (`Entity_ID`),
  KEY `CreatedBy` (`CreatedBy`),
  KEY `UpdatedBy` (`UpdatedBy`),
  FULLTEXT INDEX `EntityAddresses_ibft_1` (`StreetAddress`,`StreetAddress2`,`City`,`State`,`PostalCode`,`Country`), 
  CONSTRAINT `EntityAddresses_ibfk_1` FOREIGN KEY (`Entity_ID`) REFERENCES `Entities` (`Entity_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `EntityAddresses_ibfk_2` FOREIGN KEY (`CreatedBy`) REFERENCES `Users` (`User_ID`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `EntityAddresses_ibfk_3` FOREIGN KEY (`UpdatedBy`) REFERENCES `Users` (`User_ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是一个示例记录:

                       EntityAddress_ID: 5908
                              Entity_ID: 4514
                             CreateDate: 2015-05-25 13:59:43
                              CreatedBy: 2
                             UpdateDate: 2015-05-25 13:59:43
                              UpdatedBy: 2
                          StreetAddress: Testing 123
                         StreetAddress2: 
                                   City: Singapore
                                  State: 
                             PostalCode: 
                                Country: SG

这是应该 return 上面示例记录的查询:

SELECT 
    *
FROM
    `EntityAddresses`
WHERE
    MATCH (`StreetAddress` , `StreetAddress2` , `City` , `State` , `PostalCode` , `Country`) AGAINST ('+SG' IN BOOLEAN MODE);

当我用 "Singapore" 代替 "SG" 尝试相同的查询时,它 return 是一个包含上面示例记录的结果集,但是 "SG" return没什么。我已经尝试过其他国家,我得到了相同的结果,0 行。

MySQL 全文引擎定义了要包含在索引中的最小字长。这是默认的 3,因此它找不到您的文字 SG

您可以更改 MySQL 服务器变量 innodb_ft_min_token_size。更改仅对新创建和重新创建的索引可见。

MySQL manual for innodb_ft_min_token_size 是这样说的:

Minimum length of words that are stored in an InnoDB FULLTEXT index. Increasing this value reduces the size of the index, thus speeding up queries, by omitting common word that are unlikely to be significant in a search context, such as the English words “a” and “to”. For content using a CJK (Chinese, Japanese, Korean) character set, specify a value of 1.