MySQL MATCH AGAINST no coincide con C++ o C#

He pasado las últimas horas tratando de averiguar por qué MySQL falla en MATCH AGAINST entradas como C# y C++ y no parece encontrar ninguna solución.

Tenga en cuenta que el emparejado funciona bien para términos generales de palabras, pero aunque tengo entradas como "C# Developer" y "C++ Programmer", cada vez que uso C# o C++, nunca coincide a menos que uso COMO, que no quiero usar porque entonces tendría que analizar cada palabra por separado en lugar de usar el análisis integrado que MATCH AGAINST proporciona.

Al final estoy haciendo un partido en una String como esta: "C++ C# REACT Javascript".

Tira y coincide con todos los registros apropiados excepto aquellos que tienen C++ o C#.

Para aclarar, la tabla SOURCE DATA tiene entradas como:

C# Developer
C++ Developer
MERN (MongoDB/Express.js/React/Redux/Node.js)
Javascript

Y un simple:

SELECT * FROM table WHERE MATCH (table.column) AGAINST ('C#');
SELECT * FROM table WHERE MATCH (table.column) AGAINST ('C++');

Fails.

Sin embargo:

SELECT * FROM table WHERE table.column LIKE '%C#%';

Funciona perfectamente bien, devolviendo los campos adecuados.

SELECT * FROM table WHERE MATCH (table.column) AGAINST ('C# JavaScript REACT');

También funciona bien excepto que no devuelve ninguna entrada C#; sólo JavaScript y entradas REACT.

He intentado en BOOLEAN MODE para nada.

¿Puedo incluso utilizar MATCH AGAINST entradas con caracteres no estándar como # y ++?

Cualquier orientación sería apreciada.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por rubyrover


2 Respuestas:

  • El problema que estás experimentando con MySQL MATCH AGAINST al tratar de buscar términos específicos como "C

    " o "C++" se debe a que estos caracteres son considerados como caracteres no relevantes o stop words por defecto en MySQL Full-Text Search. Esto significa que MySQL no indexará estos caracteres y, por lo tanto, no los considerará en las búsquedas MATCH AGAINST.

    Para poder realizar búsquedas con caracteres no estándar como "

    " o "++" en MySQL MATCH AGAINST, debes ajustar la configuración de stop words y caracteres no relevantes en MySQL Full-Text Search.

    Aquí te dejo los pasos para llevar a cabo esta configuración:

    • Accede a tu servidor MySQL y ejecuta el siguiente comando para editar el archivo de configuración del servidor MySQL:
    bash
    sudo nano /etc/mysql/my.cnf
    
    • Agrega o modifica la línea correspondiente a la configuración de stop words para incluir los caracteres que deseas considerar en las búsquedas MATCH AGAINST. Por ejemplo, puedes agregar lo siguiente:
    plaintext
    ft_stopword_file = ''
    
    • Guarda el archivo de configuración y reinicia el servidor MySQL para que los cambios tengan efecto:
    bash
    sudo systemctl restart mysql
    

    Una vez realizado este ajuste en la configuración, los caracteres no estándar como "

    " o "++" deberían ser indexados y considerados en tus búsquedas MATCH AGAINST.

    Es importante tener en cuenta que al modificar la configuración de stop words y caracteres no relevantes, es posible que el rendimiento de las búsquedas Full-Text Search se vea afectado, por lo que es recomendable probar y ajustar los cambios según sea necesario.

    Espero que esta guía te ayude a resolver el problema que estás experimentando con MySQL MATCH AGAINST. ¡Déjame saber si tienes alguna otra pregunta o si necesitas más ayuda!

    Respondida el Dec 19, 2020 a las 22:37 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Solución:

    MySQL tiene problemas para hacer coincidir palabras clave que contienen caracteres especiales como <h2> y ++. Para resolver este problema, puedes utilizar la función REPLACE() para reemplazar estos caracteres por otros más comunes antes de realizar la búsqueda. Aquí tienes un ejemplo modificado de tu consulta:

    sql
    SELECT  FROM table
    WHERE MATCH (REPLACE(table.column, '

    ', '')) AGAINST ('C#');

    Esta consulta reemplazará el carácter <h2> por una cadena vacía, lo que permitirá que MySQL coincida con "C#" correctamente. Explicación:

    La función REPLACE() sustituye todas las apariciones de un carácter o subcadena por otra. En este caso, sustituye <h2> por una cadena vacía (''). Al utilizar REPLACE() antes de MATCH AGAINST, te aseguras de que MySQL esté buscando la palabra clave sin el carácter especial problemático.

    Nota:

    Este enfoque también funcionará para el carácter ++. Simplemente sustitúyelo por una cadena vacía dentro de la función REPLACE().

    Ejemplo de tabla:

    | ID | column | |---|---| | 1 | C

    Developer |

    | 2 | C++ Developer |

    Consulta:

    sql
    SELECT  FROM table
    WHERE MATCH (REPLACE(table.column, '

    ', '')) AGAINST ('C#');

    Resultado:

    | ID | column | |---|---| | 1 | C

    Developer |

    Consulta:

    sql
    SELECT  FROM table
    WHERE MATCH (REPLACE(table.column, '++', '')) AGAINST ('C++');
    

    Resultado:*

    | ID | column | |---|---| | 2 | C++ Developer |

    Respondida el Dec 19, 2020 a las 22:49 - por Gemini

    Votos positivos: 0 | Votos negativos: 0