A felhasználóktól tanulni tudó kereső

A felhasználóktól tanulni tudó kereső

A felhasználóktól tanulni tudó kereső

A három részes sorozat befejező epizódjához érkeztünk. Ebben a bejegyzésemben megmutatom, hogyan készítsünk a felhasználóktól tanulni tudó keresőt. Ha esetleg még nem olvastad a Segítőkész kereső, illetve Súlyozott kereső című írásaimat, akkor mindenképp pótold, mert amit most fogsz olvasni az azokban leírtakra és letölthető forráskódokra fog épülni.

Tehát eljutottunk odáig, hogy van egy keresőnk, ami ajax hívással kommunikál az adatbázisunkkal és képes szűrni a keresési kifejezések között a relevanciát. Ami még hiányzik, hogy mit tegyen akkor, ha a felhasználók elgépelik a kifejezést, vagy egyszerűen sűrűn előforduló hibát vétenek. Például keresnek egy OKJ szakmát, amiről nem biztosak, hogy létezik. Weblapfejlesztési témakörben elég karcsú a hazai OKJ kínálat, így nem csoda, ha sokan eredménytelenül keresnek a webdesigner kifejezésre. Ezzel az elnevezéssel csak akkreditált tanfolyam létezik jelenleg, helyette pedig van webmester, vagy web-programozó OKJ tanfolyam.

Mit lehet tenni?

Az én javaslatom az, hogy rögzítsünk minden eredménytelen keresést és figyeljük meg, hogy ez után mire keresnek még a felhasználók. Mi az a találat, amit már kielégítőnek találnak?

Először is hozzunk létre egy új adattáblát, amiben a sikertelen kereséseket tudjuk lementeni, illetve egy másik táblát, amiben az ezt követő sikeres találatot menthetjük el.

SQL


CREATE TABLE IF NOT EXISTS search_wrong_expression (
	we_id int(6) NOT NULL AUTO_INCREMENT,
	expression varchar(250) COLLATE utf8_hungarian_ci NOT NULL,
	counter int(5) NOT NULL DEFAULT 1,
	PRIMARY KEY (we_id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS search_log (
	l_id int(7) NOT NULL AUTO_INCREMENT,
	expression_id int(6) NOT NULL,
	result varchar(250) COLLATE utf8_hungarian_ci NOT NULL,
	counter int(5) NOT NULL DEFAULT 1,
	PRIMARY KEY (l_id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci AUTO_INCREMENT=1 ;

Ezt követően pedig kiegészítjük az "ajax_search.php" SQL lekérdezésének üres találati ágát.

PHP


$select_expression = mysqli_query($GLOBALS['connect'], "SELECT we_id FROM search_wrong_expression WHERE expression = '".$_SESSION['search_text']."' LIMIT 1");
if (mysqli_num_rows($select_expression) == 0)
	{
	$insert = mysqli_query($GLOBALS['connect'], "INSERT INTO search_wrong_expression (expression, counter) VALUES ('".$_SESSION['search_text']."', 1)");
	if ($insert)
		{
		$_SESSION['last_wrong_expression'] = mysql_insert_id();
		}

	echo '<p>Nincs találat...</p>';
	}
else
	{
	$data_expression = mysqli_fetch_assoc($select_expression);
	$update = mysqli_query($GLOBALS['connect'], "UPDATE search_wrong_expression SET counter = (counter + 1) WHERE we_id = ".$data_expression['we_id']." LIMIT 1");
	if ($update)
		{
		$_SESSION['last_wrong_expression'] = $data_expression['we_id'];
		}
	}

Továbbá módosítsuk a "detail.php" kódját is, az alábbi módon. Itt elmentjük találat esetén a megfelelő kereső kifejezést, majd töröljük a loghoz szükséges munkamenetet.

PHP


$select_user = mysqli_query($GLOBALS['connect'], "SELECT * FROM users WHERE u_id = ".(int)$_GET['user']." LIMIT 1");
if (mysqli_num_rows($select_user) == 1)
	{
	$data_user = mysqli_fetch_assoc($select_user);

	if (filter_var($_SESSION['last_wrong_expression']))
		{
		$_SESSION['search_text'] = clear_tags($_SESSION['search_text']);
		$_SESSION['search_text'] = clear_sql_injection($_SESSION['search_text']);
		$_SESSION['last_wrong_expression'] = (int)$_SESSION['last_wrong_expression'];

		$select_log = mysqli_query($GLOBALS['connect'], "SELECT l_id FROM search_log WHERE expression_id = ".$_SESSION['last_wrong_expression']." AND result = '".$_SESSION['search_text']."' LIMIT 1");
		if (mysqli_num_rows($select_log) == 0)
			{
			mysqli_query($GLOBALS['connect'], "INSERT INTO search_log (expression_id, result, counter) VALUES (".$_SESSION['last_wrong_expression'].", '".$_SESSION['search_text']."', 1)");
			}
		else
			{
			$data_log = mysqli_fetch_assoc($select_log);
			mysqli_query($GLOBALS['connect'], "UPDATE search_log SET counter = (counter + 1) WHERE l_id = ".$data_log['l_id']." LIMIT 1");
			}
		unset($_SESSION['last_wrong_expression']);
		}
	}

Most már csak egy lépés van hátra, mégpedig a keresési ajánlások felkínálása.

PHP


$select_expression = mysqli_query($GLOBALS['connect'], "SELECT we_id FROM search_wrong_expression WHERE expression = '".$_SESSION['search_text']."' LIMIT 1");
if (mysqli_num_rows($select_expression) == 0)
	{
	$insert = mysqli_query($GLOBALS['connect'], "INSERT INTO search_wrong_expression (expression, counter) VALUES ('".$_SESSION['search_text']."', 1)");
	if ($insert)
		{
		$_SESSION['last_wrong_expression'] = mysql_insert_id();
		}

	echo '<p>Nincs találat...</p>';
	}
else
	{
	$data_expression = mysqli_fetch_assoc($select_expression);
	$update = mysqli_query($GLOBALS['connect'], "UPDATE search_wrong_expression SET counter = (counter + 1) WHERE we_id = ".$data_expression['we_id']." LIMIT 1");
	if ($update)
		{
		$_SESSION['last_wrong_expression'] = $data_expression['we_id'];
		}

	$select_result = mysqli_query($GLOBALS['connect'], "SELECT result FROM search_log WHERE expression_id = ".$_SESSION['last_wrong_expression']." AND counter >= 10 ORDER BY counter DESC LIMIT 1");
	if (mysqli_num_rows($select_result) == 1)
		{
		$data_result = mysqli_fetch_assoc($select_result);
		$result_array = get_search_query($data_result['result']);
		$search_weight = $result_array['search_weight'];
		$search_where = $result_array['search_where'];

		$select = mysqli_query($GLOBALS['connect'], "SELECT u_id, username, email, ".$search_weight." FROM users WHERE ".$search_where." ORDER BY search_weight DESC, username ASC");
		if (mysqli_num_rows($select) > 0)
			{
			while ($data = mysqli_fetch_assoc($select))
				{
				echo '<a href="'.get_url_root().'/detail.php?user='.$data['u_id'].'" title="'.$data['username'].'">'.$data['username'].'</a>';
				}
			}
		}
	else
		{
		echo '<p>Nincs találat...</p>';
		}
	}
}

Ebben a kódrészletben azt állítottuk be, hogy ha egy hibás keresés után legalább 10 alkalommal találtak megfelelő találatot más keresési kifejezésre a látogatók, akkor az ezek közül legnépszerűbb találati listát felajánlja. Ennek az összetétele pedig egyre jobban idomulni fog minél többen keresnek a weboldalon.

De én akaratosabb vagyok!

Amennyiben nem tetszik nekünk a mesterséges találati lista összetétele, az adatbázisban magunk is módosíthatjuk a megfelelő keresési kifejezésre az ajánlást. Ehhez annyit kell tennünk, hogy hozzáadjuk a szerintünk megfelelőbb kifejezést és a "counter" mezőnek egy nagyon magas számot adunk meg.

Demo letöltése

Leírásaink azon kezdő és haladó programozóknak nyújtanak segítséget, akik már minimális szinten foglalkoztak weboldalkészítéssel. Ha szeretnél jobban elmélyülni a témában, vagy elsajátítani alapokat, még tovább fejlődni, akkor nézz körbe tanfolyam kínálatunkban, ahol a kezdőtől a profi szintig nyújtunk képzéseket a számodra.

Oszd meg barátaiddal is!

Facebook Twitter Linkedin

Elérhetőségeink

  • Címünk: 1139 Budapest, Frangepán utca 3. (1. emelet)

  • Ügyfélfogadás, beiratkozás: Hétfőtől - péntekig: 08:00-15:00

  • Telefonszámunk: 06 70 604 2060, vagy 06 1 4500 110

  • E-mail címünk:

Közösségünk