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.

¿La búsqueda de texto completo de MySQL siempre devuelve TODAS las filas que coinciden con CUALQUIER palabra consultada?

Si tengo una tabla con una columna MySQL TEXT (o VARCHAR) con un índice FULLTEXT, y las filas pueden contener una o varias palabras consultadas, y luego ejecuto una consulta estándar de la siguiente manera:

SELECT  * 
FROM my_library 
WHERE MATCH (content) 
AGAINST ("gatos perros caballo arcoiris")

…entonces, dado que todas las palabras a coincidir son, por definición, opcionales, ¿puedo estar seguro de que todas las filas que coinciden con cualquiera de las palabras de la consulta son devueltas, con las siguientes excepciones:

  • Cuando una palabra reservada es el único término que coincide en la consulta para una determinada fila
  • Cualquier palabra más corta que la longitud mínima de indexación (InnoDB < 3, MyISAM < 4)
  • Cualquier palabra más larga que la longitud máxima de indexación (InnoDB > 84)
  • Con diferencia de caso (al usar colocaciones _cs y _bin)
  • Cualquier palabra que aparezca en más del 50% de los resultados (para MyISAM)
  • Si el índice FULLTEXT no se reconstruye después de ciertos cambios de configuración (referencia)
  • Cuando se utiliza LIMIT en una tabla no optimizada después de eliminar filas (referencia)

Podría crear casos de prueba, sin embargo, serían tediosos de analizar, requerirían un volumen masivo para garantizar consistencia al buscar conjuntos de datos más grandes y aún así no serían concluyentes. (Por lo tanto, no hay enlaces a SQL fiddle o datos de prueba para esta pregunta). No pude encontrar una declaración definitiva al respecto en el manual de referencia (lenguaje natural, booleano); eso es lo que estoy buscando.

Tengo material que necesita ser revisado y necesito asegurarme de que todas las filas que coinciden con cualquier palabra consultada sean devueltas para una consulta dada. Supongo que lo hacen, pero no tengo la libertad de asumir aquí, solo para tener problemas con un comportamiento peculiar. Necesito garantizar que no se omita ningún contenido que necesite ser revisado en una consulta que se espera que coincida con todo.

Finalmente: sea cual sea la respuesta, ¿se aplica de igual manera a InnoDB y MyISAM; y a MySQL y MariaDB (versiones actuales); con modo natural y booleano (sin operadores)? ¿Existen casos en los que no se devuelvan algunas filas que podrían coincidir?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basándose en la información proporcionada en la pregunta, si una tabla en MySQL tiene una columna TEXT o VARCHAR con un índice FULLTEXT, y se ejecuta una consulta utilizando las palabras clave MATCH y AGAINST, se puede asumir que se devolverán todas las filas que coincidan con alguna/varias de las palabras consultadas, siempre y cuando se cumplan ciertas condiciones. Estas condiciones incluyen:

    • Palabras vacías: Si una palabra vacía es el único término de coincidencia en la consulta para una determinada fila, esa fila no se devolverá.
    • Longitud mínima y máxima de indexación: Las palabras más cortas que la longitud mínima de indexación (InnoDB < 3, MyISAM < 4) y más largas que la longitud máxima de indexación (InnoDB > 84) no se devolverán.
    • Diferencia de mayúsculas y minúsculas: Si se utilizan las intercalaciones _cs o _bin, las diferencias de mayúsculas y minúsculas pueden provocar que algunas filas no se devuelvan.
    • Frecuencia de palabras: En MyISAM, las palabras que aparecen en más del 50% de los resultados no se devolverán.
    • Índice FULLTEXT no reconstruido: Si el índice FULLTEXT no se reconstruye después de ciertos cambios de configuración, es posible que algunas filas no se devuelvan.
    • Tablas optimizadas: Al utilizar LIMIT en una tabla no optimizada después de eliminar filas, es posible que se devuelvan resultados vacíos.

    Cabe destacar que el comportamiento exacto puede variar según la versión de MySQL, MariaDB y el modo de consulta utilizado (natural o booleano sin operadores). Sin embargo, aún se puede asumir que las condiciones mencionadas anteriormente pueden hacer que algunas filas potencialmente coincidentes no se devuelvan.

    Para asegurarse de que se devuelvan todas las filas que coincidan con las palabras consultadas, puede ser necesario probar la consulta con diversos escenarios y analizar los resultados. También puede ser útil consultar el manual de referencia y buscar consejo de otros expertos en el campo.

Comments are closed.