我刚在MySQL数据库上设置了全文索引,但不幸的是它没有返回任何结果。
这似乎是一个常见问题,典型的答案是使用MyISAM引擎和“IN BOOLEAN MODE”功能。那么这些似乎都不适合我。
这是我的示例代码:
DROP TABLE IF EXISTS parentregionlist;
CREATE TABLE parentregionlist
(
RegionID INT NOT NULL,
RegionType VARCHAR(50),
RelativeSignificance VARCHAR(3),
SubClass VARCHAR(50),
RegionName VARCHAR(255),
RegionNameLong VARCHAR(510),
ParentRegionID INT,
ParentRegionType VARCHAR(50),
ParentRegionName VARCHAR(255),
ParentRegionNameLong VARCHAR(510),
CountryCode VARCHAR(2),
TimeStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (RegionID),
FULLTEXT (RegionNameLong)
) ENGINE = MyISAM;
INSERT INTO parentregionlist
VALUES (575,
"City",
"",
"",
"Birmingham",
"Birmingham, England, United kingdom",
6023342,
"Multi-City (Vicinity)",
"Birmingham (and Vicinity)",
"Birmingham (and vicinity), England, United Kingdom",
"",
now());
SELECT *
FROM parentregionlist
WHERE MATCH(regionnamelong)
AGAINST ('Birm' IN BOOLEAN MODE);
有什么想法吗?
P.S。在真实表格中,我有200k +行。我知道搜索不会只用一行,这只是一个例子。
答案 0 :(得分:0)
使用当前查询,您正在寻找完整的单词匹配。因此,例如,要显示上面插入的行,您需要执行以下操作:
SELECT *
FROM parentregionlist
WHERE MATCH(regionnamelong)
AGAINST ('Birmingham (and vicinity), England, United Kingdom' IN BOOLEAN MODE);
但是,如果您要搜索以'Birm'开头的所有结果,则需要添加'*'修饰符:
SELECT *
FROM parentregionlist
WHERE MATCH(regionnamelong)
AGAINST ('Birm*' IN BOOLEAN MODE);
或者您也可以使用LIKE:
SELECT *
FROM parentregionlist
WHERE regionnamelong LIKE 'Birm%';
MySQL文档提供了很好的MATCH示例: http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html