ben justement comme tu veux faire une recherche apporchée, et en plus dans plusieurs dimensions, c'est galere...
tu pourrais faire un truc de ce genre:
tu maintient une liste triée pour chaqune des dimensions (donc faut retrier à chaque nouveau morceau inseré dans ta base), avec à chaque ligne (on va dire que ta liste est un fichier) la valeur et un ID du morceau dans la base
Par exemple ca donnerais ca pour la dimension "BPM":
90 0001
140 0042
150 0012
...
ensuite tu fait une recherche par dichotomie dans chaque dimension, en prenant les n id de morceaux les plus proches, tu recoupe le tout entre tes differentes dimensions, et si tout va bien le morceau sera pile à l'intersection de toutes les dimensions (enfin ca va rarement bien....)
le truc qui serait chiant c'est retrier tes liste à chaque nouveau morceau, mais tu peu par exemple mettre tout ca à jour uniquement apres que 10 morceau ai été inserés par exemple. Et puis de toutes facon tu peu faire ca en batch la nuit ou autre, c'est pas vraiment trop chiant. Le tout c'est que le systeme repone rapidement au requetes (et qq dichotomies ca va vite)
apres il te faut les algos qui te permettent de remplir ces dimensions (et bien choisir ces dimensions et calibrer tes algos)
a mon avis un bon choix de dimensions ca serait:
-BPM
- energie dans les extremes basses (par exemple en dessous de 120hz)
- energie dans les basses (120-400 par exemple)
- energie dans les medium (on va dire 400-2000)
- energie dans les aigues (enfin ce qui en reste dans le telephone, donc jusque 4 ou 5khz)
- ecarts dynamiques (un genre d'ecart type sur la dynamqiue)
mais il doit y en avoir beaucoup d'autres!