MySQL全文搜索返回0结果

时间:2013-07-20 15:29:49

标签: mysql full-text-search full-text-indexing

我刚在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 +行。我知道搜索不会只用一行,这只是一个例子。

1 个答案:

答案 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