Moteur de recherche interne pour un portail

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Moteur de recherche interne pour un portail

par Fredy07 » 27 juin 2009, 02:46

voila le code complet:
<?php
//

$word = 'php';

//echo $word.'<br>';
$query = "select * from recherche1, recherche2 where recherche1.texte1 LIKE '%$word%' OR recherche2.texte2 LIKE '%$word%'";

echo $query.'<br>';

$result = mysql_query ($query) or die (mysql_error());

$total = mysql_num_rows($result);

echo $total.'<br>';
if ($total) {
	
	while ($row = mysql_fetch_array($result)) {
		
		$texte1 = $row['texte1'];
		$texte2 = $row['texte2'];
		$url1 = $row['url1'];
		$url2 = $row['url2'];
		$titre1 = $row['titre1'];
		$titre2 = $row['titre2'];
		
		echo 'voila le texte1'.$texte1.' et voila son url: '.$url1.' et le titre '.$titre1.'<br>';
		echo 'voila le texte1'.$texte2.' et voila son url: '.$url2.' et le titre '.$titre2.'<br>';
			
			}
		
		
		//echo 'voila url' .$url.'<br>';
		//echo 'voila le texte'.$text.'<br>';
		}
		

else
{
	echo 'aucun resultat';
}

//
?>
et le code des 2 tables recherche1 et recherche2:


--
-- Table structure for table `recherche1`
--

CREATE TABLE IF NOT EXISTS `recherche1` (
  `id1` int(2) NOT NULL auto_increment,
  `titre1` varchar(20) collate latin1_general_ci NOT NULL,
  `texte1` longtext collate latin1_general_ci NOT NULL,
  `url1` varchar(30) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id1`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;

--
-- Dumping data for table `recherche1`
--

INSERT INTO `recherche1` (`id1`, `titre1`, `texte1`, `url1`) VALUES
(1, 'titre 1 de recherche', 'c''est la premiere fois que je code du php', 'code.php'),
(2, 'titre 2 recherche 1', 'j''adore coder du php', 'code1.php');

-- --------------------------------------------------------

--
-- Table structure for table `recherche2`
--

CREATE TABLE IF NOT EXISTS `recherche2` (
  `id2` int(2) NOT NULL auto_increment,
  `titre2` varchar(20) collate latin1_general_ci NOT NULL,
  `texte2` longtext collate latin1_general_ci NOT NULL,
  `url2` varchar(30) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id2`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=3 ;

--
-- Dumping data for table `recherche2`
--

INSERT INTO `recherche2` (`id2`, `titre2`, `texte2`, `url2`) VALUES
(1, 'titre 1 de recherche', 'c''est la premiere fois que je code du php2', 'code2.php'),
(2, 'titre 2 recherche2', 'j''adore coder du php2', 'code3.php');
et les resultats sont comme suite:
select * from recherche1, recherche2 where recherche1.texte1 LIKE '%php%' OR recherche2.texte2 LIKE '%php%'
4
voila le texte1c'est la premiere fois que je code du php et voila son url: code.php et le titre titre 1 de recherche
voila le texte1c'est la premiere fois que je code du php2 et voila son url: code2.php et le titre titre 1 de recherche
voila le texte1j'adore coder du php et voila son url: code1.php et le titre titre 2 recherche 1
voila le texte1c'est la premiere fois que je code du php2 et voila son url: code2.php et le titre titre 1 de recherche
voila le texte1c'est la premiere fois que je code du php et voila son url: code.php et le titre titre 1 de recherche
voila le texte1j'adore coder du php2 et voila son url: code3.php et le titre titre 2 recherche2
voila le texte1j'adore coder du php et voila son url: code1.php et le titre titre 2 recherche 1
voila le texte1j'adore coder du php2 et voila son url: code3.php et le titre titre 2 recherche2

par Berzemus » 26 juin 2009, 09:46

Ca dépend de ce qu'il y à dans les tables. Toutes tes tables contiennent du texte ? C'est quand même bizarre ça, et ça traduirait presque un défaut de conception.

Tu sais donner un aperçu plus détaillé de ta structure, et peut-être expliquer à quoi servent les tables ?

par Fredy07 » 26 juin 2009, 02:29

Merci Berzemus pour la reponse, je te donne une idee sur le portail:

1- Je le programme a la main,
2- Il contient des dizaines de tables, les tables sont comme suite:

table1
id
text
url

table2
id
id_table1
text
url


Quand je fais la recherche sur les 2 tables par exemple, je trouve que le nombre de resultats est double, c'est pour cela que je pose ma question

par Berzemus » 25 juin 2009, 18:39

Tout dépends. Le forum de phpfrance utilise PhpBB et tout ce qu'il propose. Mais qu'en est t'il de ton portail ? Est-ce un ensemble complet que tu as installé, ou est-ce que tu as tout programmé à la main ?

Dans le premier cas, peut-être qu'un moteur de recherche est déjà installé. S'il ne l'est pas, ça peut être assez contraignant que de lui greffer un.

Dans le second cas, il suffit de prévoir les éléments nécessaires au fonctionnement de ton interface de recherche.

Par exemple, en dehors de tout ce que tu as déjà comme contenu (je prends ici l'exemple d'articles, mais je ne sais pas quel type de contenu tu proposes), tu pourrais rajouter une table telle que celle-ci:

Code : Tout sélectionner

table_recherche ************************ * id (int) * txt (text)* ************************
Dans laquelle l'identifiant correspondra à un contenu dans ta base de données, et le texte à une version "standardisée" du contenu en question, sur laquelle tu effectueras ensuite tes recherches. Ces recherches donneront une liste d'identifiant (avec éventuellement leurs scores), avec lesquels tu pourras rechercher les articles en question et proposer les liens vers ses articles dans ta page de résultat.

par Fredy07 » 25 juin 2009, 12:17

Donc la meilleur solution c'est de le faire manuellement, inserer les donnees dans une table X et effectuer la recherche dans cette table.

:?: :?:

par Fredy07 » 24 juin 2009, 10:38

Alors est ce que la meme methode utilisee sur phpfrance?

par Berzemus » 24 juin 2009, 10:03

Vouloir rechercher dans plusieurs tables serait, comme le disait nagol, dû à une mauvaise conception de la BD. Dans l'idéal, le contenu textuel est dans une seule table.

Le mieux est de faire une table spéciale dans lequel on insère le contenu sous une forme "préparée/normalisée" (sans mots trop communs, trop courts, sans accents et sans majuscules), sur laquelle on va exécuter la requête de recherche, ce qui livrera un identifiant qui correspondra à un contenu bien réel et affichable dans la DB.

par Fredy07 » 24 juin 2009, 02:30

Alors on revient toujours au debut, c'est quoi la meilleur solution d'introduire un moteur de recherche dans un portail.

par Nagol » 23 juin 2009, 09:53

c'est un cas d'utilisation improbable d'une base de donnée, j'aurais tendance à penser que c'est un besoin du à une mauvaise conception de la base...

par Fredy07 » 23 juin 2009, 08:20

C'est la raison sur laquelle je veux avoir un bon moteur de recherche, tout en terminant le site, avec des tables bien sur, je code mon moteur ou je vais mettre aller chercher le mot x sur les tables qui existent dans la BD y.

par Nagol » 23 juin 2009, 07:20

alors je suis pas le plus utilisateur de base de donnée du monde mias à mon avis (et j'espere qu'on me corigera si c'est pas le cas)

je pense que la requete irait (fortement au conditionel) plutot comme ça:

Code : Tout sélectionner

SELECT * FROM table1, table2 WHERE MATCH (table1.title1,table1.body1,table2.title2,table2.body2) AGAINST ('database');
en supposant qu'on puisse créer un index fulltext sur plusieurs tables, ce qui me semble improbable

par Fredy07 » 23 juin 2009, 04:05

Oui je vois, merci Nagol

Alors suppons que j'ai 2 ou plusieurs tables, la requete serait:
SELECT * FROM table1, table2 WHERE MATCH (title1,body1), (title2,body2) AGAINST ('database');
Je ne sais pas si c'est correct :!:

par Nagol » 23 juin 2009, 03:55

les champs.

le truc qui te trouble je pense c'est que dans cet exemple il y'a deux champ indexés, title et body, imagines un mail tu veux pouvoir rechercher un expression (database) dans le titre ET le corps du mail :) c'est pour ça, mais le cas peut etre plus simple, tu peux créer un index fulltext sur une colonne unique, et faire des recherches du genre

Code : Tout sélectionner

SELECT * FROM articles WHERE MATCH (title) AGAINST ('database');
ce qui te retournerais tous les enregistrements dont le titre contient 'database'

tu vois?

par Fredy07 » 23 juin 2009, 01:12

Ce que j'ai compris 'database' est le mot a rechercher, alors (title,body) c'est quoi??

par Nagol » 22 juin 2009, 21:51

c'est ca la recherche fulltext, en gros mysql te crée un index sur les colonnes, et tu peux matcher une recherche à l'intérieur. spadur si? :)