首页 > 解决方案 > Mysql全文搜索布尔模式按相关性排序而不是我正在寻找的顺序(短语匹配)

问题描述

我有以下查询,相关性排名似乎已关闭。

它排名

iPhone 5C Used Verizon 8GB 58165 White 

比......高

iPhone 8 Front Camera Flex

它似乎在做的是对它在搜索阶段计算单词的次数进行排名。如果单词彼此相邻,我想给出更高的相关性(如上所示)

SELECT phppos_items.name, MATCH (phppos_items.name) AGAINST ('iphone 8*' IN BOOLEAN MODE) as rel 
FROM phppos_items
WHERE MATCH (phppos_items.name) AGAINST ('iphone 8*' IN BOOLEAN MODE)
ORDER BY `rel` DESC;

结果(太大而无法粘贴)

https://gist.github.com/blasto333/d8f8fe470cc1cfb1f959922ea77f8134

标签: mysqlfull-text-search

解决方案


让我们首先分析您使用的条件并按以下方式排序:

MATCH (phppos_items.name) AGAINST ('iphone 8*' IN BOOLEAN MODE)

根据Mysql Boolean Full-Text Searches,您正在匹配包含任何单词的任何文本:

  • 苹果手机
  • 8

这意味着匹配任何具有iphone OR 8的文本。

你想要的是将“ iphone 8 ”匹配为优先于“iphone”或“8*”的字符串。

为达到这个:

  • 添加“iphone 8*”作为匹配的字符串
  • 使用> <运算符
  • 优先于“iphone”和“8*”

将sql查询更改为:

AGAINST ('>"iphone 8*" >iphone <8*' IN BOOLEAN MODE)

在选择语句中

这意味着它优先于精确的 iphone 8* 和 iphone超过8*


推荐阅读