pesquisa fonetica no SQL

Veja como pesquisar informações por semelhança fonética no MySQL e no SQL Server

Ao criar sistemas online para pesquisa de dados, pode ocorrer o caso do usuário escrever errado o nome do item que ele deseja localizar. Utilizando como exemplo um listagem de produtos, o usuário deseja localizar uma mochila e ele escreve "moxila". Utilizando o operado "LIKE", não seriam localizados resultados.

Será que seria possível resolver este problema?

Para tentar ajudar nestas situações, o SQL possui uma função chamada SOUNDEX.

A função SOUNDEX() retorna um código de quatro caracteres para avaliar a semelhança de duas expressões. Esta função converte a expressão pesquisada num código de quatro caracteres, ele toma como base a forma como a expressão solicitada soa quando falada. A referência é o idioma inglês.

Veja um exemplo comparando dois textos parecidos:

SELECT SOUNDEX('Mochila') AS exemplo1, SOUNDEX ('Moxila') AS exemplo2;

Ao executar a consulta acima, perceba que o código gerado gerado ambos foi o mesmo.

Para ver como isso funciona na prática, vamos criar uma tabela de testes e vamos adicionar algums registros:

//MYSQL

CREATE TABLE produtos (

codigo INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,

nome VARCHAR(50) NOT NULL

)

//SQL SERVER

CREATE TABLE [dbo].[produtos](

[codigo] [int] IDENTITY(1,1) NOT NULL,

[nome] [varchar](50) NOT NULL,

 CONSTRAINT [PK_produtos] PRIMARY KEY CLUSTERED 

([codigo] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

 

Informações que vamos utilizar como exemplo:

 

insert into produtos (nome) VALUES ('Mochila');

insert into produtos (nome) VALUES ('Muchila');

insert into produtos (nome) VALUES ('Moxila');

insert into produtos (nome) VALUES ('Muxila');

insert into produtos (nome) VALUES ('Chaveiro');

insert into produtos (nome) VALUES ('Xaveiro');

insert into produtos (nome) VALUES ('Chavero');

insert into produtos (nome) VALUES ('Xavero');

insert into produtos (nome) VALUES ('travesseiro');

insert into produtos (nome) VALUES ('traveçeiro');

insert into produtos (nome) VALUES ('travesero');

insert into produtos (nome) VALUES ('Chaveiro de plástico');

insert into produtos (nome) VALUES ('Chaveiro de metal');

insert into produtos (nome) VALUES ('Chavero de plástico');

insert into produtos (nome) VALUES ('Chavero de metal');

 

Agora vamos as consultas:

 

select * from produtos where SOUNDEX(nome) = SOUNDEX('Moxila');

A consulta trouxe 4 resultados, já que os exemplos cadastrados tinha sonoridade parecida.

 

select * from produtos where SOUNDEX(nome) = SOUNDEX('Xaveiro');

Trouxe apenas 1 resultado ao pesquisar no MySQL e 2 resultados ao pesquisar no SQL Server. Apesar dos outros cadastros terem a sonoridade parecida, a referência não é o idioma portugês. A sonoridade tem com base o inglês.

 

select * from produtos where SOUNDEX(nome) = SOUNDEX('travesero');

Nest consulta, houve o retorno de 2 resultados. O nome que foi escrito com cedilha não apareceu nos resultados.

 

select * from produtos where SOUNDEX(nome) = SOUNDEX('Chavero');

Trouxe 6 resultados no SQL Server e 2 resultados no MySQL, não retornou os nomes que tinham "plástico" e "metal" na sequência. Para resolver este problema, vamos considerar que a pesquisa considere o começo do nome, antes do primeiro espaço. Sendo assim, a consulta anterior no MySQL ficaria da seguinte forma:

 

SELECT * FROM produtos WHERE SOUNDEX(SUBSTRING_INDEX(nome, ' ', 1)) = SOUNDEX('Chavero')

 

 

Quer conferir mais dicas sobre banco de dados? Clique aqui e veja mais dicas!