Anda pengunjung yang ke:

Traffic Counter

BANNER SAHABAT

Minggu, 10 Juni 2012

cara Membuat SEARCH ENGINE dengan PHP

Filled under:

Sariptrik-Tips-Trick,Cara Membuat

Oke Kali ni Saya akan menerangkan cara Membuat SEARCH ENGINE dengan PHP
 Yang Tentunya Bahasa Yang Sudah Di Terjemahkan Sesuai Permintaan Teman-teman Semua.
Mari Membaca..!


Mesin pencari kanan pada website Anda tidak akan membawa Anda lebih banyak lalu lintas tetapi akan membantu pengunjung Anda untuk lebih mencari hal-hal sehingga akan menjaga mereka di halaman Anda. Sebuah mesin pencari yang baik dapat diimplementasikan meningkatkan hits Anda dengan hampir 30% dan ini diuji. Aku tidak berbicara hanya untuk tutorial. Ada banyak cara untuk melakukan hal ini. Anda dapat pergi membeli perangkat lunak yang akan memindai situs Anda dan membuat halaman statis dengan hasil. Saya tidak pernah membayangkan diriku menggunakan jenis pencarian tapi mungkin tidak cocok untuk beberapa website. Cara lain adalah dengan mendaftar dengan google dan melaksanakan pencarian mereka sendiri di halaman Anda. Hasilnya akan ditampilkan oleh google tapi saya tidak akan menggunakan satu ini baik ... siapa yang tahu berapa lama waktu yang dibutuhkan sampai google datang merangkak website saya untuk hal-hal baru dan berapa lama sampai akan menampilkan hasil. Cara lain adalah dengan memiliki mesin pencari php yang baik yang akan berinteraksi dengan database Anda dan memindai tabel yang diinginkan untuk string tertentu. Saya suka yang satu ini karena memberikan Anda kekuatan untuk tepatnya, untuk mengubah hal-hal dengan kebutuhan Anda sendiri, untuk menampilkan ke data pengunjung yang tepat atau tidak dll Ok ... php pencarian ... mudah Anda mungkin mengatakan. Tidak sampai aku akan menunjukkan kepada Anda apa yang harus dihindari karena, jika Anda melakukannya salah, itu tidak berguna. Benar-benar tidak berguna! Sebuah kata sederhana seperti "DAN" berubah ke yang lain seperti "ATAU" dapat memiliki dampak besar pada hasil Anda karena itulah apa yang kita coba untuk membawa hasil di sini ... dan bukan hanya salah satu dari mereka tapi yang relevan. Ini akan menjadi tutorial yang panjang dan saya berharap saya akan dapat menjadi sangat transparan dan membuatnya mudah untuk mengikuti. Saya baru-baru bekerja untuk mengimplementasikan pencarian dinamis pada sebuah situs web dan ada sejumlah besar operasi untuk menangani. Aku tahu itu akan menjadi pekerjaan yang panjang dan keras sehingga saya telah mencari sedikit di google untuk pre-built script untuk melakukan hal yang sama dan menyelamatkan saya waktu tapi aku tidak menemukan hasil yang baik. Hanya omong kosong. Sederhana hal-hal yang tidak akan membawa hasil dan saya akan menunjukkan mengapa. Saya akan membangun tutorial ini dengan membandingkan metode sederhana dengan orang-orang yang akan dijelaskan ... orang ya karena ada lebih dari satu solusi yang baik untuk menampilkan hasil yang relevan. Mari kita mulai dengan contoh sederhana di mana string kita akan mencari adalah kata "bentuk". Kami memiliki meja dengan, judul subjudul id, dan konten di mana kita menyimpan artikel kami. Kami ingin menghadapi database dengan string. Kami akan menyimpan string kita dalam sebuah variabel:
$string = "form";
Next we will have to build the recordset in order to display our results.
$sql = "SELECT * FROM articles WHERE title LIKE '$string' AND subtitle LIKE 
'$string' AND content LIKE '$string' ORDER BY id DESC";
$query = mysql_query($sql) or die(mysql_error()); $row_sql = mysql_fetch_assoc($query); $total = mysql_num_rows($query);
row_sql['subti
if($total>0) { while ($row_sql = mysql_fetch_assoc($query)) {//echo out the results echo ''.$row_sql['title'].'<br />'. $tle'].''; } } else { echo "No results to display";
}
Ini adalah metode yang paling sederhana dan, seperti itu, mungkin akan gagal untuk memberikan hasil yang baik. Kenapa? Yah ... mari kita bahwa permintaan SQL dan menganalisanya. Kami sudah membandingkan variabel $ string dengan 3 baris dari meja kami dan kami menggunakan kondisi "DAN" sehingga, sebagai akibatnya, database akan dipaksa untuk menemukan dan artikel yang memiliki kata "bentuk" di semua 3 baris (judul, subjudul dan konten). Jika pertandingan tidak akan ditemukan, kami menyiapkan kesalahan. Kesimpulan untuk metode ini: - DAN pasukan database kami untuk menemukan sebuah artikel di mana semua baris yang dipilih kami HARUS berisi string kita - string harus sama persis (bentuk akan harus bentuk dan bukan bentuk yang merupakan bentuk jamak untuk bentuk tapi masih relevan) Dalam respon terhadap metode ini sangat sederhana yang membawa hampir 0 hasil kita mulai mencari cara lain mencari database kami. Mari kita digg lebih sedikit dan mengubah beberapa fakta. Mari kita query kita dan mengganti "DAN" dengan "OR". Sebuah perubahan besar. Database akan harus menemukan pertandingan di salah satu dari 3 baris (judul, subjudul atau konten), kita dapat mengatakan, bahwa kami berhasil untuk melipatgandakan hasil kami dengan 3 hanya dengan mengganti "DAN" dengan "OR" dan, kemungkinan besar , kita mulai melihat beberapa hasil. Permintaan baru akan:
SELECT * FROM artikel MANA '$ string' '$ string' '$ string' judul SEPERTI ATAU subtitle SEPERTI ATAU konten SEPERTI ORDER BY id DESC
Kesimpulan untuk metode ini: - ATAU memiliki efek yang baik dan kami menemukan hasil yang lebih untuk menampilkan - kita masih mencari kata-kata untuk sama persis dengan string kita ("bentuk" dibandingkan dengan "bentuk" tidak akan ditampilkan sebagai hasil tetapi bentuk adalah jamak untuk bentuk sehingga dapat menjadi relevan) Kami memiliki kesimpulan 2 kami sehingga kami harus melakukan sesuatu dengan metode baru pencarian untuk menemukan hasil yang lebih yang juga relevan. Bukan hanya pertandingan yang tepat. Mari saya perkenalkan Anda untuk baru "%" kami teman. Apa yang bisa dia lakukan? Banyak hal, dia adalah satu dengan trik sulap yang akan membawa permintaan kami ke tingkat yang baru. Tanda persen adalah karakter wildcard sehingga string SEPERTI dapat diperpanjang dalam rangka untuk mencocokkan beberapa catatan. Permintaan baru akan:
SELECT * FROM articles WHERE title LIKE '%'.$string.'%' OR subtitle LIKE '%'.$string.'%' OR content LIKE '%'.$string.'%' ORDER BY id DESC
Database kami akan menampilkan hasil yang berisi bentuk kata manapun ia duduk dalam kata lain. "bentuk" akan menjadi hasil, "membentuk" akan menjadi hasilnya, "format" juga akan menjadi hasilnya. '$ string..'% '= hasil hanya yang dimulai dengan "bentuk"'% '$ string..'% '= hasil yang memulai atau mengakhiri atau mengandung "bentuk"'% '. $ string =''. hanya hasil yang berakhir dengan "bentuk" Seperti Anda mungkin telah melihat aku sedang membangun tutorial ini pada tingkat jadi inilah yang berikutnya. Bagaimana jika ... pengunjung kami akan mencari "bentuk" dan bukan "bentuk"? "bentuk" tidak akan lulus sebagai akibatnya, dan tidak akan disajikan oleh database kami bahkan jika kita menggunakan semua metode di atas. Jangan khawatir, kami punya solusinya. Sudah waktunya untuk mempersiapkan data kami sebelum menggunakannya dalam query kita (saya tidak menyarankan Anda untuk melakukan query dengan data langsung dari input pengguna tanpa memeriksa terlebih dahulu ... PERNAH). Sudah waktunya bagi Anda untuk mencari tahu tentang Algoritma Porter Stemmer. Algoritma Porter berasal (atau Porter stemmer??) Adalah proses untuk menghilangkan ujung Biasa morfologi dan yg berinfleksi dari kata-kata dalam bahasa Inggris. Kegunaan utamanya adalah sebagai bagian dari proses normalisasi istilah yang biasanya dilakukan saat mengatur sistem Information Retrieval. Ada 2 kelas (atau lebih?!) Tersedia untuk PHP. Satu milik Richard Heyes dan membutuhkan PHP5 dan yang lainnya bahwa kita akan menggunakan milik Jon Abernathy. Apa yang dilakukannya?! Ini pada dasarnya akan membutuhkan sebuah kata, atau daftar kata, dan mengurangi mereka untuk batang bahasa Inggris mereka. "bentuk" mungkin akan menjadi "bentuk" jadi kita kembali dalam bisnis. Mencari "bentuk" akan membawa "bentuk" sebagai hasilnya juga. Berikut yang kita sejauh ini:
include('stemmer.class.inc');
$stemmer = new Stemmer;
r->stem($string);
$sql = "SELECT * FROM a
$stemmed_string = $stemm
erticles WHERE title LIKE '%'.$stemmed_string.'%' OR subtitle LIKE '%'.$stemmed_string.'%' OR content LIKE '%'.$stemmed_string.'%' ORDER BY id DESC";
Jika Anda pikir ini akan membawa kembali hasil terlalu banyak saya sarankan Anda untuk menggunakan string berasal hanya sebagai awalan untuk apa yang kita cari.
$sql = "SELECT * FROM articles WHERE title LIKE ''.$stemmed_string.'%' OR subtitle LIKE ''.$stemmed_string.'%' OR content LIKE ''.$stemmed_string.'%' ORDER BY id DESC";
Kedua metode baik. Itu hanya tergantung pada ukuran database Anda dan siapa tahu, apa yang Anda pikirkan ... mungkin bekerja. Kita juga perlu untuk mengubah string kita menjadi huruf kecil untuk hasil yang lebih akurat.

$stemmed_string = $stemmer->stem(strtolower($string));
Anda pikir kami sudah selesai?! Tidak sama sekali ... kami di setengah dari tutorial kami. Bagaimana jika ... pengunjung kami akan mencari "bentuk tableless" misalnya. Database akan mengembalikan artikel yang mengandung string tetapi bukan artikel yang akan mengandung setidaknya satu kata dari string kita, bahkan tidak artikel yang mengandung kata "Tableless" pada awal konten dan kata "bentuk" di akhir atau tengah-tengah itu. Apa yang harus kita lakukan?! Angkatan pengunjung untuk memasukkan hanya satu kata per pencarian untuk memberinya hasil yang relevan. Tidak sama sekali. Kami akan membagi string kita dalam array dan membuat lingkaran dalam permintaan kami untuk menemukan hasil yang mungkin berisi "bentuk" dalam subjudul, judul atau isi, tetapi bukan kata "Tableless". Berikut adalah wajah baru dari kode kita.
$split = split(" ",$stemmed_string);
foreach ($split as $array => $value) {
$new_string .= $value;
}
Array di atas digunakan untuk membagi string dalam kata-kata dan batang masing-masing dan setiap dari mereka (saya sudah mencoba untuk membendung string dan berhasil melakukan trik dengan hanya kata pertama dari string yang diberikan sehingga kami sedang membangun sebuah array untuk membantu kami keluar dan batang setiap kata secara terpisah). Kode ini mungkin terlihat baik tetapi itu tidak. Dari "bentuk tableless" kita akan memiliki "tableform" yang mewakili dua kata berasal tapi bersatu. Kami akan memodifikasi array kita untuk menambahkan spasi tambahan antara kata-kata tetapi juga memakan ruang terakhir: "bentuk tabel" bukan "bentuk tabel". Berikut array baru:
$split = split(" ",$stemmed_string);
foreach ($split as $array => $value) {
$new_string .= ''.$value.' '; }
(strLen($new_string)-1));
$new_string=substr($new_string,0 ,
Sekarang kita harus memperluas permintaan kami untuk menemukan hasil yang cocok dengan kata-kata baru kami berasal. Kami akan membangun sebuah query yang akan terlihat dalam judul atau subjudul atau isi dari artikel kami untuk tabel atau bentuk. Lebih hasil untuk datang ya ...
$split_stemmed = split(" ",$new_string);
sql = "SELECT DISTINCT * FROM articles WHERE (";
$ while(list($key,$val)=each($split_stemmed)){
(title LIKE '%'.$val.'%' OR subtitle
if($val<>" " and strlen($val) > 0){ $sql .= " LIKE '%'.$val.'%' OR content LIKE '%'.$val.'%') OR"; } }
st OR
$sql .= ") ORDER BY id DESC";
$sql=substr($sql,0,(strLen($sql)-3));//this will eat the l
a
Ini permintaan baru akan memiliki lebih banyak pekerjaan yang harus dilakukan tetapi juga akan menemukan hasil yang lebih. Permintaan yang dihasilkan akan terlihat seperti ini:
SELECT DISTINCT * FROM articles WHERE ((title LIKE '%table%' OR subtitle LIKE '%table%' OR content LIKE '%table%') OR (title LIKE '%form%' OR subtitle LIKE '%form%' OR content LIKE '%form%')) ORDER BY id DESC
Saya yakin Anda dapat melihat perbedaannya. Script sekarang akan menghasilkan satu set baru pertanyaan untuk setiap kata sebagian berasal. Kami mungkin juga RLIKE pengguna bukan SEPERTI tapi itu tidak dianjurkan untuk menengah database dan up karena membutuhkan sumber daya lebih banyak dari server untuk melakukan query. Ada sesuatu yang lebih untuk menambah metode ini saya sudah tutorialized atas. Mari kita misalkan bahwa pengunjung kami bukan jenis kata kunci dari pria dan memasuki string berikut: "Saya ingin mencari tutorial tentang bentuk Tableless". Woooohooooo .... Aku senang aku tidak server Anda :) Dapatkah Anda membayangkan SQL?!??! Mari kita bekerja pada itu. Pertama-tama kita akan menghilangkan semua kata yang didasarkan pada 3 atau kurang huruf jadi mari kita memperpanjang array di mana kita menciptakan kata-kata berasal.
$split = split(" ",$stemmed_string);
foreach ($split as $array => $value) {
if (strlen($value) > 3) {
';
}
}
w_string=substr(
$n e
$new_string .= ''.$value.
'$new_string,0,(strLen($new_string)-1));
After this there is still work to do. We need to eliminate punctuations and common words like "find", "about"...etc. We can build a class to do the job for us.
class Cleaner {
r $stopwords = array(" find ", " about ", " me ", " ever ", " each ")//you need to extend this big time.
v
avar $symbols = array('/','\\','\'','"',',','.','<','>','?',';',':','[',']','{','}','|','=','+','-','_',')','(','*','&','^','%','$','#','@','!','~','`' );//this will remove punctuation
function parseString($string) { $string = ' '.$string.' '; $string = $this->removeStopwords($string); $string = $this->removeSymbols($string); return $string; }
r_replace(' ',' ',$string);
retur
function removeStopwords($string) { for ($i = 0; $i < sizeof($this->stopwords); $i++) { $string = str_replace($this->stopwords[$i],' ',$string); } //$string = s tn trim($string); } function removeSymbols($string) { for ($i = 0; $i < sizeof($this->symbols); $i++) { $string = str_replace($this->symbols[$i],' ',$string); } return trim($string); }
}
Simpan sebagai cleaner.php misalnya dan bersiap-siap untuk mengambil script Anda ke ... tentu saja .. LEVEL BERIKUTNYA. Bersih, bertangkai, tanpa tanda baca, menghentikan kata-kata apapun. Berikut hasil yang hampir akhir kami:
include('stemmer.class.inc');
include('cleaner.php');
Stemmer
$stemmer = new ;
temmed_string = $stemmer->stem($string);
$ s$clean_string = new cleaner();
->parseString($stemmed_string);
split = split(" ",$stemmed_
$
$stemmed_string = $clean_strin gstring); foreach ($split as $array => $value) {
}
$new_str
if (strlen($value) > 3) { continue ;ing .= ''.$value.' '; } $new_string=substr($new_string,0,(strLen($new_string)-1));
E (";
while(list($key,$val
$split_stemmed = split(" ",$new_string); $sql = "SELECT DISTINCT * FROM articles WHE R)=each($split_stemmed)){ if($val<>" " and strlen($val) > 0){
' OR content LIKE '%'.$val.'%') OR";
} }
substr($sql,0,(strLen($sql)-3));//thi
$sql =
$sql .= "(title LIKE '%'.$val.'%' OR subtitle LIKE '%'.$val.' %s will eat the last OR $sql .= ") ORDER BY id DESC"; $query = mysql_query($sql) or die(mysql_error()); $row_sql = mysql_fetch_assoc($query);
itle'].'<br />'.$row_sql['subtitl
$total = mysql_num_rows($query); if($total>0) { while ($row_sql = mysql_fetch_assoc($query)) {//echo out the results echo ''.$row_sql[' te'].''; } } else { echo "No results to display";
}
Kami sekarang memiliki pencarian bersih, bertangkai kata kunci untuk hasil terbaik, tetapi bagaimana dengan hasil yang relevan yang harus duduk di atas yang lain. Bagaimana kita memberi bobot kepada hasil kami berdasarkan kejadian (kejadian Cukup jelas saya percaya). Jika ada 100 hasil tentang "bentuk", tetapi hanya satu atau mungkin 2 dari mereka benar-benar relevan dengan apa yang kita mencari apa yang kita lakukan untuk membawa lebih dekat ke hasil pertama yang database kami mengambil dan tidak hanya di suatu tempat antara halaman berdasarkan apa ... id turun mungkin atau yang tahu bagaimana Anda memesan hasil Anda. Apa yang perlu kita lakukan adalah menyimpan jumlah kejadian langsung dari query SQL. Ya aku tahu, kau pikir kita akan membangun sebuah array baru (bisa juga menjadi solusi) tapi kita benar-benar memiliki lebih dari satu solusi untuk bekerja dengan langsung dari query SQL. Bagaimana kita menyimpan nomor itu? well ... melihat permintaan baru:
$sql = "SELECT DISTINCT COUNT(*) As occurrences, id, title, subtitle, content FROM articles WHERE (";
while(list($key,$val)=each($split_stemmed)){
$sql .= "(title LIKE '%'.$val.'%' OR subtitle
if($val<>" " and strlen($val) > 0){ LIKE '%'.$val.'%' OR content LIKE '%'.$val.'%') OR"; } }
t OR
$sql .= ") GROUP BY id ORDER BY occurrences DESC";
$sql=substr($sql,0,(strLen($sql)-3));//this will eat the la
s
Cara lain untuk melakukan hal ini adalah easyer tetapi meninggalkan Anda dengan pilihan kurang pada bagaimana menampilkan hasil dan apa yang akan ditampilkan. Ada yang disebut "Searches Full-Text Boolean" yang akan mengetahui dengan sendirinya yang hasil relevan, apa kata umum, berhenti dll .. kata dasarnya akan melakukan hal yang sama seperti script kami di atas dari sebuah query tunggal tetapi, sebagai aku berkata, ia akan melakukannya dengan sendirinya. Saya merekomendasikan hal ini kepada mid-size ke database yang lebih besar karena membawa hasil aneh ketika digunakan untuk melawan orang-orang kecil. Misalnya jika Anda hanya memiliki 3 artikel dan semua 3 dari mereka mengandung kata "bentuk", namun pengguna kami sedang mencari "bentuk" kata, metode ini akan menemukan hasil sebagai non-relevan karena fakta bahwa itu hadir dalam semua artikel sehingga itu adalah 100% dan diambil sebagai kata umum, hentikan kata. Segala sesuatu yang melampaui 50% akan diabaikan karena kebijakan yang sama. Lebih baik karena membutuhkan sumber daya kurang, kode kurang dan juga mampu memesan hasil dengan relevansi dari sebagian besar kurang langsung dari pernyataan SQL jadi itu adalah neraka kode yang lebih kecil. Untuk membaca lebih lanjut tentang metode ini saya sarankan Anda untuk membaca Manual Referensi dari MySql. Dengan menggunakan metode ini kita memiliki kode dan dan dari tutorial ini dan terima kasih untuk membaca ini.
$sql = "SELECT DISTINCT MATCH(title, subtitle, content) Against ('$string' IN BOOLEAN MODE) as score, title, subtitle, content FROM articles WHERE MATCH(title, subtitle, content) Against ('$string' IN BOOLEAN MODE) ORDER BY score DESC";
$query = mysql_query($sql) or die(mysql_error()); $row_sql = mysql_fetch_assoc($query); $total = mysql_num_rows($query); if($total>0) { while ($row_sql = mysql_fetch_assoc($query)) {//echo out the results
echo ''.$row_sql['title'].'<br />'.$row_sql['subtitle'].''; } } else { echo "No results to display";
}
We could also use MATCH() Against instead of SELECT COUNT() for a faster result like this:
$sql = "SELECT DISTINCT MATCH(title, subtitle, content) Against ('$string' IN BOOLEAN MODE) as occurrences, id, title, subtitle, content FROM articles WHERE (";
while(list($key,$val)=each($split_stemmed)){ if($val<>" " and strlen($val) > 0){
";
}
}
$sql=substr($sql,0,(strLen($sql)-3));//this will eat the last OR
$sql .= "(title LIKE '%'.$val.'%' OR subtitle LIKE '%'.$val.'%' OR content LIKE '%'.$val.'%') O
R $sql .= ") ORDER BY occurrences DESC";
Apa bedanya. Saya sudah bilang. MATCH () lebih cepat tapi agak berguna jika database Anda kecil sampai pertengahan ukuran sementara COUNT () membutuhkan waktu lebih lama untuk memutuskan apa skor relevansi antara catatan tetapi mungkin cocok untuk Anda kecil menengah ukuran basis data yang lebih baik. Ini benar-benar terserah pada Anda untuk memutuskan apa yang terbaik untuk halaman Anda. Saya membangun tutorial ini menawarkan berbagai pilihan. Bola di bidang Anda sekarang. UPDATE: Untuk demo dan link download dari aplikasi kita + autocomplete Ajax / fitur autosuggest silakan baca artikel ini

Ditulis Oleh : SyariĆ’™ ~ Tips dan Trik Blogspot

Syarip Hidayat Sobat sedang membaca artikel tentang cara Membuat SEARCH ENGINE dengan PHP. TuTorial Ku UnTuK Mu™ Memperbolehkan mengcopy paste atau menyebar-luaskan artikel ini, namun jangan lupa untuk meletakkan link dibawah ini sebagai sumbernya



Baca Artikel Lainnya.!:

4 komentar:

  1. Gak ngerti ane sob! Kalo bisa pakai bhs.indonesia :13
    By : http://putrakalsel.blogspot.com

    BalasHapus
  2. gk ngerti ya :16 , iya deh nanti sob ane menggunakan bhs.indonesia biar pada bisa mengerti ^_^ terima kasih ya Sudah berkunjung & memberika komentar mu di artikel ini :24

    BalasHapus