2015-10-18 32 views
2

我正在使用全文索引來識別相似的列內容。 我注意到比賽得分不像我期待的那樣。Mysql全文搜索索引 - Match()/ Against()對不同的結果給予相同的優先級

在我的表格中,我存儲了電子遊戲的名稱。當我搜索「生化危機5」時,所有生化危機遊戲將獲得相同的分數。

select id, name, 
    MATCH(name) AGAINST('Resident Evil 5' IN BOOLEAN MODE) AS score 
FROM game 
ORDER BY score DESC 

輸出:

7 Resident Evil Revelations 2  1.7317759990692139 
36 Resident Evil Remastered 1.7317759990692139 
39 Resident Evil 5  1.7317759990692139 
2 The Evil Within  0.7758325934410095 

在我的情況生化危機5應有的得分最高,但它只是設置包含單詞「生化危機」遊戲的所有同分。有什麼方法可以提高評分?我不想排除列表中的其他生化危機遊戲,但給予生化危機5更高的分數。

回答

1

首先,看看你的MySQL服務器的設置全文:

> SHOW VARIABLES LIKE 'ft%'; 

輸出可能是這個樣子:

Variable_name    Value   
------------------------ ---------------- 
ft_boolean_syntax   + -><()~*:""&| 
ft_max_word_len   84    
ft_min_word_len   4    
ft_query_expansion_limit 20    
ft_stopword_file   (built-in) 

你找ft_min_word_len。如本例中,默認值爲4

[mysqld] 
ft_min_word_len=1 

然後重新啓動:

To change that,如果你想要一個字符的詞(如你的電話號碼),可搜索,則可以通過以下行中的選項文件(通常my.ini)設置此變量服務器和重建FULLTEXT指標:

REPAIR TABLE YourTable QUICK; 

請記住,這會增加你的全文索引相當顯著。

這個答案是基於這個假設,你使用MyISAM作爲表引擎。如果您使用InnoDB,關鍵字是innodb_ft_min_token_size

+0

工作得很好。謝謝 – Goot

1

5號不參加比賽,可能是因爲它比ft_min_word_len短;確認與

show variables like 'ft%'; 

如果我拼寫出完整的單詞「五個一」,這給了我一些長於ft_min_word_len和查詢工作,因爲我覺得你期望它。有關示例,請參閱this SQL小提琴。