2013-07-01 41 views
5

现在,我使用下面的MySQL查询MySQL的全文搜索不返回最相关的结果首先

SELECT * FROM songs WHERE MATCH (title,artist) AGAINST ('$ser' IN BOOLEAN MODE) 

现在,它的工作,但不是很好。

例如说,我有我的数据库

Term One 
Term Two 
Term Three 

下列术语和我做了项的搜索三

$ser = 'Term Three' 

它只是返回

Term One 
Term Two 
Term Three 

因此它匹配但是它没有赋予Term Three更高的优先级,同时拥有Term和Three,我不知道该怎么做尽量让它看起来高于其他人。

希望是有道理的。

回答

3

对于MyISAM表,默认情况下,“three”默认为stopword,因此它不会被编入索引,并且在所有搜索中都会被忽略。

如果您的确在使用MyISAM表格,那么您可以通过ft_stopword_file服务器选项(MyISAM)指定您自己的自定义停用词表,或者完全禁用该功能。

注意:对于InnoDB表,innodb_ft_server_stopword_table是要查找的选项。默认情况下,“三”似乎不是InnoDB的停用词,但停用词表可能在您的服务器上不同。


[编辑]

我完全忽视了布尔搜索do not sort results automatically按相关性(如自然语言搜索做的)。所有你需要做的就是添加一个ORDER BY子句(请test it here):

SELECT * FROM songs WHERE MATCH (title,artist) AGAINST ('$ser' IN BOOLEAN MODE) 
ORDER BY MATCH (title,artist) AGAINST ('$ser' IN BOOLEAN MODE) DESC 
+0

这只是一个例子,实际的条款不包含停用词,并产生相同的结果。 –

+0

@BelginFish第二想法,我认为你所需要做的就是添加一个ORDER BY'子句。请检阅我的编辑。 – RandomSeed

+0

谢谢你的工作就像一个魅力:) –