pesquisa fonetica no SQL
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. Com ele será possível fazer uma pesquisa fonética.
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')