2013-07-20 251 views
0

我剛剛在我的MySQL數據庫上設置了全文索引,但不幸的是它沒有返回任何結果。MySQL全文搜索返回0結果

這似乎是一個常見問題,典型的答案是使用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

與當前查詢,您正在尋找一個完整的單詞匹配。因此,例如,讓你看到前面插入的行,你需要做的:

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); 

另外,您也可以使用,如:

SELECT * 
FROM parentregionlist 
WHERE regionnamelong LIKE 'Birm%'; 

MySQL的文檔給門當戶對的例子從工作: http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html