Вот ранжирование T-SQL, которое я придумал, похоже, работает довольно хорошо.
- Он ранжирует с помощью функции «Разница» каждую пару поиска: первый-первый, первый-последний, последний-первый, последний-последний, а затем добавляет вес, когда совпадение подстроки условия поиска находится в имени или фамилии с первым-первым и последние-последние спички тяжелее.
- Далее он упорядочивает те, которые имеют точные совпадения подстрок, а затем имеют самые ранние совпадения, а затем имеют наименьшую разницу между длиной строки поиска и длиной имени/фамилии.
- Весовые коэффициенты (* 2, * 4) в TotalRank являются произвольными и просто отражают мое желание придать больший вес совпадениям, которые являются первыми первыми и последними последними.
- В приведенном ниже SQL есть много дополнительных столбцов, демонстрирующих компоненты, которые входят в столбец TotalRank. Очевидно, вы можете удалить их.
`
DECLARE @searchFirst varchar(max) = 'chris';
DECLARE @searchLast varchar(max) = 'vann';
SELECT firstname, lastname,
SOUNDEX(@searchFirst) as FSearchSoundEx,
SOUNDEX(firstname) as FSoundEx,
DIFFERENCE(firstname, @searchFirst) as FDiff,
LEN(firstName) - LEN(@searchFirst) as FFDelta,
SOUNDEX(lastname) as LSoundEx,
SOUNDEX(@searchLast) as LSearchSoundEx,
DIFFERENCE(lastName, @searchLast) as LDiff,
LEN(lastName) - LEN(@searchLast) as LLDelta,
PATINDEX('%' + @searchFirst + '%', firstname) as FFIndex,
PATINDEX('%' + @searchFirst + '%', lastname) as FLIndex,
PATINDEX('%' + @searchLast + '%', firstname) as LFIndex,
PATINDEX('%' + @searchLast + '%', lastname) as LLIndex,
CONVERT(BIT, PATINDEX('%' + @searchFirst + '%', firstname)) as HasFF,
CONVERT(BIT, PATINDEX('%' + @searchFirst + '%', lastname)) as HasFL,
CONVERT(BIT, PATINDEX('%' + @searchLast + '%', firstname)) as HasLF,
CONVERT(BIT, PATINDEX('%' + @searchLast + '%', lastname)) as HasLL,
DIFFERENCE(firstname, @searchFirst) * DIFFERENCE(firstname, @searchFirst) as FFDiffSq, DIFFERENCE(lastname, @searchFirst) * DIFFERENCE(lastname, @searchFirst) as FLDiffSq, DIFFERENCE(firstname, @searchLast) * DIFFERENCE(firstname, @searchLast) as LFDiffSq, DIFFERENCE(lastname, @searchLast) * DIFFERENCE(lastname, @searchLast) as LLDiffSq,
DIFFERENCE(firstname, @searchFirst) * DIFFERENCE(firstname, @searchFirst) + DIFFERENCE(lastname, @searchFirst) * DIFFERENCE(lastname, @searchFirst) + DIFFERENCE(firstname, @searchLast) * DIFFERENCE(firstname, @searchLast) + Difference(lastname, @searchLast) * Difference(lastname, @searchLast) as SumDiffSquares,
DIFFERENCE(firstname, @searchFirst) * DIFFERENCE(firstname, @searchFirst) * 2 + DIFFERENCE(lastname, @searchFirst) * DIFFERENCE(lastname, @searchFirst) + DIFFERENCE(firstname, @searchLast) * DIFFERENCE(firstname, @searchLast) + DIFFERENCE(lastname, @searchLast) * DIFFERENCE(lastname, @searchLast) * 2
+ CONVERT(BIT, PATINDEX('%' + @searchFirst + '%', firstname)) * 4 + CONVERT(BIT, PATINDEX('%' + @searchFirst + '%', lastname)) + CONVERT(BIT, PATINDEX('%' + @searchLast + '%', firstname)) + CONVERT(BIT, PATINDEX('%' + @searchLast + '%', lastname)) * 4 as TotalRank
FROM Contacts
ORDER BY TotalRank Desc, HasLL Desc, HasFF Desc, HasFL Desc, HasLF Desc, LLIndex, FFIndex, FLIndex, LFIndex, LLDelta, FFDelta
person
Erikest
schedule
14.01.2019