Come scrivere la condizione di ricerca con esso con e sta
-
29-10-2019 - |
Domanda
Attualmente cerca di scrivere un'istruzione selezionata con a containstable
E la condizione di ricerca mi dà un po 'di dolore.
Lo scopo è cercare una tabella con 3 diversi tipi di parametri e classificare di conseguenza l'output. (Di seguito è riportato il campione del mio codice)
- CONDIZIONE DI RICERCA CHIAVE (must-have e ponderato a 1)
|| testvalue = Accountant
- Must-have aggiuntivo (ponderato .8)
|| testvalue = Manager
- Bello da avere (ponderato .5)
|| testvalue = Excel
SQL:
SELECT KTBL.Rank as [Ranking], KeySkills
FROM Applicants INNER JOIN
CONTAINSTABLE(Applicants, KeySkills,
'(ISABOUT("Accountant" weight(1))) &
(ISABOUT("Manager" weight(.8))) |
(ISABOUT("Excel") weight(.5)))
AS KTBL
ON Applicants.Id = KTBL.[KEY];
La dichiarazione di cui sopra non restituisce nulla e dubito che sia possibile impilare i termini Isabout nel modo sopra.
I risultati restituiti devono avere sia contabile che manager e sarebbe bello avere Excel
Qualche suggerimento per avere posso raggiungere questo obiettivo?
Soluzione
Alla fine ho trovato una soluzione alla mia domanda di cui sono felice per il momento.
Ho finito con la procedura memorizzata come visto di seguito qui (un po 'di tempo lungo) che richiede 3 parametri 1. Chiave di ricerca primaria (deve abbinare) 2. Ulteriori deve avere una stringa separata da virgo corda
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
La procedura memorizzata non è ancora completa al 100% in quanto deve prendere in considerazione la logica aggiuntiva, ma per il momento fungerà da guscio per il risultato finale. Inoltre devo ancora testarlo da qualsiasi notevole quantità di dati, quindi non sono ancora sicuro di quanto bene si esibirà.
Cordiali saluti,