es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar la búsqueda en MySQL contra una variable.

Estoy intentando crear un procedimiento almacenado que encontrará cadenas similares utilizando la función MATCH. Sé que MATCH no funciona con los valores de columna, según esta documentación:

El argumento AGAINST() debe ser un valor de cadena que sea constante durante la evaluación de la consulta. Esto excluye, por ejemplo, una columna de tabla porque puede diferir para cada fila.

Aquí está el procedimiento que estoy intentando hacer:

delimiter //

CREATE PROCEDURE findSimilar (IN searchText VARCHAR(1000), OUT result INT)
begin
DECLARE finished INTEGER DEFAULT 0;
DECLARE title varchar(1000) DEFAULT "";
DEClARE curTitle
CURSOR FOR
SELECT title FROM news;

DECLARE CONTINUE HANDLER 
    FOR NOT FOUND SET finished = 1;

CREATE TEMPORARY TABLE match_news (title varchar(1000), similarity double);

OPEN curTitle;

getNews: LOOP
    FETCH curTitle INTO title;
    IF finished = 1 THEN 
        LEAVE getNews;
    END IF;

    insert into match_news(title, similarity)
    select title, match(searchText) against title as similarity;

END LOOP getNews;

select * from match_news
order by similarity desc;

return 0;

END //

En esta parte del código obtengo un error de sintaxis SQL:

select title, match(searchText) against title as similarity;
Tags:  ,

Answer

  1. Avatar for davy.ai

    Según se menciona en la documentación, la función de coincidencia (“match function”) no se puede usar contra los valores de columna ya que puede diferir para cada fila. En cambio, solo se puede usar contra un valor de cadena constante.

    Para lograr el objetivo de encontrar cadenas similares utilizando la función de coincidencia, puede modificar el procedimiento almacenado de la siguiente manera:

    delimiter //
    
    CREATE PROCEDURE findSimilar (IN searchText VARCHAR(1000), OUT result INT)
    begin
        DECLARE title varchar(1000) DEFAULT "";
        DECLARE matchTitle varchar(1000) DEFAULT "";
        DECLARE similarity DOUBLE DEFAULT 0;
        DECLARE finished INTEGER DEFAULT 0;
        DEClARE curTitle
            CURSOR FOR 
                SELECT title FROM news;
    
        DECLARE CONTINUE HANDLER 
            FOR NOT FOUND SET finished = 1;
    
        CREATE TEMPORARY TABLE match_news (title varchar(1000),
                                            match_title varchar(1000),
                                            similarity double);
    
        OPEN curTitle;
    
        getNews: LOOP
            FETCH curTitle INTO title;
            IF finished = 1 THEN 
                LEAVE getNews;
            END IF;
    
            SET matchTitle = (SELECT REPLACE(title, ' ', '+'));
            SET similarity = (SELECT MATCH(matchTitle) AGAINST (searchText));
    
            insert into match_news(title, match_title, similarity)
            values (title, matchTitle, similarity);
    
        END LOOP getNews;
    
        select * from match_news
        order by similarity desc;
    
        RETURN 0;
    
    END//
    

    En esta versión modificada, hemos creado una nueva columna “match_title” donde se procesa la columna “title” para reemplazar los espacios con un signo de más (+). Esto nos permite utilizar la función de coincidencia contra un valor de cadena constante.

    Además, también hemos incluido una variable “similarity” para almacenar el valor de similitud obtenido de la llamada a la función de coincidencia. Este valor se almacena junto con “title” y “match_title” en la tabla temporal “match_news”.

    Por último, el procedimiento almacenado modificado selecciona todas las filas de “match_news” ordenadas por similitud y devuelve 0 como resultado.

    Nota: Esta es solo una forma de modificar el procedimiento almacenado. Se pueden tomar diferentes enfoques en función de los requisitos y restricciones de su proyecto.

Comments are closed.