No hago que la búsqueda de texto completo funcione como quiero, y no entiendo las diferencias en las listas de resultados.
Declaraciones de ejemplo:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
devuelve 92 filas. Recibo filas que tienen coincidencias, por ejemplo, como "Punkten", "Zwei-Punkte-Vorsprung" y "Treffpunkt" en la columna meldungstext.
Configuré un índice de texto completo en la columna "meldungstext" e intenté esto:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
esto devuelve solo 8 filas. Solo recibo filas que coinciden con "Punkt" o palabras que creo que se toman como "Punkt" como en "i-Punkt".
Luego probé el modo booleano:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
devuelve 44 filas. Recibo filas que tienen "Zwei-Punkte-Vorsprung" o "Treffpunkt" en la columna meldungstext, pero no las que tienen "Punkten".
¿Por qué sucede esto y cómo puedo establecer una búsqueda de texto completo que funcione "completamente" para evitar usar LIKE '%%' en la cláusula where?
fuente
Respuestas:
Tomé las tres cadenas en su pregunta y las agregué a una tabla más tres cadenas más en
pankt
lugar depunkt
.Lo siguiente se ejecutó usando MySQL 5.5.12 para Windows
Ejecuté estas consultas contra la mesa usando 3 enfoques diferentes
MATCH ... AGAINST
LOCATE
como en la función LOCATELIKE
Tenga en cuenta las diferencias.
Todos los valores de PunktMatch deben ser 3 1 y 3 0.
Ahora mírame consultarlos normalmente
OK usando MATCH .. CONTRA con punkt no funciona. ¿Qué hay de pankt ???
GROUP BY
Ejecutemos mi gran consulta contra panktEsto también está mal porque debería ver 3 0 y 3 1 para PanktMatch.
Probé otra cosa
Agregué un signo más a pankt y obtuve resultados diferentes. ¿Qué 2 y no 3?
De acuerdo con la documentación de MySQL , observe lo que dice sobre el carácter comodín:
En base a esto, el carácter comodín es aplicable para el reverso de los tokens y no para el frente. A la luz de esto, la salida debe ser correcta porque 2 de los 3 tokens de inicio del punkt. La misma historia con pankt. Esto al menos explica por qué 2 de 3 y por qué menos filas.
fuente
COUNT(IF(MATCH
consulta.COUNT(…)
en las columnas PunktMatch y PanktMatch?COUNT(IF(MATCH (
meldungstext siempre) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))
dará como resultado , porque está contando o , el resultado de .1
1
0
IF(…)