MySQL全文搜索和分数

时间:2016-11-25 04:10:20

标签: mysql full-text-search match-against

我的搜索相关性存在问题,并使用全文(匹配)进行过滤,我将在下面说明。

我有一个名为Songs的表,其中包含超过1.5M的记录,此表包含许多列,其中2列是名称和艺术家,这2列是全文索引的。

当我搜索一个标题和歌曲时,它的值完全匹配,它显示的是低分,而对我来说,它没有任何意义。例如。

DATA:

name          | artist      
------------- | ------------
Glad You Came | Boyce Avenue

当我执行下面的查询时,它会带来:

SELECT name, artist,
       MATCH(name, artist) AGAINST('+glad +you +came +Boyce +Avenue' IN BOOLEAN MODE) AS score 
FROM live_lyric.songs 
WHERE MATCH(name, artist) AGAINST('+glad +you +came +Boyce +Avenue' IN BOOLEAN MODE)


name          | artist       | score
------------- | ------------ | ------------------
Glad You Came | Boyce Avenue | 54.727073669433594

我正在寻找完全匹配,怎么可能是54.7 ??

如果我删除+符号

SELECT name, artist,
       MATCH(name, artist) AGAINST('glad you came Boyce Avenue' IN BOOLEAN MODE) AS score 
FROM live_lyric.songs 
WHERE MATCH(name, artist) AGAINST('glad you came Boyce Avenue' IN BOOLEAN MODE)

我会得到类似的回复,其中很多其他记录根本不相关。

对我来说,搜索' +'标志应该接近100,为什么不是,我该如何改进呢?

1 个答案:

答案 0 :(得分:1)

使用全文搜索时,两个非常重要的概念是停用词和最小字长。

“停用词”是未包含在索引中的词,因此在查询和文本中只会忽略它们。在您的示例中,'came'是一个停用词。文档为here

最小字长(通常为4)是考虑的最小字(参见here)。所以,你的问题是“+高兴+你+来+博伊斯+大道”,但它真的是“+高兴+博伊斯+大道”。我认为这解释了得分的问题。