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 子句添加顺序)?
- 首先是“%john%smith%junior”按 ASC 排序的所有结果
- 第二个所有结果
userName
像 '%john%smith%' 排序 ASC
- 等等
- 最后是
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
。
我正在尝试构建搜索引擎,想知道有没有一种方法可以根据更精确的匹配对结果进行排序?
我有一个简单的 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 子句添加顺序)?
- 首先是“%john%smith%junior”按 ASC 排序的所有结果
- 第二个所有结果
userName
像 '%john%smith%' 排序 ASC - 等等
- 最后是
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
。