Algorithme de recherche dans une base de données

Algorithme de recherche dans une base de données - Java - Programmation

Marsh Posté le 09-04-2004 à 16:48:53    

bonjour,
 
je dois faire dans mon projet un moteur de recherche.
cette recherche doit s'effectuer sur plusieurs tables et sur plusieurs champs donc .. bref sur toute la base quasiement, en fonction d'un mot, une phrase etc ... (genre google).
ma base sera mysql et le langage java/jsp.
Je cherche des algorithmes mais j'ai pas encore trouvé mon bonheur malheureusement :s
 
en reflechissant.. à la limite, la recherche pourra se faire uniquement sur un select mais avec un grand nombre de champs.
 
où puis je trouver un algorithme assez performant là dessus??
 
merci d'avance :)

Message cité 1 fois
Message édité par la viper le 09-04-2004 à 16:49:45
Reply

Marsh Posté le 09-04-2004 à 16:48:53   

Reply

Marsh Posté le 09-04-2004 à 16:51:05    

SQL, tu connais ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 09-04-2004 à 16:57:02    

ouhaip ... mais je doute que ca puisse faire tout le travail .. je me trompe p'etre.
si le mot est mal ortographié par exemple ?

Reply

Marsh Posté le 09-04-2004 à 17:05:49    

mysql: voir les index full text machin
sinon: http://jakarta.apache.org/lucene/ ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 09-04-2004 à 19:05:11    

ouhai j'ai deja jeté un oeil sur lucene mais les données seraient pas sur une page ou un fichier plat mais plutot dans une base.
 
vais faire une recherche sur le "index full text machin" ;)  
 
merci

Reply

Marsh Posté le 10-04-2004 à 08:19:27    

effectivement j'ai trouvé mon bonheur dans MySQL!! merci bcp :)

Reply

Marsh Posté le 31-01-2011 à 16:14:51    

la viper a écrit :

effectivement j'ai trouvé mon bonheur dans MySQL!! merci bcp :)


je cherche  un algorithme pour faire un moteur de recherche qui doit s'effectuer sur plusieurs tables et sur plusieurs champs donc .. bref sur toute la base quasiement, en fonction d'un mot, une phrase etc ... (genre google).  
ma base sera ORACLE et le langage j2EE.  
où puis je trouver un algorithme assez performant là dessus??
Merciii

Reply

Marsh Posté le 01-02-2011 à 10:43:11    

Sans en savoir plus sur ta structure, difficile à dire.
Par contre j'ai du mal à voir l'utilité de faire une recherche sur toute une base ... Du moins si la base est construite intelligemment


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 02-02-2011 à 15:28:57    

la viper a écrit :

bonjour,
je dois faire dans mon projet un moteur de recherche.
où puis je trouver un algorithme assez performant là dessus??


 
la requete sera du type
select table1.ID from table1 where table1.champ10 = '<mot-clé>' OR table1.champ11 = '<mot-clé>'
UNION
select table2.ID from table2 where table2.champ20 = '<mot-clé>' OR table2.champ21 = '<mot-clé>' OR table2.champ22 = '<mot-clé>'
UNION ...

tu transformeras peut être les =<mot-clé> en like '%<mot-clé>%'
 
La requête à rallonge + recherche full texte (cas des like) font que c'est extrêmement long.
Il n'y a pas d'algo d'optimisation en sql, sauf solution propriétaire comme par exemple dans mysql.
 
La solution c'est Lucene (ou concurrent) qui créée un index mot clé des pages contenant tel mot clé,  
avec des avantages comme la gestion de l'occurence (les pages contenant le plus le mot clé)  
et le steaming (si tu recherche avec 'arbres' il prend aussi 'arbre' en compte).
 
Lucene navigue dans les pages et créée des index textes (format Lucene) : un mot clé <-> une page html
Tu vas devoir développer une surcouche à Lucene pour lui faire croire qu'il lit des pages html (en fait des champs de table de la BDD)
et qu'il mette dans ses index, non pas une page html, mais le nom de la table + le nom du champ (concaténé abvec séparateur...).
Quand tu feras une recherche, Lucene te sortira le contenu table+champ.
 
 
NB :

  • Lucene est hyper rapide, vraiment. J'ai déjà développé un bousin tel que expliqué ci dessus.
  • Aucun moteur pro n'utilise le sql
  • Mais le sql pourra être suffisant (en temps de réponse) ... disons jusqu'à 5 ou 6 tables de 5 ou 6 champs 'normaux' (50 carac ?), plus un d'environ 256 caractères. Et pas plus de 50 tuples dans chaque table.


 
Bonne chance ... l'optimisation des temps de recherche est vraiment intéressante.  
 
 
 
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 02-02-2011 à 15:33:58    

willy le kid a écrit :


la requete sera du type
select table1.ID from table1 where table1.champ10 = '<mot-clé>' OR table1.champ11 = '<mot-clé>'
UNION
select table2.ID from table2 where table2.champ20 = '<mot-clé>' OR table2.champ21 = '<mot-clé>' OR table2.champ22 = '<mot-clé>'
UNION ...

tu transformeras peut être les =<mot-clé> en like '%<mot-clé>%'
La requête à rallonge + recherche full texte (cas des like) font que c'est extrêmement long.
Il n'y a pas d'algo d'optimisation en sql, sauf solution propriétaire comme par exemple dans mysql.


 
Il y a une autre solution : tu ajoutes un champ (une colonne) champs_de_recherche dans chaque table,
que tu devras renseigner à la main bien sûr.
Tu fais ensuite la recherche uniquement sur cette colonne.
Ca augmente vraiment le temps de réponse (mais pas suffisant pour les gros sgbd).
 
select table1.ID from table1 where table1.champ_de_recherche like '%<mot-clé>%'  
UNION
select table2.ID from table2 where table2.champ_de_recherche like '%<mot-clé>%'
UNION ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed