В конце концов я нашел решение своего собственного вопроса, которым я пока доволен.
Я закончил с хранимой процедурой, как показано ниже (немного затянуто), которая требует3 параметра 1. Первичный ключ поиска (должен совпадать) 2. Дополнительный должен иметь разделенную запятыми строку (должен совпадать) 3. Дополнительный приятно иметь разделенную запятыми строку
CREATE PROCEDURE [dbo].[GetJobSeekers]
(
@KeywordSearch nvarchar(500),
@MustHave nvarchar(500), --Comma separated skills
@NiceToHave nvarchar(500) --Comma separated skills
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL nvarchar(4000)
DECLARE @SELECT nvarchar(4000)
DECLARE @SEARCH nvarchar(4000)
DECLARE @SEARCH1 nvarchar(4000)
DECLARE @SEARCH2 nvarchar(4000)
DECLARE @WHERE nvarchar(4000)
DECLARE @ORDERBY nvarchar(4000)
/*Used for string split*/
DECLARE @POS int
DECLARE @NEXTPOS int
/*Get Result for primary search key*/
SET @SELECT = 'SELECT ktbl.rank AS [Ranking], jobseekers.*'
SET @SEARCH = 'ISABOUT("'+@KeywordSearch+'" weight(1))'
SET @WHERE = ' FROM jobseekers INNER JOIN
CONTAINSTABLE (jobseekers, *, ''' + @SEARCH + ''')
AS ktbl On jobseekers.Id = ktbl.[KEY]'
SET @ORDERBY= 'ORDER BY [Ranking] DESC'
/* Get Result set for all additional must have keywords and INNER JOIN With primary Search */
IF @MustHave <> ''
BEGIN
DECLARE @MustHaveSplitString nvarchar(500)
SET @POS = 1
WHILE(@POS <= LEN(@MustHave))
BEGIN
SELECT @NEXTPOS = CHARINDEX(N',', @MustHave, @POS)
IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL)
SELECT @NEXTPOS = LEN(@MustHave) + 1
SELECT @MustHaveSplitString = RTRIM(LTRIM(SUBSTRING(@MustHave, @POS, @NEXTPOS - @POS)))
SET @SELECT = @SELECT + ', ktbl'+@MustHaveSplitString+'.rank AS [Ranking'+@MustHaveSplitString+']'
SET @ORDERBY = @ORDERBY + ', [Ranking'+@MustHaveSplitString+'] DESC'
SET @SEARCH1 = 'ISABOUT("'+@MustHaveSplitString+'" weight(.8))'
SET @WHERE = @WHERE + ' INNER JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH1 + ''')
AS ktbl'+@MustHaveSplitString+' on Jobseekers.Id = ktbl'+@MustHaveSplitString+'.[KEY]'
SELECT @POS = @NEXTPOS+1
END
END
/*Get result set for all nice to have by stacking them in the isabout searchcondition and LEFT OUTER JOIN with Primary Search + Must have search if its there*/
IF @NiceToHave <> ''
BEGIN
DECLARE @NiceToHaveSplitString nvarchar(500)
SET @SEARCH2 = 'ISABOUT('
SET @POS = 1
WHILE(@POS <= LEN(@NiceToHave))
BEGIN
SELECT @NEXTPOS = CHARINDEX(N',', @NiceToHave, @POS)
IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL)
SELECT @NEXTPOS = LEN(@NiceToHave) + 1
SELECT @NiceToHaveSplitString = RTRIM(LTRIM(SUBSTRING(@NiceToHave, @POS, @NEXTPOS - @POS)))
SET @SEARCH2 = @SEARCH2 + '"'+@NiceToHaveSplitString+'" weight(.5),'
SELECT @POS = @NEXTPOS+1
END
/*Clean last , off the search2 string */
SET @SEARCH2 = LEFT(@SEARCH2, LEN(@SEARCH2) -1)
/*Close the isabout in search2 string*/
SET @SEARCH2 = @SEARCH2 + ')'
SET @SELECT = @SELECT + ', ktbl2.rank AS [Ranking2]'
SET @ORDERBY = @ORDERBY + ', [Ranking2] DESC'
SET @WHERE = @WHERE + ' LEFT JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH2 + ''')
AS ktbl2 on Jobseekers.Id = ktbl2.[KEY]'
END
SET @SQL = @SELECT + @WHERE + @ORDERBY
EXEC sp_executesql @SQL
END
Хранимая процедура все еще не завершена на 100%поскольку он должен принимать во внимание дополнительную логику, но пока он будет действовать как оболочка для конечного результата.Кроме того, мне еще предстоит проверить это на значительном объеме данных, поэтому я все еще не уверен, насколько хорошо он будет работать.
С уважением,