Pregunta

Actualmente estoy trabajando en una aplicación donde tenemos una base de datos SQL-Server y necesito ejecutar una búsqueda de texto completo que nos permita buscar nombres de personas.

Actualmente, el usuario puede ingresar un campo de nombre que busca 3 columnas varchar diferentes.Nombre, apellido y segundo nombre

Digamos que tengo 3 filas con la siguiente información.

1 - Phillip - J - Freír

2 - Amy - NULO - Wong

3 - Leo - NULO - Wong

Si el usuario ingresa un nombre como 'Fry', devolverá la fila 1.Sin embargo, si ingresan a Phillip Fry, Fr o Phil, no obtendrán nada.y no entiendo por qué está haciendo esto.Si buscan a Wong, obtienen las filas 2 y 3. Si buscan a Amy Wong, nuevamente no obtienen nada.

Actualmente, la consulta utiliza CONTAINSTABLE pero lo cambié con FREETEXTTABLE, CONTAINS y FREETEXT sin diferencias notables en los resultados.Se prefieren los métodos de tabla porque devuelven los mismos resultados pero con clasificación.

Aquí está la consulta.

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
SET @SearchString = '"'+@Name+'"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

Algunas ideas...?¿Por qué esta búsqueda de texto completo no funciona correctamente?

¿Fue útil?

Solución 3

Gracias por las respuestas chicos, finalmente pude hacerlo funcionar.Con parte de las respuestas de Biri y Kibbee.Necesitaba agregar * a la cadena y dividirla en espacios para que funcionara.Así que al final conseguí

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)

--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'

SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

Se están buscando más campos. Simplemente lo simplifiqué para la pregunta, lo siento, no pensé que afectaría la respuesta.De hecho, busca en una columna que tiene un csv de apodos y también una columna de notas.

Gracias por la ayuda.

Otros consejos

FreeTextTable debería funcionar.

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString debe contener valores como 'Phillip Fry' (una cadena larga que contiene todas las cadenas de búsqueda separadas por espacios).

Si desea buscar Fr o Phil, debe utilizar un asterisco:Phil* y padre*

'Phil' está buscando exactamente la palabra 'Phil'.'Phil*' busca cada palabra que comienza con 'Phil'

Si solo está buscando los nombres de las personas, puede que le convenga ni siquiera utilizar el índice de texto completo.El índice de texto completo tiene sentido cuando tienes campos de texto grandes, pero si tratas principalmente con una palabra por campo, no estoy seguro de cuánto extra obtendrías de los índices de texto completo.Esperar a que el índice de texto completo se reindexe antes de poder buscar nuevos registros puede ser uno de los muchos problemas.

Podría simplemente hacer una consulta como la siguiente.Divida su cadena de búsqueda en espacios y cree una lista de los términos de búsqueda.

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....

Otro enfoque podría ser abstraer la búsqueda de los campos individuales.

En otras palabras, cree una vista de sus datos que convierta todos los campos divididos, como nombre, apellido, en campos concatenados, es decir,nombre completo

Luego busque en la vista.Esto probablemente simplificaría la consulta de búsqueda.

Quizás quieras echar un vistazo Lucene.net como alternativa al texto completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top