crear tres índices de texto completo
- a) una en la columna de la palabra clave
- b) una en la columna de contenido
- c) un tanto de palabras clave y el contenido columna
Entonces, su consulta:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2)
El punto es que rel1
le da la relevancia de su consulta solo en la columna keyword
(porque creó el índice solo en esa columna). rel2
hace lo mismo, pero para la columna content
. Ahora puede agregar estos dos puntajes de relevancia aplicando la ponderación que desee.
Sin embargo, no está utilizando ninguno de estos dos índices para la búsqueda real. Para eso, usa su tercer índice, que está en ambas columnas.
El índice (palabra clave, contenido) controla su recuperación. Aka, lo que se devuelve.
Los dos índices independientes (uno solo en palabras clave, uno solo en contenido) controlan su relevancia. Y puede aplicar sus propios criterios de ponderación aquí.
Tenga en cuenta que puede usar cualquier cantidad de índices diferentes (o, varíe los índices y las ponderaciones que utiliza en el tiempo de consulta en función de otros factores quizás ... solo busque en palabra clave si la consulta contiene una palabra de parada ... el sesgo de ponderación de las palabras clave si la consulta contiene más de 3 palabras ... etc.).
Cada índice consume espacio en disco, por lo que hay más índices y más disco. Y a su vez, una mayor huella de memoria para mysql. Además, las inserciones tardarán más, ya que tiene más índices para actualizar.
Debe comparar el rendimiento (teniendo cuidado de desactivar la caché de consultas de MySQL para la evaluación comparativa de lo contrario, los resultados serán sesgados) para su situación. Esto no es eficiente en Google, pero es bastante fácil y "listo para usar" y es casi seguro mucho mejor que el uso de "me gusta" en las consultas.
Me parece que funciona muy bien.
OK, pude hacer que esto funcione. ¡Gracias! – Buzz
Usar la instrucción like no es una excelente manera de ejecutar búsquedas. Primero, a menos que dividas cadenas, solo coincidirás en el orden exacto. es decir, buscar 'LIKE '% t-shirt red%'' no coincidirá con 'Red t-shirt' en su base de datos. En segundo lugar, terminas con un tiempo más alto para ejecutar tu consulta, ya que LIKE realiza un escaneo completo de la tabla. – ChrisG
@ChrisG 'LIKE' realiza una exploración de tabla completa cuando se utiliza en la cláusula' FROM' que no está en 'SELECT' – gontard