我有一个前端搜索框,用户可以通过名字,中间名,姓氏或职位搜索某人,后端代码的大部分如下所示:
SELECT TOP 50 * FROM (SELECT [EmployeeId], SUM(MatchOrder) as MatchOrder
FROM (SELECT
[EmployeeId],
CASE WHEN A.[EmployeeFieldId] = 4 Then 15 --Surname
WHEN A.[EmployeeFieldId] in (1, 2) Then 15 --PreferredName, FirstName
WHEN A.[EmployeeFieldId] = 3 Then 5 --MiddleName
WHEN A.[EmployeeFieldId] = 5 Then 20 --JobTitle
ELSE 3
END as MatchOrder
FROM [latest].[EmployeeAttributes] A
WHERE (' + @search + ')
) internal
GROUP BY EmployeeId) A
join dbo.vwEmployees E on E.EmployeeId = A.EmployeeId -- TEMP
ORDER BY 2 DESC'
每个employeeID都有一个分数(MatchOrder),根据满足上述条件的数量(例如,名字+姓氏匹配= 30)进行总计,然后按MatchOrder分数对搜索进行排序。前端,但问题是,如果有人的第一和姓氏非常相似,例如帕特里克帕特森和我只搜索帕特赖斯,然后帕特里克帕特森(30点)出现在帕特里克赖斯(30分钟)之上,因为名字正在匹配两次。
我希望它能够在双倍匹配时降低得分,或者修改我的switch语句以某种方式执行此操作(嵌套情况?
你知道我怎么能打击这个吗?任何帮助将不胜感激。
由于
答案 0 :(得分:0)
由于[EmployeeFieldId]始终映射到相同的[MatchOrder],因此您应该能够通过在" internal"中包含[EmployeeFieldId]来控制它。结果集并在SELECT:
上打一个DISTINCT子句 SELECT DISTINCT
[EmployeeId],
[EmployeeFieldId],
CASE WHEN A.[EmployeeFieldId] = 4 Then 15 --Surname
WHEN A.[EmployeeFieldId] in (1, 2) Then 15 --PreferredName, FirstName
WHEN A.[EmployeeFieldId] = 3 Then 5 --MiddleName
WHEN A.[EmployeeFieldId] = 5 Then 20 --JobTitle
ELSE 3
END as MatchOrder
FROM [latest].[EmployeeAttributes] A
WHERE (' + @search + ')
这样,每个员工将获得最多一个相同的字段ID,用于他们的分数。