【问题标题】:MySQL Full Text Search and ScoreMySQL全文搜索和评分
【发布时间】:2017-04-09 10:01:47
【问题描述】:

我的搜索相关性和使用全文过滤(匹配)有问题,我将在下面解释。

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

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

数据:

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,为什么它不是,我该如何改进它?

【问题讨论】:

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


    【解决方案1】:

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

    “停用词”是不包含在索引中的词,因此它们在查询和文本中被简单地忽略。在您的示例中,'came' 是停用词。文档是here

    最小字长(通常为 4)是考虑的最小字(见here)。因此,您查询的是“+glad +you +came +Boyce +Avenue”,但实际上是“+glad +Boyce +Avenue”。我认为这解释了分数的问题。

    【讨论】:

    • 感谢您的回复,但我已经检查了这两点.. 1. come 不是停用词 - 2. 我已经更改为 2 个字母的最小单词,所以它应该使用所有单词
    • 我在发布问题之前已经这样做了
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多