2009-09-23 8 views
1

J'aimerais que les résultats de ma recherche en texte intégral dans MySQL soient triés en fonction du degré de couverture du motif. Par exemple, la recherche de pomme dans une base de données nutritionnelle devrait trier "pomme, cru" plus haut que "beignet de pomme" depuis 5/9> 5/12.Comment mesurer exactement comment une colonne correspond à un motif?

Je peux le faire plutôt trivialement en dehors de la base de données, mais je suis à la recherche d'une requête qui va le faire en une seule fois.

Des idées?

Merci.

+0

Je vois l'esprit de la question, cependant, la règle utilisée dans l'exemple semble arbitraire en ce qui concerne le concept recherché (« pomme »), ici. Avec ce genre de règle, la «pomme, cultivée organiquement» se classerait bien au-dessous de «pomme, sac» qui est bien ... éteint. – mjv

+0

@mjv - S'il est préoccupé par la longueur de chaîne dans la base de données, sa méthodologie de recherche est correcte. Si Allain est soucieux de tirer une valeur nutritive d'une chaîne de texte, je pense qu'il aboie le mauvais arbre. :) –

Répondre

2

ORDER BY char_length(someColumn)/char_length(replace(someColumn, 'apple', ''))

+0

Bogue possible, quand someColumn contient juste 'apple'. envisager d'inverser la fraction et le tri DESC – mjv

+0

Astuce d'amélioration des performances: utilisez ... char_length (somecolumn) - char_length ('apple') plutôt que la construction replace(). En supposant que 'apple' sera trouvé quelque part dans some_column (implicite au critère de recherche appliqué dans la clause where) cela permet d'éviter tout le calcul de replace() – mjv

Questions connexes