FullText não encontra uma palavra específica
- Ignez
- 23 de jul. de 2019
- 2 min de leitura
Eu montei um índice FullText para uma tabela de um cliente, com estas colunas:
Chassi - varchar(30)
chassi do veículo
Motor - varchar(20)
código do motor com até 17 caracteres
Combustivel - varchar(20)
Alcool
Gasolina
Alcool / Gasolina
Diesel
DescricaoServico - varchar(max)
tudo o que seria feito no veículo
StatusServico - varchar(20)
Aprovado
Cancelado
Reprovado
Aprovado com restrições
Conforme (usado quando o serviço é preparação do veículo para vistorias)
O objetivo da consulta era identificar um atendimento, considerando uma ou mais das cinco colunas acima. A consulta original usava LIKE '%' + @variavel + '%' para todas as colunas, porque a pesquisa poderia ser, por exemplo, por uma parte do código do motor, para localizar todos os serviços daquele tipo específico de motor.
Depois de várias opções, sugeri o uso de FullText:
Ajustamos as consultas e começamos os testes. Tudo estava indo muito bem, as consultas que levavam pelo menos 25 segundos, começaram a retornar em 0 segundo. Só que aí surgiu um problema, as consultas do StatusServico = 'CONFORME' não retornava os registros.
Se a cláusula fosse WHERE StatusServico = 'CONFORME', os registros eram encontrados.
Se a cláusula fosse WHERE CONTAINS(StatusServico, 'CONFORME'), nenhum registro era encontrado!
Depois de quebrar a cabeça, me lembrei que o FullText ignora algumas palavras, com artigos, conjunções e preposições. Segundo o dicionário, CONFORME pode ser um adjetivo, conjunção ou preposição, dependendo do uso na frase. Como eu criei o índice com o idioma "Brazilian", a palavra CONFORME foi desconsiderada.
Para resolver esta situação rapidamente, eu optei por alterar o idioma da coluna StatusServico no FullText para inglês. Assim, a palavra CONFORME deixou de ser considerada uma preposição, e o FullText encontrou os registros que eu queria.
Esta solução atendeu especificamente essa tabela desse cliente. É importante analisar cuidadosamente o uso do FullText em seu ambiente, para garantir que a troca do idioma não vai atrapalhar outras consultas. E como o idioma é definido por coluna, a pesquisa pela descrição do serviço não foi afetada.
Posts recentes
Ver tudoUma dica facinha, para ajudar naquelas consultas por amostragem. Use ORDER BY NewId() para retornar resultados diferentes a cada SELECT.
Estas são duas formas simples de matar todas as conexões de usuários conectados a um banco de dados específico no SQL Server. É bem comum...
Desde os primórdios dos bancos de dados ouvimos que "a informação é o bem mais precioso que as empresas possuem". Obviamente, se essa...
Comments