Τεχνικές αναζήτησης

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

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

Απάντηση
Άβαταρ μέλους
RADICAL
Δημοσιεύσεις: 386
Εγγραφή: 14 Ιούλ 2004 01:07
Τοποθεσία: Athens
Επικοινωνία:

Τεχνικές αναζήτησης

Δημοσίευση από RADICAL » 30 Ιουν 2006 20:28

Καλησπέρα,
Τι τεχνικές χρησιμοποιήτε όταν φτιάχνετε search scripts (για db πάντα) για να μην επηρεάζετε η αναζήτηση
απο ορθογραφικά, caps, τόνους κ.λ.π.?

Χρησημοποιεί κανεις π.χ. κλειδία με ακουστική αλφάβητο για αυτό το λόγο?
Υπάρχει καμια άλλη τεχνική?
Εικόνα

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Τεχνικές αναζήτησης

Δημοσίευση από fafos » 30 Ιουν 2006 22:47

Palia xrhsimopoiousa kapoies methodous oi opoies kourazan ton server kai mou parousiazan polla lathi..
Tora teleytaia exo iothethsei ton tropo gnosto os "Did You Mean?"
Me ayton ton tropo otan kapoios grapsei p.x φάφος ή φαφος kai sthn vash mou exo os apotelesma mono to Φάφος tha ton rothsei: Μήπως ψάχνετε για Φάφος?

Ena paradeigma mporeis na deis edo:
http://trikkaionpoliteia.gr/search.php? ... 0&search=1

H function pou xrhsimopoio einai h parakato:

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

function get_search_results($query, $start, $category, $searchtype, $results, $domain) {
	global $sph_messages, $results_per_page,
		$links_to_next,
		$show_query_scores,
		$mysql_table_prefix,
		$desc_length;
	if ($results != "") {
		$results_per_page = $results;
	}

	if ($searchtype == "phrase") {
	   $query=str_replace('"','',$query);
	   $query = "\"".$query."\"";
	}

	$starttime = getmicrotime();
	// catch " if only one time entered
        if (substr_count($query,'"')==1){
           $query=str_replace('"','',$query);
        }   
	$words = makeboollist($query);
	$ignorewords = $words['ignore'];

	
	$full_result['ignore_words'] = $words['ignore'];

	if ($start==0) 
		$start=1;
	$result = search($words, $category, $start, $results_per_page, $searchtype, $domain);
	$query= stripslashes($query);

	$entitiesQuery = htmlspecialchars($query);
	$full_result['ent_query'] = $entitiesQuery;

	$endtime = getmicrotime() - $starttime;
	$rows = $result['results'];
	$time = round($endtime*100)/100;

	
	$full_result['time'] = $time;


	// arxh did you mean


	$did_you_mean = "";


	if (isset($result['did_you_mean'])) {
		$did_you_mean_b=$query;
		$did_you_mean=$query;
		while (list($key, $val) = each($result['did_you_mean'])) {
			if ($key != $val) {
				$did_you_mean_b = str_replace&#40;$key, "<b>$val</b>", $did_you_mean_b&#41;;
				$did_you_mean = str_replace&#40;$key, "$val", $did_you_mean&#41;;
			&#125;
		&#125;
	&#125;

	$full_result&#91;'did_you_mean'&#93; = $did_you_mean;
	$full_result&#91;'did_you_mean_b'&#93; = $did_you_mean_b;

//telos did you mean


	$matchword = $sph_messages&#91;"matches"&#93;;
	if &#40;$rows == 1&#41; &#123;
		$matchword= $sph_messages&#91;"match"&#93;;
	&#125;

	$num_of_results = count&#40;$result&#41; - 2;
	
	
	
	$full_result&#91;'num_of_results'&#93; = $num_of_results;


	if &#40;$start < 2&#41;
		saveToLog&#40;addslashes&#40;$query&#41;, $time, $rows&#41;;
	$from = &#40;$start-1&#41; * $results_per_page+1;
	$to = min&#40;&#40;$start&#41;*$results_per_page, $rows&#41;;

	
	$full_result&#91;'from'&#93; = $from;
	$full_result&#91;'to'&#93; = $to;
	$full_result&#91;'total_results'&#93; = $rows;

	if &#40;$rows>0&#41; &#123;
		$maxweight = $result&#91;'maxweight'&#93;;
		$i = 0;
		while &#40;$i < $num_of_results && $i < $results_per_page&#41; &#123;
			$title = $result&#91;$i&#93;&#91;'title'&#93;;
			$url = $result&#91;$i&#93;&#91;'url'&#93;;
			$fulltxt = $result&#91;$i&#93;&#91;'fulltxt'&#93;;
			$page_size = $result&#91;$i&#93;&#91;'size'&#93;;
			$domain = $result&#91;$i&#93;&#91;'domain'&#93;;
			if &#40;$page_size!=""&#41; 
				$page_size = number_format&#40;$page_size, 1&#41;."kb";
			
			
			$txtlen = strlen&#40;$fulltxt&#41;;
			if &#40;$txtlen > $desc_length&#41; &#123;
				$places = array&#40;&#41;;
				foreach&#40;$words&#91;'hilight'&#93; as $word&#41; &#123;
					$tmp = strtolower&#40;$fulltxt&#41;;
					$found_in = strpos&#40;$tmp, $word&#41;;
					$sum = -strlen&#40;$word&#41;;
					while &#40;!&#40;$found_in ==''&#41;&#41; &#123;
						$pos = $found_in+strlen&#40;$word&#41;;
						$sum += $pos;  //FIX!!
						$tmp = substr&#40;$tmp, $pos&#41;;
						$places&#91;&#93; = $sum;
						$found_in = strpos&#40;$tmp, $word&#41;;

					&#125;
				&#125;
				sort&#40;$places&#41;;
				$x = 0;
				$begin = 0;
				$end = 0;
				while&#40;list&#40;$id, $place&#41; = each&#40;$places&#41;&#41; &#123;
					while &#40;$places&#91;$id + $x&#93; - $place < $desc_length && $x+$id < count&#40;$places&#41; && $place < strlen&#40;$fulltxt&#41; -$desc_length&#41; &#123;
						$x++;
						$begin = $id;
						$end = $id + $x;
					&#125;
				&#125;

				$begin_pos = max&#40;0, $places&#91;$begin&#93; - 30&#41;;
				$fulltxt = substr&#40;$fulltxt, $begin_pos, $desc_length&#41;;

				if &#40;$places&#91;$begin&#93; > 0&#41; &#123;
					$begin_pos = strpos&#40;$fulltxt, " "&#41;;
				&#125;
				$fulltxt = substr&#40;$fulltxt, $begin_pos, $desc_length&#41;;
				$fulltxt = substr&#40;$fulltxt, 0, strrpos&#40;$fulltxt, " "&#41;&#41;;
				$fulltxt = $fulltxt;
			&#125;

			$weight = number_format&#40;$result&#91;$i&#93;&#91;'weight'&#93;/$maxweight*100, 2&#41;;
			if &#40;$title==''&#41;
				$title = $sph_messages&#91;"Untitled"&#93;;
			$regs = Array&#40;&#41;;
			foreach&#40;$words&#91;'hilight'&#93; as $change&#41; &#123;
				while &#40;@eregi&#40;"&#91;^\>&#93;&#40;".$change."&#41;&#91;^\<&#93;", " ".$title." ", $regs&#41;&#41; &#123;
					$title = eregi_replace&#40;$regs&#91;1&#93;, "<b>".$regs&#91;1&#93;."</b>", $title&#41;;
				&#125;

				while &#40;@eregi&#40;"&#91;^\>&#93;&#40;".$change."&#41;&#91;^\<&#93;", " ".$fulltxt." ", $regs&#41;&#41; &#123;
					$fulltxt = eregi_replace&#40;$regs&#91;1&#93;, "<b>".$regs&#91;1&#93;."</b>", $fulltxt&#41;;
				&#125;
				$url2 = $url;
				while &#40;@eregi&#40;"&#91;^\>&#93;&#40;".$change."&#41;&#91;^\<&#93;", $url2, $regs&#41;&#41; &#123;
					$url2 = eregi_replace&#40;$regs&#91;1&#93;, "<b>".$regs&#91;1&#93;."</b>", $url2&#41;;
				&#125;
			&#125;

			$num = $from + $i;

			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'num'&#93; =  $num;
			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'weight'&#93; =  $weight;
			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'url'&#93; =  $url;
			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'title'&#93; =  $title;
			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'fulltxt'&#93; =  $fulltxt;
			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'url2'&#93; =  $url2;
			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'page_size'&#93; =  $page_size;
			$full_result&#91;'qry_results'&#93;&#91;$i&#93;&#91;'domain_name'&#93; =  $domain;
			$i++;
		&#125;
	&#125;



	$pages = ceil&#40;$rows / $results_per_page&#41;;
	$full_result&#91;'pages'&#93; = $pages;
	$prev = $start - 1;
	$full_result&#91;'prev'&#93; = $prev;
	$next = $start + 1;
	$full_result&#91;'next'&#93; = $next;
	$full_result&#91;'start'&#93; = $start;
	$full_result&#91;'query'&#93; = $query;

	if &#40;$from <= $to&#41; &#123;

		$firstpage = $start - $links_to_next;
		if &#40;$firstpage < 1&#41; $firstpage = 1;
		$lastpage = $start + $links_to_next;
		if &#40;$lastpage > $pages&#41; $lastpage = $pages;

		for &#40;$x=$firstpage; $x<=$lastpage; $x++&#41;
			$full_result&#91;'other_pages'&#93;&#91;&#93; = $x;

	&#125;

	return $full_result;

&#125;
Sthn anazhthsh to emfanizo me ena if:

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

<?if &#40;$search_results&#91;'did_you_mean'&#93;&#41;&#123;?>
	<div id="did_you_mean">
	Μήπως ψάχνετε για?&#58; <a href="<?='search.php?query='.quote_replace&#40;addmarks&#40;$search_results&#91;'did_you_mean'&#93;&#41;&#41;.'&search=1'?>"><?=$search_results&#91;'did_you_mean_b'&#93;; ?></a>?
    </div>
<? &#125;?>	

Άβαταρ μέλους
RADICAL
Δημοσιεύσεις: 386
Εγγραφή: 14 Ιούλ 2004 01:07
Τοποθεσία: Athens
Επικοινωνία:

Τεχνικές αναζήτησης

Δημοσίευση από RADICAL » 30 Ιουν 2006 23:17

Καλα άψογο, και απ'οτι βλέπω καλύπτει όλα τα ενδεχόμενα.

Εγω προσανατολιζόμουν στο να διατηρώ άλλον ένα πίνακα με όλα τα keywords
αλλαγμένα σε ακουστική λατινική αλφάβητο και μια αντιστοίχιση με τα κανονικά data, και όταν
ψάχνει ο χρήστης κάτι, να το μετατρέπω με τους ίδους κανόνες, να ψάχνω εκεί
και να του γυρνάω τα αντίστοιχα.
Όσο να ναι όμως σαφώς καλύτερα να έχεις έναν πίνακα, όσο αυτόματα και αν δημιουργείτε ο αλλος.

Στην τελική χτυπάς και ενα query με το what did you mean και του φέρνεις και αυτά κατευθείαν :D

Πολυ καλό πράγματι, ίσως αναθεωρήσω :)
Εικόνα

Απάντηση

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

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

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