2008-08-19 31 views
12

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.Búsqueda de texto completo de SQL Server

Actualmente, el usuario puede ingresar un campo de nombre que busca 3 varchar cols diferentes. Primero, Último, Segundo nombre

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

1 - Phillip - J - Fry

2 - Amy - NULL - Wong

3 - Leo - NULL - Wong

Si el usuario introduce un nombre como 'Fry' lo hará fila de retorno 1. Sin embargo, si entran a Phillip Fry, Fr o Phil no reciben nada ... y no entiendo por qué está haciendo esto. 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 = '"'[email protected]+'"' 
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; 
.... 

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

Respuesta

3

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 llegué

.... 
@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 = '"*'[email protected]+'*"' 

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 busca a acabo simplificado para la pregunta, lo siento por eso, yo no creo que efectuarí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.

+0

Tenga en cuenta que los asteriscos como caracteres comodín solo funcionan cuando se utilizan al ** final ** de un término de búsqueda. Los asteriscos al principio de un término de búsqueda simplemente son ignorados por el motor de búsqueda de texto completo. – RSW

+0

Gracias por la respuesta. Te olvidaste de Lila y Bender. ¿Puedo usar Lucene para eso? –

4

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 separados por espacios).

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

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

4

Si solo busca los nombres de las 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.... 
2

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

En otras palabras, crear una vista de los datos que convierte todos los campos divididos como nombre apellido en los campos concatenados es decir FULL_NAME

A continuación, busque en la vista. Esto probablemente haría la consulta de búsqueda más simple.

2

Es posible que desee comprobar Lucene.net como una alternativa al texto completo.

Cuestiones relacionadas