Bonjour,
J'ai besoin de vos lumières pour me conseiller sur l'algoritme suivant que j'ai écrit.
Je développe une petite application personnelle pour indexer des samples musicaux sur mon PC. Ces samples sont indexés par des tags. Et j'aimerais pouvoir rechercher sur les tags et donner un pourcentage de correspondance. J'ai aussi installé un système de "similarité", exemple: "tuba" est similaire à "trompette" à 90%.
Le principe de base est la construction d'une hash qui représente les tags d'un sample. Cette hash est une String où je concatène les id des tags sur trois positions (voir ci-dessous). C'est pas optimal et pourra être peaufiné plus tard.
Je travaille sur deux temps:
- une partie statique: quand je modifie les tags d'un sample, je re-calcule toutes les combinaisons possibles de ces tags et en calcule les hash. Et je stocke ces hash.
- une partie dynamique:
1) quand l'utilisateur indique les tags sur lesquels il veut chercher, je re-calcule toutes les combinaisons de ces tags en y ajoutant les tags similaires et j'associe un pourcentage de correspondance par rapport aux tags demandés. Je mets tout ça dans une table temporaire.
Ex: si la recherche est sur "stéréo+trompette", "stéréo" seul correspond à 50% à la recherche,"stéréo+trompette" correspond à 100%, "stéréo+tuba" correspond à 95%.
2) je fais un query entre les hash des samples et mes hash de recherche en ne gardant pour chaque sample trouvé que le max du pourcentage.
Cet algorithme fonctionne. Je l'ai testé sur une petite db, mais je demande si à votre avis il est viable sur une plus grosse db et quelles précuations je dois prendre dans mon query, dans mes index.
Une grosse db c'est 500 samples avec une moyenne de 10 tags. La table des sampleshash avoisinerait les 500.000 entrées.
Une recherche normale c'est 3 tags, avec chacun deux similarités. Donc 9 tags. La table temporaire des searchhash avoisine les 180 entrées.
Le query est:
Là où je vois où ça peut ne pas être efficace:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select sample.id, sample.name, sample.duration, sample.path, max(searchhash.pourcentage) from sample, samplehash, searchhash where (sample.id=samplehash.sampleid) and (samplehash.hash=searchhash.hash) group by sample.id
- un join entre les samplehash et les searchhash sur les hash qui sont des varchars.
- le groupby sampleid avec un max(pourcentage)
J'utilise comme db H2.
Voilà, vous pensez quoi de tout ceci ? Quels sont les index que je dois prévoir ?
Partager