Pergunta

Estamos usando o SQL Server 2005 em um projeto.Os usuários do sistema têm a possibilidade de pesquisar alguns objetos usando 'palavras-chave'.A maneira como implementamos isso é criando um catálogo de texto completo para as colunas significativas em cada tabela que pode conter essas 'palavras-chave' e, em seguida, usando CONTAINS para pesquisar as palavras-chave que o usuário insere na caixa de pesquisa desse índice.

Então, por exemplo, digamos que você tenha o objeto Filme e queira permitir que o usuário pesquise palavras-chave no título e no corpo do artigo, indexaríamos as colunas Título e Enredo e faríamos algo como:

SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords)

(Na verdade, é um pouco mais avançado do que isso, mas nada muito complexo)

Alguns usuários estão adicionando números à sua pesquisa, por exemplo, desejam encontrar 'Terminator 2'.O problema aqui é que, até onde eu sei, por padrão o SQL Server não indexa palavras curtas, fazendo assim uma busca como esta:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"')

é realmente equivalente a fazer isso:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2'

e estamos obtendo uma infinidade de resultados espúrios.

Existe uma maneira de forçar o SQL Server a indexar palavras pequenas?De preferência, prefiro indexar apenas números como 1, 2, 21, etc.Não sei onde definir os critérios de indexação, nem se é possível ser tão específico assim.


Bem, eu fiz isso, removi as "palavras barulhentas" da lista e agora o comportamento é um pouco diferente, mas ainda não é o que você esperaria.

Uma pesquisa não será por "Terminator 2" (estou apenas inventando isso, meu empregador pode não ficar muito feliz se eu divulgar o que estamos fazendo...de qualquer maneira, os termos são um pouco diferentes, mas o princípio é o mesmo), não entendo qualquer coisa, mas sei que existem objetos contendo as duas palavras.

Talvez eu esteja fazendo algo errado?Eu removi todos os números 1 ...9 da minha configuração de ruído para ENG, ENU e NEU (neutro), regenerei os índices e tentei a busca.

Foi útil?

Solução

Essas "palavras pequenas" são consideradas "palavras barulhentas" pelo índice de texto completo.Você pode personalizar a lista de palavras ruidosas.Esse postagem no blog fornece mais detalhes.Você precisa preencher novamente seu índice de texto completo ao alterar o arquivo de palavras de ruído.

Outras dicas

Eu sabia sobre o arquivo de palavras de ruído, mas não sei por que seu exemplo "Terminator 2" ainda está causando problemas.Você pode tentar perguntar isso no Fórum do Mecanismo de Banco de Dados MSDN onde passam pessoas especializadas nesse tipo de coisa.

Você pode combinar CONTAINS (ou CONTAINSTABLE) com condições where simples:

SELECIONE * FROM Filmes ONDE CONTÉM (Título, '"Terminator 2"') e Título como '%Terminator 2%'

Enquanto CONTÉM encontra todos os Terminadores, onde eliminará 'Terminator 1'.

É claro que o motor é inteligente o suficiente para dar partida com CONTÉM em condições diferentes.

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