sql-server - indexes - install full text search sql server 2017
Búsqueda de texto completo de SQL Server (5)
Actualmente estoy trabajando en una aplicación donde tenemos una base de datos SQL-Server y necesito obtener un trabajo de búsqueda de texto completo que nos permita buscar nombres de personas.
Actualmente, el usuario puede ingresar un campo de nombre que busca 3 varchar cols diferentes. Primero, último, segundo nombre
Entonces digo que tengo 3 filas con la siguiente información.
1 - Phillip - J - Fry
2 - Amy - NULL - Wong
3 - Leo - NULL - Wong
Si el usuario ingresa un nombre como ''Fry'' devolverá la fila 1. Sin embargo, si ingresan a Phillip Fry, o Fr, o Phil no obtienen nada ... y no entiendo por qué lo está haciendo. Si buscan a Wong, obtienen las filas 2 y 3 si buscan a Amy Wong, y de nuevo no obtienen nada.
Actualmente, la consulta está usando CONTAINSTABLE pero la he cambiado con FREETEXTTABLE, CONTAINS y FREETEXT sin diferencias notables en los resultados. Los métodos de tabla son preferidos 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?
Es posible que desee comprobar Lucene.net como una alternativa al texto completo.
FreeTextTable debería funcionar.
INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString)
@SearchString debe contener los 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 usar asterisco: Phil * y Fr *
''Phil'' está buscando exactamente la palabra ''Phil''. ''Phil *'' busca cada palabra que comienza con ''Phil''
Otro enfoque podría ser abstraer la búsqueda de los campos individuales.
En otras palabras, cree una vista en sus datos que convierta todos los campos divididos como firstname lastname en campos concatenados, es decir full_name
Luego busca en la vista. Esto probablemente haría la consulta de búsqueda más simple.
Si solo busca nombres de personas, podría ser mejor para usted no usar el índice de texto completo. El índice de texto completo tiene sentido cuando tiene campos de texto grandes, pero si en su mayoría se trata de una palabra por campo, no estoy seguro de cuánto extra obtendría de los índices de texto completo. Esperar a que el índice de texto completo reindexe antes de poder buscar nuevos registros puede ser uno de los muchos problemas.
Puede hacer una consulta como la siguiente. Divida su búsqueda en espacios y cree una lista de 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....
Gracias por las respuestas chicos finalmente pude hacer que funcione. Con parte de Biri, y las respuestas de Kibbee. Necesitaba agregar * a la cadena y dividirla en espacios para poder trabajar. Así que al final obtuve
....
@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;
....
Hay más campos que se buscan. Simplemente lo simplifiqué para la pregunta, lo siento, no pensé que afectaría la respuesta. En realidad, busca una columna que tenga un csv de apodos y una columna de notas también.
Gracias por la ayuda.