Je ne fais pas fonctionner la recherche en texte intégral comme je le souhaite, et je ne comprends pas les différences dans les listes de résultats.
Exemples d'instructions:
SELECT `meldungstext`
FROM `artikel`
WHERE `meldungstext` LIKE '%punkt%'
renvoie 92 lignes. Je reçois des lignes qui ont des correspondances, par exemple, comme "Punkten", "Zwei-Punkte-Vorsprung" et "Treffpunkt" dans la colonne meldungstext.
J'ai défini un index de texte intégral sur la colonne "meldungstext" et j'ai essayé ceci:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*')
cela ne renvoie que 8 lignes. Je ne reçois que des lignes qui correspondent à "Punkt" lui-même ou des mots que je pense être considérés comme "Punkt" comme dans "i-Punkt".
J'ai ensuite essayé le mode booléen:
SELECT `meldungstext`
FROM `artikel`
WHERE MATCH (`meldungstext`)
AGAINST ('*punkt*' IN BOOLEAN MODE)
renvoie 44 lignes. Je reçois des lignes qui contiennent "Zwei-Punkte-Vorsprung" ou "Treffpunkt" dans la colonne meldungstext, mais pas celles avec "Punkten".
Pourquoi cela se produit-il et comment puis-je définir une recherche de texte intégral "pleinement" fonctionnelle pour empêcher l'utilisation de LIKE '%%' dans la clause where?
la source
Réponses:
J'ai pris les trois chaînes dans votre question et je l'ai ajouté à un tableau plus trois autres chaînes avec
pankt
au lieu depunkt
.Ce qui suit a été exécuté à l'aide de MySQL 5.5.12 pour Windows
J'ai exécuté ces requêtes sur la table en utilisant 3 approches différentes
MATCH ... AGAINST
LOCATE
comme dans la fonction LOCATELIKE
Veuillez noter les différences
Toutes les valeurs de PunktMatch doivent être de 3 1 et 3 0.
Maintenant, regardez-moi les interroger comme d'habitude
OK en utilisant MATCH .. CONTRE avec punkt ne fonctionne pas. Et pankt ???
GROUP BY
Lançons ma grande requête contre panktC'est faux aussi parce que je devrais voir 3 0 et 3 1 pour PanktMatch.
J'ai essayé autre chose
J'ai ajouté un signe plus à pankt et j'ai obtenu des résultats différents. Que 2 et non 3 ???
Selon la documentation MySQL , notez ce qu'il dit sur le caractère générique:
Sur cette base, le caractère générique est applicable pour le dos des jetons et non pour le devant. À la lumière de cela, la sortie doit être correcte car 2 des 3 jetons de démarrage du punkt. Même histoire avec pankt. Cela explique au moins pourquoi 2 sur 3 et pourquoi moins de lignes.
la source
COUNT(IF(MATCH
requête.COUNT(…)
sur les colonnes PunktMatch et PanktMatch?COUNT(IF(MATCH (
meldungstext) AGAINST ('*pankt*' IN BOOLEAN MODE),1,0))
se traduira toujours par1
, car il compte1
ou0
, le résultat de laIF(…)
.