这是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
这是应该返回上面的示例记录的查询:
SELECT
*
FROM
`EntityAddresses`
WHERE
MATCH (`StreetAddress` , `StreetAddress2` , `City` , `State` , `PostalCode` , `Country`) AGAINST ('+SG' IN BOOLEAN MODE);
当我使用“新加坡”代替“SG”尝试相同的查询时,它返回包含上面的示例记录的结果集,但“SG”不返回任何内容。我已经尝试了其他国家,我得到了相同的结果,0行。
答案 0 :(得分:2)
MySQL全文引擎定义了要包含在索引中的最小字长。这是默认 3 ,这就是为什么它找不到您的文字SG
。
您可以更改MySQL服务器变量innodb_ft_min_token_size
。只有新创建和重新创建的索引才会显示更改。
MySQL manual for innodb_ft_min_token_size
说:
存储在InnoDB FULLTEXT索引中的单词的最小长度。 增加此值会减小索引的大小,从而加快速度 查询,省略不太可能重要的常用词 在搜索上下文中,例如英语单词“a”和“to”。对于 使用CJK(中文,日文,韩文)字符集的内容,请指定 值为1。