【问题标题】:mysql fulltext search not returning most relevant results firstmysql全文搜索不首先返回最相关的结果
【发布时间】:2013-06-29 04:27:16
【问题描述】:

现在我正在使用以下 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 相匹配,但它并没有给予 Term 3 更高的优先级,同时拥有 Term 和 3,我不知道该怎么做才能让它出现在其他人之上。

希望这是有道理的。

【问题讨论】:

    标签: mysql search full-text-search


    【解决方案1】:

    对于 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
    

    【讨论】:

    • 这只是一个例子,实际的术语不包含停用词并且产生相同的结果。
    • @BelginFish 再三考虑,我认为您需要做的就是添加一个ORDER BY 子句。请检查我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多