cómo escribir conteniendo la búsqueda de búsqueda con y o o os
-
29-10-2019 - |
Pregunta
Actualmente intenta escribir una declaración de selección con un containstable
Y la condición de búsqueda me está dando algo de dolor.
El propósito es buscar una tabla con 3 tipos de parámetros diferentes y clasificar la salida en consecuencia. (A continuación se muestra la muestra de mi código)
- Condición de búsqueda clave (imprescindible y ponderado en 1)
|| testvalue = Accountant
- Imprescindible adicional (ponderado .8)
|| testvalue = Manager
- Es bueno tener (ponderado .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 declaración anterior no devuelve nada y dudo de si es posible apilar los términos isabout de la manera anterior.
Los resultados devueltos deben tener tanto contador como gerente y sería bueno tener Excel
¿Alguna sugerencia para que pueda lograr esto?
Solución
Finalmente se me ocurrió una solución a mi propia pregunta con la que estoy contento por el momento.
Terminé con el procedimiento almacenado como se ve a continuación aquí (un poco largo sin aliento) que toma 3 parámetros 1. Clave de búsqueda primaria (debe coincidir) 2. Se debe tener una cadena de coma separada adicional (debe coincidir) 3. Adicional agradable para que se separe la coma cuerda
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
El procedimiento almacenado aún no está 100% completo, ya que necesita tener en cuenta la lógica adicional, pero por el momento actuará como un caparazón para el resultado final. Además, todavía tengo que probar esto en cualquier cantidad sustancial de datos, por lo que todavía no estoy seguro de qué tan bien funcionará.
Atentamente,