MySQL: comportamiento inesperado 'en modo booleano'
Pregunta
Utilizo la siguiente llamada para obtener información de una base de datos:
select *
from submissions
where
match( description ) against ('+snowboard' in boolean mode )
and (!disabled or disabled='n')
order by datelisted desc limit 30
Lo que significa que todo con 'snowboard' en la descripción se encuentra. Ahora aquí está el problema:
select *
from submissions
where
match( description ) against ('+snowboard +mp4' in boolean mode )
and (!disabled or disabled='n')
order by datelisted desc limit 30
ignorará el +mp4 por alguna razón y devolverá lo mismo que la primera consulta
select *
from submissions
where
match( description ) against ('+mp4' in boolean mode )
no devuelve nada, así que básicamente parece que se ignora en la búsqueda
¿Alguien sabe cómo trabajar en torno a este comportamiento?
Solución
El modo booleano de MySQL solo coincidirá con palabras que son más largas que una cierta longitud. y mp4
es demasiado corto. Tendrías que recompilar mysql para cambiar el umbral
Editar: Resulta que esto ahora se puede configurar a través del archivo de configuración, ver http://dev.mysql.com/doc/refman/5.0/en/fulltext-fine-tuning.html Para referencia de Furhter
Otros consejos
Su problema es la longitud mínima de la palabra, que de forma predeterminada es de 3 caracteres. Prueba lo mismo con +snowboard +scooter
Y verás que funciona. (Suponiendo que no tenga scooters en su base de datos, por supuesto).
Ver Ajuste la búsqueda de texto completo mysql Sobre cómo cambiarlo:
Las longitudes mínimas y máximas de las palabras a indexar se definen por el
ft_min_word_len
yft_max_word_len
Variables del sistema. (Consulte la Sección 5.1.4, "Variables del sistema del servidor".) El valor mínimo predeterminado es cuatro caracteres; El máximo predeterminado depende de la versión. Si cambia cualquier valor, debe reconstruir sus índices de texto completo. Por ejemplo, si desea que se puedan buscar palabras de tres caracteres, puede establecer la variable ft_min_word_len colocando las siguientes líneas en un archivo de opción:
[mysqld] ft_min_word_len=3
Luego reinicie el servidor y reconstruya sus índices de texto completo. Tenga en cuenta particularmente los comentarios sobre MyisAmchk en las instrucciones que siguen esta lista.