2017-03-17 299 views
0

我有一些MySQL表和全文索引的麻煩。我的表結構類似於這樣:MySQL:爲什麼我對全文索引的特定查詢沒有結果?

CREATE TABLE example_index (
    id int(11) NOT NULL auto_increment, 
    title tinytext, 
    content text, 
    FULLTEXT INDEX title (title), 
    FULLTEXT INDEX titlecontent (title,content), 
    PRIMARY KEY (id) 
)ENGINE=MyISAM; 

正如你可以看到我已經創建了一個字段標題和組合的標題和內容的全文索引。此外,我還保存一些數據到這個表是這樣的:

id | title  | content 
1 | Teamwork | Example data 
2 | CSV-Export | Testdata 

如果我試圖通過對查詢比賽獲得從該表中的一些數據,然後我得到了下面的查詢一個結果:

SELECT * 
FROM example_index 
WHERE MATCH (title) AGAINST('csv' IN BOOLEAN MODE); 

沒有結果此查詢:

SELECT * 
FROM example_index 
WHERE MATCH (title) AGAINST('Team' IN BOOLEAN MODE); 

誰能告訴我,爲什麼我在這裏有沒有結果?

回答

1

MySQL全文索引索引單詞。這是一個非常重要的限制。您的數據中沒有team這個詞,但您確實有csv這個詞,因爲-被認爲是一個單詞分隔符。

如果您正在尋找team開始,那麼你仍然可以使用字符串中使用*操作全文索引的話要搜索:

SELECT * 
FROM example_index 
WHERE MATCH (title) AGAINST('Team*' IN BOOLEAN MODE); 

如果你想獲得含有記錄子字符串team任何地方內的索引字段,然後MySQL全文索引和全文搜索不能幫助你。在這種情況下,您需要恢復到舊的title like '%team%',或者您需要使用可以使用MySQL的其他全文搜索提供程序。

+0

好的,謝謝。我也在幾分鐘前試過這個解決方案,這對我來說工作得很好。你能告訴我,如果這是更高性能,然後類似的查詢? – Fox

+0

這取決於。如果單詞'team'總是在字段的開頭,那麼你可以使用像'team%'這樣的標題,它可以在一個字段上使用傳統的索引。在這種情況下,「like」甚至可能比全文搜索更快。如果以'team'開頭的單詞可以在字段中的任何位置,那麼您需要使用像'%team%'這樣的標題,然後'like'不能使用索引,因此比全文搜索慢。 – Shadow

+0

好的謝謝你:)。像這樣的東西會很棒:'\ * team \ *',但是這不起作用:(所以我必須在這種情況下使用,或者我必須填寫標題的內容字段:teamwork和content:team ,工作,所以我仍然可以使用匹配查詢 – Fox

0

全文搜索尋找單詞的文字不能偏字。由於您的文字包含「團隊合作」,因此不包含團隊。這是很多全文實現的限制。

如果你的數據不是太大,你可以使用like

SELECT * 
FROM example_index 
WHERE title LIKE '%Team%'; 

如果你只是在尋找與「團隊」開始的標題,你可以這樣做:

SELECT * 
FROM example_index 
WHERE title LIKE 'Team%'; 

的這種方法的優點是它將利用example_index(title)上的常規索引。

我注意到MySQL現在有一個n-gram parser。此解析器專爲非英語(主要是東亞語言)語言而設計。但是,它也可能適用於英語。你也許可以試試這個做你想做的事。

+0

嗯ok thx,但我認爲「喜歡」對我來說不是正確的,因爲我的表將來會包含很多行。所以就像沒有足夠的性能來處理這一點。我已經看到,我也可以像這樣使用通配符作爲全文索引:AGAINST('Team *'IN BOOLEAN MODE),然後我也得到了一個結果。但我不知道如果這樣比較好,或許你知道這件事? – Fox

+0

@Fox。 。 。對,我忘了MySQL支持。當然,這應該比'like'更好。我認爲它會使用詞典來擴展搜索詞,以包含詞典中的所有匹配詞。 –