Aprende a implementar la búsqueda soundex (suena como) con la declaración soundex en mysql usando doctrine y symfony 2 o 3.

Cómo implementar la búsqueda Soundex (en MySql) con Doctrine y Symfony 3

La búsqueda aproximada es una característica muy importante de los motores de búsqueda web. Puede implementar la búsqueda de texto difuso dentro de su base de datos MySQL mediante el uso de una combinación de funciones de usuario integradas como coincidencia con, etc.

Para hacer coincidir los resultados incluso con una entrada mal escrita, también podemos usar la función MySQL nativa de SOUNDEX para detectarlos. En este artículo, aprenderá cómo implementar el uso de Soundex para la doctrina en un proyecto Symfony.

Nota: este tutorial funciona tanto para Symfony 2.xy Symfony 3.x.

Implementación

Para comenzar, ubíquese en la carpeta raíz de su paquete y cree una carpeta llamada Extensiones (o el directorio raíz /src), luego cree una carpeta dentro llamada Doctrine. Cree dentro de la carpeta de doctrina una nueva clase nombrada SoundexFunction.phpy guarde el siguiente código dentro.

No olvide cambiar el espacio de nombres de acuerdo con la ubicación dentro de su proyecto.

<?php

/*
 * Para cambiar este encabezado de licencia, elija Encabezados de licencia en Propiedades del proyecto.
 * Para cambiar este archivo de plantilla, elija Herramientas | Plantillas
 * y abra la plantilla en el editor.
 */

namespace ourcodeworld\Extensions\Doctrine;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;

/**
 * SoundexFunction ::= "SOUNDEX" "(" StringPrimary ")"
 */
class SoundexFunction extends FunctionNode
{

    public $stringExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $this->stringExpression = $parser->StringPrimary();
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'SOUNDEX(' .
            $this->stringExpression->dispatch($sqlWalker) .
            ')';
    }

}

La clase le permitirá usar la declaración SOUNDEX en nuestras consultas sin arrojar ningún error como:

Ahora la clase existe en nuestro proyecto, pero no está registrada. Para usarlo, necesitamos registrar la función en el config.ymlarchivo de nuestro proyecto, simplemente vaya al área de doctrina y guarde la SOUNDEX propiedad con la ruta de clases en la propiedad dql del ORM.

# app/config/config.yml
 # Configuración de Doctrine
doctrine:
    # Busque la propiedad ORM
    orm:
        # Esos valores ya deberían estar en su archivo y esto no importa
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        # Necesitamos esta propiedad dql para registrar las funciones de doctrina personalizadas:
        dql:
            string_functions:
                # Match against debe tener la ruta a la clase SOUNDEX creada en el paso anterior
                SOUNDEX: myBundle\Extensions\Doctrine\SoundexFunction

¡Y estás listo para empezar! borre el caché en caso de que esté trabajando en el entorno de producción y creemos algunas consultas .

Uso

La cláusula SOUNDEX está disponible para su uso, puede usarla dentro de un generador de consultas o DQL simple.

<?php 

class LandingController extends Controller
{
    public function indexAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $repository = $em->getRepository('myBundle:Entity');
        
        $results = $repository->createQueryBuilder('a')
            ->where("SOUNDEX(a.table_field) LIKE SOUNDEX(:search)")
            // Para usar SOUNDEX con otros métodos como MATCH_AGAINST
            // Puedes usar la clausula orWhere('SOUN....') en lugar de where
            // En caso de que no desee utilizar el parámetro, puede establecer directamente la cadena en la consulta
            //->where("SOUNDEX(a.table_field) LIKE SOUNDEX('%Title to search mispillid%')")
            ->setParameter('search','%Title to search mispillid%')
            ->getQuery()
            ->getResult();

        dump($results);
    }
}

Tenga en cuenta que usamos %text%para hacer coincidir todos los registros que contienen ese texto. No es necesario utilizar comodines si lo desea.

Entender cómo funciona soundex

Dada la siguiente tabla (con entidad Breed) en la base de datos:

ID NAME
1 Affenpinscher
2 Alaskan Malamute
3 Airedale Terrier
4 Akita
5 Australian Shepherd

El usuario puede escribir incorrectamente la raza del perro, sin embargo, se devolverá una coincidencia, es decir:

User input Expected result
afhenpinsher 1 - Affenpinscher
alscan malamute 2 - Alaskan Malamute
Airdale terrier 3 - Airedale Terrier
aquita 4 - Akita
australian chepherd 5 - Australian Shepherd

Lo que hace soundex es mirar la fonética de una cadena en particular y convertirla a una cadena estandarizada (usando este proceso, las letras y palabras que suenan similares devolverán el mismo valor, por ejemplo, la letra 'd' tendrá el mismo valor que la letra 't'). Esto no suena muy útil en absoluto, pero en realidad lo es, es decir, si ejecuta la siguiente consulta:

select 'text', soundex('text');

Obtendrá como resultado la siguiente tabla:

text SOUNDEX("text")
text T230

Y si ejecuta texto mal escrito, es decir, tixt, entonces la tabla será:

text SOUNDEX("text")
text T230

Ambas cadenas devuelven el mismo valor T230 . Soundex es un algoritmo fonético para indexar nombres por sonido, como se pronuncia en inglés, los  códigos SOUNDEX de diferentes cadenas se pueden comparar para ver qué tan similares suenan las cadenas cuando se pronuncian. El primer carácter del código es el primer carácter de la expresión, convertido a mayúsculas. Los caracteres del segundo al cuarto del código son números que representan las letras de la expresión. Las letras A, E, I, O, U, H, W e Y se ignoran a menos que sean la primera letra de la cadena. Todos los caracteres alfabéticos internacionales fuera del rango AZ se tratan como vocales. Por lo tanto, dos cuerdas que suenan casi igual deben tener cuerdas soundex idénticas. Por ejemplo, las palabras "texto" y "texto"

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores