Moteur de recherche interne

WRInaute accro
Bonjour,
je monte un site qui est destiné a recevoir une grosse quantité d"informations piochées dans une base de donnée, pensez vous qu'il est plus intelligent de coder moi même un moteur de recherche en PHP ou alors d'en prendre un tout fait ?
Dans ce cas que me conseillez vous ?

Ce qui est très important c'est qu'il FAUT qu'il soit :
- rapide
- léger, très léger
- efficace (...)
Merci !
 
WRInaute impliqué
Si c'est sur UNE base de données qui t'appartient, je te conseille de le coder toi même.
Après ça dépend du type de résultats que tu veux sortir.
 
WRInaute impliqué
Pour ma part j'utilise cinq requêtes SQL pour une recherche, par ordre de pertinence(recherche d'infos sur un site) :
  • Nom exact
  • Nom + description + contenu approchant
  • Nom + descrîption approchant
  • Nom approchant
  • Quasiment aléatoire
Si ça t'intéresse milkiway, je te mettrais ça de retour chez moi :)
 
WRInaute impliqué
Certains SGBD ( PostgreSQL, MySQL, Oracle ... ) ont une fonction de recherche Full Text et trie automatiquement selon la pertinence.
 
WRInaute accro
Merci pour les réponses !

Dr DLP a dit:
Pour ma part j'utilise cinq requêtes SQL pour une recherche, par ordre de pertinence(recherche d'infos sur un site) :
  • Nom exact
  • Nom + description + contenu approchant
  • Nom + descrîption approchant
  • Nom approchant
  • Quasiment aléatoire
Si ça t'intéresse milkiway, je te mettrais ça de retour chez moi :)
Ca m'intéresse beaucoup :D
C'est vraiment sympa de ta part.
J'attend ça ! Merci
 
WRInaute impliqué
Je te livre le php tel quel :
Code:
<?php

require('common.php');
require('configs/functions_common.php');

function already_displayed ( $seeked_site_id, $seeked_array )
{
	for ( $h = 0 ; $h < count($seeked_array); $h ++)
	{
		if ( $seeked_site_id  == $seeked_array[$h][0] )
		{
			return true;
		}
	}
	return false;
}

$search_query = strtolower(trim(htmlspecialchars($_GET['search_query'])));
$where = (isset($_GET['sub_cat_id'])) ? 'AND site_cat='.intval($_GET['sub_cat_id']) : '';

// Etape absolue, recherche d'un titre de site correspondant à la requête
$sql = mysql_query("SELECT site_id, site_link, site_cat, site_name, site_desc FROM easy_links_sites WHERE LOCATE('$search_query',site_name) > 0 $where") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);
while( $sites = mysql_fetch_row($sql) )
{
	$sites_to_show[] = $sites;
}

// Deuxième étape absolue, la recherche croisée titre/description/contenu
// Cette recherche est la plus puissante puiqu'elle assure une très importante pertinence de la requête
$sql = mysql_query("SELECT site_id, site_link, site_cat, site_name, site_desc, site_contents, MATCH (site_name,site_desc,site_contents) AGAINST ('$search_query') AS score FROM easy_links_sites WHERE MATCH (site_name,site_desc,site_contents) AGAINST ('$search_query') $where ORDER BY score DESC") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);
while( $sites = mysql_fetch_row($sql) )
{
	if ( !already_displayed($sites[0], $sites_to_show) )
	{
		$sites_to_show[] = $sites;
	}
}

// Première étape relative, la recherche croisée titre/description
$sql = mysql_query("SELECT site_id, site_link, site_cat, site_name, site_desc, site_contents, MATCH (site_name,site_desc) AGAINST ('$search_query') AS score FROM easy_links_sites WHERE MATCH (site_name,site_desc) AGAINST ('$search_query') $where ORDER BY score DESC") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);
while( $sites = mysql_fetch_row($sql) )
{
	if ( !already_displayed($sites[0], $sites_to_show) )
	{
		$sites_to_show[] = $sites;
	}
}

// Deuxième étape relative, la recherche croisée description/contenu
$sql = mysql_query("SELECT site_id, site_link, site_cat, site_name, site_desc, site_contents, MATCH (site_desc,site_contents) AGAINST ('$search_query') AS score FROM easy_links_sites WHERE MATCH (site_desc,site_contents) AGAINST ('$search_query') $where ORDER BY score DESC") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);
while( $sites = mysql_fetch_row($sql) )
{
	if ( !already_displayed($sites[0], $sites_to_show) )
	{
		$sites_to_show[] = $sites;
	}
}

// Troisième étape relative, la requête "ressemble" au titre d'un site
$sql = mysql_query("SELECT site_id, site_link, site_cat, site_name, site_desc, site_contents, SUBSTRING(SOUNDEX(site_name),1,2) AS cosmos , SUBSTRING(SOUNDEX('$search_query'),1,2) AS spatio FROM easy_links_sites WHERE SUBSTRING(SOUNDEX(site_name),1,2) = SUBSTRING(SOUNDEX('$search_query'),1,2) $where") or die ("Fhtagn : " . mysql_errno()." : ".mysql_error()."<br />".$sql);
while( $sites = mysql_fetch_row($sql) )
{
	if ( !already_displayed($sites[0], $sites_to_show) )
	{
		$sites_to_show[] = $sites;
	}
}

$template->assign("sites",$sites_to_show);

template_display('search.tpl');

?>
La requête de création de la table ( le seul truc important ce sont les index )
CREATE TABLE easy_links_sites (
site_id int(8) NOT NULL auto_increment,
site_name varchar(255) NOT NULL default '',
site_desc varchar(255) NOT NULL default '',
site_link varchar(255) NOT NULL default '',
site_cat int(8) NOT NULL default '1',
site_registered int(11) NOT NULL default '0',
site_note decimal(4,2) NOT NULL default '10.00',
site_hits int(8) NOT NULL default '0',
site_cool tinyint(1) NOT NULL default '0',
site_approved tinyint(1) NOT NULL default '0',
site_voters int(8) NOT NULL default '0',
site_owner_name varchar(255) NOT NULL default '',
site_owner_mail varchar(255) NOT NULL default '',
site_contents text NOT NULL,
site_last_update int(11) NOT NULL default '0',
site_thumb varchar(255) NOT NULL default '',
site_abstract varchar(255) NOT NULL default '',
site_images_last_update int(11) NOT NULL default '0',
PRIMARY KEY (site_id),
FULLTEXT KEY site_desc (site_desc,site_contents),
FULLTEXT KEY site_name (site_name,site_desc),
FULLTEXT KEY site_contents (site_name,site_desc,site_contents)

) TYPE=MyISAM;

L'affichage des résultats se fait via Smarty.
Si tu veux voir ce que ça donne en action : -http://jeux-gratuits-en-ligne.com/annuaire-jeux/ .
Si un résultat ne te semble pas pertinent, jette un oeil à l'url donnée, le contenu de la page est non affiché mais pris en compte.
 
WRInaute impliqué
^^ pour faciliter la recherche sur tout mon site j'ai préféré utiliser Google. Ca a l'avantage de mettre l'utilisateur dans un bain qu'il connait déjà. Certes c'est moins personnalisé mais dans la mesure où c'est une recherche globale au site, c'est pas gênant.
 
WRInaute accro
Merci bcp DLP mais je suis novice en SQL alors je crois que je vais regarder la doc en profondeur pour comprendre ton code !

The jEDI : oui mais ça nécessite une indexation par GG
 
WRInaute discret
En principe un moteur ça se joue sur un BDD (couramment MySQL), donc avec des requêtes SQL (appellées par des fonctions PHP d'ailleurs :d).
Aprés, pour ceux qui préfére utiliser SQL le moins possible, c possible sans... Avec une gestion par tableaux PHP, des sortes de fausses BDD.
 
WRInaute discret
Bah je comprend pas exactement...

De toutes manières, même pour rechercher sur un BDD SQL tu utiliseras PHP pour exécuter les requêtes SQL ... et à l'inverse tu ne pourras pas rechercher sur une BDD SQL sans utiliser les requêtes SQL.
 
Nouveau WRInaute
Moteur de recherche dédie pour site web

Bonjour,

Plutot que de réinventer la roue, il est parfois interessant de déléguer le developpement de moteur de recherche a des spécialistes.

Les problemes que vous vous posez (et ceux que vous allez découvrir ;-) sont impressionnants, exemple a l'appui.

Coté BDD :
- optimisation des recherches sur plein-texte et booleen..
- volume de donne quand gros systeme de recherche et gros trafic utilisateur

Coté pertinence :
- algo de ranking...Si vous ne connaissez pas "l'inf. Baysienne" bonne chance !
- stopword, suggestion orthographique, suggestion synonymique, taxinomie (classement des documents)

Coté documents indexable :
tant que vous rester sur le contenu de votre BDD..RAS
Mais des que votre client vous parle d'indexer des pdf, des images, des rasters, des sons, des videos...vous allez lui dire "heu bas je vais voir ;) )
Coté evolutivité :
- les mains dans la graisse presque tout le temps.

Je vous suggere donc de regarder du coté de http://www.verticrawl.com/ car nous avons developpé une solution online d'indexation plein-texte et taxinomique qui merite d'etre presentée. Son développement a mis 5 ans et elle devrait s'affirmer comme une alternative tres interessante.

Son prix : A partir de 10 euros par mois...et vous gardez la maitrise complete de votre site sans connexion a votre bdd..

Elle est deja utilisée par des moteurs comme http://www.fraggo.com et comme http://www.123emploi.com/

Pourquoi réinventer la roue ?

vos remarques sur mon mail.

JFL
 
Nouveau WRInaute
Bonjour,

Plutot que de réinventer la roue, il est parfois interessant de déléguer le developpement de moteur de recherche a des spécialistes.

Les problemes que vous vous posez (et ceux que vous allez découvrir ;-) sont impressionnants, exemple a l'appui.

Coté BDD :
- optimisation des recherches sur plein-texte et booleen..
- volume de donne quand gros systeme de recherche et gros trafic utilisateur

Coté pertinence :
- algo de ranking...Si vous ne connaissez pas "l'inf. Baysienne" bonne chance !
- stopword, suggestion orthographique, suggestion synonymique, taxinomie (classement des documents)

Coté documents indexable :
tant que vous rester sur le contenu de votre BDD..RAS
Mais des que votre client vous parle d'indexer des pdf, des images, des rasters, des sons, des videos...vous allez lui dire "heu bas je vais voir ;) )
Coté evolutivité :
- les mains dans la graisse presque tout le temps.

Je vous suggere donc de regarder du coté de http://www.verticrawl.com/ car nous avons developpé une solution online d'indexation plein-texte et taxinomique qui merite d'etre presentée.

Son prix : A partir de 10 euros par mois...et vous gardez la maitrise complete de votre site sans connexion a votre bdd..

Elle est deja utilisée par des moteurs comme http://www.fraggo.com et comme http://www.123emploi.com/

Pourquoi réinventer la roue ?

j'attend vos remarques sur mon mail

JFL
 
WRInaute occasionnel
Oups attention le double post.

Juste une petite précision sur le "pourquoi réinventer la roue", tout message publicitaire mis à part.
Je sais que beaucoup utilisent cette expression à tort ou à raison, mais il faut savoir que si on ne ré-invente pas la roue, on ne fait jamais rien, et on ne saura jamais rien.
Re-utiliser les programmes des autres, oui, car indéniablement une vie est trop courte pour tout apprendre et, des fois, il faut se servir de ce qu'on a autour de soi.
Mais par moment, à mon avis, il est aussi bon d'essayer de faire tout seul, avec ses petites mimines.
Se confronter à des problèmes réels, ne pas y arriver, bloquer, insulter la machine, et au bout de la dixième heure devant son éditeur de texte favori avec pour seul compagnon un moteur de recherche, trouver la solution.
C'est à ce moment là qu'on cerne la réelle valeur des choses, qu'on comprend comment ça marche, et qu'on peut améliorer le reste en conséquence.

Enfin bon, vous m'excuserez la parenthèse, petit coup de gueule pas méchant pour dire :
Laissez nous ré-inventer la roue quand on en a envie, ça ne peut qu'être enrichissant ! ;)
 
Nouveau WRInaute
Bonjour à tous,

le site sur lequel je bosse est entièrement en html, vous connaissez une solution valable ?

J'ai testé google mais il met des liens vers mes concurents dans les résultats :eek:(
 
WRInaute occasionnel
milkiway a dit:
Je me suis mal exprimé,
mieux vaut utiliser les fonctions de recherche de MySQL ou celles de PHP ?
plus tu peux fair sur mySql plus c'est performant. tu passe à PHP qand tu ne peux plus.
astuce:
ajouter dans votre table un champ qui concatène tous les champs text sujet de recherche par mot clef après utiliser les expressions régulière mysSql ou like ça dépend...
pour plus de pertinences il faut une indexation, là ça va devenir complexe :wink:
 
WRInaute occasionnel
l.koucem@utram.com a dit:
J'ai testé google mais il met des liens vers mes concurents dans les résultats :eek:(
Tu as testé avec Adsense pour les recherches ?
Car plus simplement, tu peux tester avec la commande site:example.com sur Google, peut être cela sera plus discret.
 
Nouveau WRInaute
Oups !

l.koucem@utram.com a dit:
Bonjour à tous,

le site sur lequel je bosse est entièrement en html, vous connaissez une solution valable ?

J'ai testé google mais il met des liens vers mes concurents dans les résultats :eek:(

Lisez les 2 messages au dessus du votre ;-)
 
Nouveau WRInaute
milkiway a dit:
Je me suis mal exprimé,
mieux vaut utiliser les fonctions de recherche de MySQL ou celles de PHP ?

RE :

Vous avez oublie que les donnees sont codes dans une charset specifique (iso-8859-15) par exemple.

On, le texte de recherche (et le fulltext de mysql) ne prennent en compte les accents que si l'ensemble des donnees sont codes de la meme facon. En clair, si vous avez de l'UTF-8 et de l'ISO-88 ...et que vous recherchez un caractere accentué...vous n'aurez pas tous les resultats hihihihi...

Votre contenu doit donc être homogene...et je ne parle par du copier-coller depuis word (charset 1251 je crois) !!!

Bonne chance !
 
WRInaute discret
Salut a tous!!

J'ai vu le code proposé dans ce post et me demande ce que veut dire cette ligne :

$where = (isset($_GET['sub_cat_id'])) ? 'AND site_cat='.intval($_GET['sub_cat_id']) : '';

c'est quoi 'sub_cat_id' ??

Je voudrais tester cette requete.

Merci !!! :wink:
 
Discussions similaires
Haut