Pergunta

Atualmente estou trabalhando em um aplicativo onde temos um banco de dados SQL-Server e preciso fazer uma pesquisa de texto completo funcionar que nos permita pesquisar nomes de pessoas.

Atualmente, o usuário pode inserir a em um campo de nome que pesquisa três colunas varchar diferentes.Nome, sobrenome e nomes do meio

Digamos que tenho 3 linhas com as seguintes informações.

1 - Phillip - J - Fritar

2 - Amy - NULO - Wong

3 - Leão - NULO - Wong

Se o usuário inserir um nome como 'Fry', ele retornará a linha 1.No entanto, se eles entrarem em Phillip Fry, ou Fr, ou Phil, eles não receberão nada.e não entendo por que está fazendo isso.Se procurarem por Wong, obterão as linhas 2 e 3; se procurarem por Amy Wong, novamente não obterão nada.

Atualmente, a consulta está usando CONTAINSTABLE, mas mudei para FREETEXTTABLE, CONTAINS e FREETEXT sem nenhuma diferença perceptível nos resultados.Os métodos de tabela são preferidos porque retornam os mesmos resultados, mas com classificação.

Aqui está a 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;  
....

Alguma ideia...?Por que esta pesquisa de texto completo não está funcionando corretamente?

Foi útil?

Solução 3

Obrigado pelas respostas pessoal, finalmente consegui fazê-lo funcionar.Com parte das respostas de Biri e Kibbee.Eu precisava adicionar * à string e dividi-la em espaços para funcionar.Então no final eu consegui

....
@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;  
....

Há mais campos sendo pesquisados. Apenas simplifiquei para a pergunta, desculpe por isso, não achei que isso afetaria a resposta.Na verdade, ele pesquisa uma coluna que possui um csv de apelidos e também uma coluna de notas.

Obrigado pela ajuda.

Outras dicas

FreeTextTable deve funcionar.

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

@SearchString deve conter valores como 'Phillip Fry' (uma string longa contendo todas as strings de pesquisa separadas por espaços).

Se você quiser procurar por Fr ou Phil, você deve usar um asterisco:Phil* e Pe*

'Phil' está procurando exatamente a palavra 'Phil'.'Phil*' está procurando todas as palavras que começam com 'Phil'

Se você estiver apenas pesquisando os nomes das pessoas, pode ser do seu interesse nem mesmo usar o índice de texto completo.O índice de texto completo faz sentido quando você tem campos de texto grandes, mas se você estiver lidando principalmente com uma palavra por campo, não tenho certeza de quanto extra você obteria com os índices de texto completo.Esperar que o índice de texto completo seja reindexado antes de poder pesquisar novos registros pode ser um dos muitos problemas.

Você poderia simplesmente fazer uma consulta como a seguinte.Divida sua string de pesquisa em espaços e crie uma lista dos termos de pesquisa.

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

Outra abordagem poderia ser abstrair a pesquisa dos campos individuais.

Em outras palavras, crie uma visualização dos seus dados que transforme todos os campos divididos, como nome, sobrenome, em campos concatenados, ou seja,nome completo

Em seguida, pesquise na visualização.Isso provavelmente tornaria a consulta de pesquisa mais simples.

Você pode querer conferir Lucene.net como alternativa ao Texto Completo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top