Μηχανή αναζήτησης με PHP

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Μηχανή αναζήτησης με PHP

Δημοσίευση από ThyClub » 19 Απρ 2006 20:29

Μηχανή αναζήτησης με PHP
~~~~~~~~~~~~~~~~~~


Έχουμε λοιπόν δημιουργήσει την τέλεια σελίδα. Υπάρχουν αμέτρητα άρθρα και το Google δέν προλαβαίνει να κάνει index το πλούσιο περιεχόμενο μας. Προς το παρών η σελίδα μας έχει 40 κατηγορίες με περίπου 35 άρθρα στην κάθε μια. Οι χρήστες μας πρέπει να είναι πολύ ευχαριστημένοι που μπορούν έυκολα και γρήγορα να βρούν αυτό που τους ενδιαφέρει...

ΠΧ κάποιος που θέλει να μάθει για το Smarty
Απλά πάει :

Άρθρα >> Βοηθήματα >> PHP >> Templating >> Smarty

με την σειρά και βρίσκει αυτό που θέλει...

Αν νομίζετε πως αυτός ο τρόπος είναι εύκολος τότε κάνετε λάθος...
Δεν θα ήταν καλύτερο να έχουμε μια μηχανή αναζήτησης που να εμφανίζει αυτό που θέλει ο χρήστης χωρίς πολλά πολλά; Αν ναί τότε ας ξεκινήσουμε.


Μαζεύοντας τα εργαλεία


Αυτά που θα χρειαστούμε και θα μας κάνουν την ζωή ευκολότερη είναι:

PEAR:: DB
Smarty

Η PEAR:: DB είναι ένας Database abstraction layer που αναλαμβάνει τον ρόλο να μας απαλλάξει απο μικρούς μεν ενοχλητικούς δε πονοκεφάλους όπως το να κάνουμε escape στα queries κτλ.

Για το Smarty μπορείτε να μάθετε περισσότερα εδώ


Δημιουργία της Βάσης Δεδομένων.

Θα χρειαστεί να δημιουργήσουμε 2 πίνακες. Ο ένας θα περιέχει τα άρθρα μας:

Κώδικας: Επιλογή όλων

CREATE TABLE `articles` (
  `id` int(11) NOT NULL auto_increment,
  `cid` int(11) NOT NULL default '0',
  `title` varchar(250) NOT NULL default '',
  `text` text NOT NULL,
   PRIMARY KEY  (`id`),
  FULLTEXT KEY `text` (`text`),
  FULLTEXT KEY `title` (`title`),
  FULLTEXT KEY `text_2` (`text`,`title`)
) TYPE=MyISAM DEFAULT CHARSET=greek COLLATE=greek_general_ci ;
και ο άλλος τις κατηγορίες:

Κώδικας: Επιλογή όλων

CREATE TABLE `categories` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
PRIMARY KEY ( `id` ) 
);
Θα προσέξατε ότι στον πίνακα articles ορίσαμε σαν FULLTEXT απο μία
φορά τα πεδία text,title και άλλη μια σαν ζευγάρι. Αυτό μας επιτρέπει να ψάξουμε και στον τίτλο αλλά και στο κυρίως κείμενο ενός άρθρου.

Για όσους δεν ξέρουν τι είναι το FULLTEXT θα πώ απλά οτι είναι ο μηχανισμός της MySQL που κάνει index διάφορα δεδομένα ώστε να μπορεί κάποιος να ψάχνει στην βάση με queries που θα επιστρέφουν αποτελέσματα βάση σχετικότητας. Περισσότερα εδώ


Δημιουργία της φόρμας


Δεν χρειάζεται να δημιουργήσουμε τίποτα δύσκολο. Απλά μια φόρμα:

Κώδικας: Επιλογή όλων

<form action="search.php" method="get" name="search">
<input type="text" name="q" id="q" />
<input type="submit" name="submit" value="Ψάξε" />
<input type="reset" name="reset" value="Ακυρο" />
</form>
Η φόρμα όπως μπορεί να προσέξατε έχει method="get". Αυτό θα δώσει την
δυνατότητα να μπορεί κάποιος να κάνει bookmark τα αποτελέσματα της
αναζήτησης που έχει κάνει.



Η ώρα της PHP


Θα χρειαστεί να συνδεθούμε στην βάση μας:

dbase.php

Κώδικας: Επιλογή όλων

<?php
//Require the Abstraction layer
require_once "DB.php"; 
//The database configuration file
//It connects the user to the DB

//Your SQL type
$dbaseType= 'mysql'; 
//Your bduser string
$dbUser = 'root';
//Your db pass
$dbPass = '';
//Your db host
$dbHost = 'localhost';
//Your DB name
$database = 'searchTut';

//This is the string that will be used for the connection

$dsn = "$dbaseType&#58;//$dbUser&#58;$dbPass@$dbHost/$database";
$options = array&#40;
    'debug'       => 2,
    'portability' => DB_PORTABILITY_ALL,
&#41;;
//Connect to the database
$db =& DB&#58;&#58;connect&#40;$dsn,$options&#41;;
//If there is an error warn the user
if &#40;PEAR&#58;&#58;isError&#40;$db&#41;&#41;
&#123;
    die&#40;$db->getMessage&#40;&#41;&#41;;
&#125;

?>
Το παραπάνω αρχείο θα το κάνουμε include σε όλα όσα χρειάζονται σύνδεση με

την βάση μας.


Smarty

Μια wrapper class για το smarty:
smarty_setup.php

Κώδικας: Επιλογή όλων

<?php
class Smarty_wrap extends Smarty &#123; 

   function Smarty_wrap&#40;&#41; 
   &#123; 
	
        // Class Constructor. 
        // These automatically get set with each new instance. 

        $this->Smarty&#40;&#41;;
        $this->template_dir = 'templates/'; 
        $this->compile_dir  = 'templates_c/'; 
        $this->config_dir   = 'configs/';
        $this->cache_dir    ='cache/'; 
&#125; 

$smarty=new Smarty_wrap&#40;&#41;;
?>

Search code

Τώρα το αρχείο με τον κώδικα της μηχανής:
search.php

Κώδικας: Επιλογή όλων

<?php

//Connect to the database
include "dbase.php";

//Start Smarty
include "smarty_setup.php";

//Τσεκάρουμε αν ο χρήστης έχει κάνει submit την φόρμα ή αν έρχεται απο 

κάποιο bookmark&#58;

if&#40;isset&#40;$_GET&#91;'q'&#93;&#41;&#41;&#123;
	searchThis&#40;$_GET&#91;'q'&#93;&#41;;
&#125;


//Εδώ η function που θα κάνει την αναζήτηση&#58;

function searchThis&#40;$query&#41;&#123;
	global $db,$smarty;
	$table='articles';
	$res = $db->query&#40;"SELECT * FROM $table WHERE MATCH&#40;'text,title'&#41; AGAINST&#40;'$query' IN BOOLEAN MODE&#41;&#41;;
	while&#40;$row = $res->fetchRow&#40;DB_FETCHMODE_ASSOC&#41;&#41;&#123;
		$results&#91;&#93;=$row;
	&#125;
	//και δίνουμε τα αποτελέσματα στο Smarty
	$smarty->assign&#40;'results',$results&#41;;
&#125;

//Εμφάνιση του template
$smarty->display&#40;'search.tpl'&#41;;
?>

Το μόνο που μας μένει να κάνουμε είναι να δημιουργήσουμε ενα template:

search.tpl

Κώδικας: Επιλογή όλων

<html>
<head>
<title>Search</title>
</head>
<body>
<div align="center">
<form action="search.php" method="get" name="search">
<input type="text" name="q" id="q" />
<input type="submit" name="submit" value="Ψάξε" />
<input type="reset" name="reset" value="Ακυρο" />
</form>
</div>
<hr />

<!--Εδώ ξεκινάει ο κώδικας του Smarty -->
&#123;if $results&#125;
&#123;section name=s loop=$results&#125;
	<h2>&#123;$results&#91;s&#93;.title&#125;</h2>
	<p>&#123;$results&#91;s&#93;.text|truncate&#58;180&#58;"..."&#58;true&#125;</p>
&#123;/section&#125;
&#123;else&#125;
	<h2>Sorry your search had no results</h2>
&#123;/if&#125;
</body>
</html>


Το παραπάνω template εμφανίζει την φόρμα μας και αν υπάρχουν αποτελέσματα τα εμφανίζει με τον τίτλο του κάθε άρθρου και 180 χαρακτήρες απο το κείμενο.


Σημείωση:

Για να δουλέψει το βοήθημα οι κατάλογοι πρέπει να έχουν την εξής μορφή:

Κώδικας: Επιλογή όλων

root
   |__templates
   |         |______search.tpl
   |__templates_c
   |__cache
   |__configs
   |__smarty
   |__DB
   |_________________search.php
   |_________________dbase.php
   |_________________smarty_setup.php

Άβαταρ μέλους
mpalarinas
Δημοσιεύσεις: 125
Εγγραφή: 28 Οκτ 2005 20:08
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Μηχανή αναζήτησης με PHP

Δημοσίευση από mpalarinas » 19 Απρ 2006 21:09

Πολύ καλό βοήθημα!
Εικόνα

Άβαταρ μέλους
gmitsos
Δημοσιεύσεις: 16
Εγγραφή: 22 Φεβ 2005 16:02
Τοποθεσία: Αθήνα

Μηχανή αναζήτησης με PHP

Δημοσίευση από gmitsos » 26 Απρ 2006 15:05

ThyClub έγραψε:Μηχανή αναζήτησης με PHP
~~~~~~~~~~~~~~~~~~

Θα προσέξατε ότι στον πίνακα articles ορίσαμε σαν FULLTEXT απο μία
φορά τα πεδία text,title και άλλη μια σαν ζευγάρι. Αυτό μας επιτρέπει να ψάξουμε και στον τίτλο αλλά και στο κυρίως κείμενο ενός άρθρου.

Για όσους δεν ξέρουν τι είναι το FULLTEXT θα πώ απλά οτι είναι ο μηχανισμός της MySQL που κάνει index διάφορα δεδομένα ώστε να μπορεί κάποιος να ψάχνει στην βάση με queries που θα επιστρέφουν αποτελέσματα βάση σχετικότητας.
Υπάρχει κάτι αντίστοιχο και στην Postgres? Πως θα μπορούσε να υλοποιηθεί σε αυτή την περίπτωση;

Γ.

Άβαταρ μέλους
ALKIVIADES
Honorary Member
Δημοσιεύσεις: 1322
Εγγραφή: 07 Απρ 2005 03:39

Μηχανή αναζήτησης με PHP

Δημοσίευση από ALKIVIADES » 27 Απρ 2006 01:28

Ενδιαφέρον και πολύ χρήσιμο ! Μπράβο ;)

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Μηχανή αναζήτησης με PHP

Δημοσίευση από cherouvim » 20 Νοέμ 2006 10:28

Πες μας, πως και επέλεξες το name="q";

Για να ταιριάζει με του google queries που πιθανός έχει ήδη κάνει ο χρήστης (autocomplete);

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Μηχανή αναζήτησης με PHP

Δημοσίευση από ThyClub » 20 Νοέμ 2006 22:15

Βασικά όχι... :D

Είχα έτοιμο τον κώδικα όπου με όνομα μεταβλητής "q" κάνει κάτι διαφορετικό απ'ότι με όνομα "query" και έμεινε.

Πάντως καλή φάση με το autocomplete :wink:

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες