MySQL 根据相乘 'LIKE' 对结果进行特定排序并更好地匹配已建立的结果

MySQL specific sorting of the result based on multiply 'LIKE' and better matching of the founded results

我正在尝试构建搜索引擎,想知道有没有一种方法可以根据更精确的匹配对结果进行排序?

我有一个简单的 table library,其中存储了用户名:

userName
john hampton
smith horne
john smith junior
kevin spencer
john white smith
luke junior
alan smith junior

基于搜索字段输入。例如,如果我想搜索 john smith junior 我不仅要检查全名匹配,还要检查名称的匹配部分。所以预期结果应该是:

userName
john smith junior
john white smith
alan smith junior
john hampton
smith horne
luke junior

第一行需要评分最高,因为我们有三个匹配项,第二和第三行有两个匹配项,其余只有一个匹配项,但按输入字段提交排序。

我开始构建以下查询:

SELECT `userName`
FROM `library`
WHERE `userName` like '%john%smith%junior'
  OR `userName` like '%john%smith%'
  OR `userName` like '%john%junior%'
  OR `userName` like '%smith%junior%'
  OR `userName` like '%john%'
  OR `userName` like '%smith%'
  OR `userName` like '%junior%'
ORDER BY ???

但我阻止了如何对结果进行排序,所以我的问题是 - 是否可以在 ORDER BY 中添加一些特殊子句以使结果按要求排序(优先级基于 where 子句添加顺序)?

  1. 首先是“%john%smith%junior”按 ASC 排序的所有结果
  2. 第二个所有结果 userName 像 '%john%smith%' 排序 ASC
  3. 等等
  4. 最后是 userName 像“%junior%”这样的 ASC 排序的所有结果
...
ORDER BY (`userName` like '%john%smith%junior') * @weight1 +
         (`userName` like '%john%smith%')       * @weight2 +
         (`userName` like '%john%junior%')      * @weight3 +
         (`userName` like '%smith%junior%')     * @weight4 +
         (`userName` like '%john%')             * @weight5 +
         (`userName` like '%smith%')            * @weight6 +
         (`userName` like '%junior%')           * @weight7 

考虑到条件的实际权重是它及其所有子条件的权重之和。

例如,匹配条件like '%john%smith%'的行也匹配like '%john%'like '%smith%',即该模式的实际权重为@weight2 + @weight5 + @weight6