İle İbrahim Diallo
2 Temmuz 2014 tarihinde yayınlandı ~ 16 dakika okumaArama, bir web sitesinde önemli bir özelliktir. Birkaç okuyucum blogumda belirli bir pasaj aramak istediğinde, arama kutusunu kullanırlar. Eskiden Google Arama tarafından destekleniyordu, ancak o zamandan beri daha iyisini yapabileceğim için değil, ilginç bir meydan okuma olduğu için kendi ev yapımı sürümüme değiştirdim.
Aceleniz varsa ve sadece sitenizin aranabilir olmasını istiyorsanız, daha önce yaptığımı yapın, Google'ı kullanın.
// search.php dosyasında $term = isset($_GET["query"])?$_GET["query"]: ""; $terim = urlencode($terim); $website = urlencode("www.yourwebsite.com"); $redirect = "https://www.google.com/search?q=site%3A($website)+($term)"; header("Yer: $yönlendirme"); çıkış;
Yaptığı şey oldukça basit. Kullanıcı tarafından geçen terimi alın ve Google arama sayfasına iletin. Arama sorgusunda site: anahtar sözcüğünü kullanarak arama sonucunu mevcut alanımızla sınırlayın. Google tarafından dizine eklenen tüm sayfalarınız artık arama yoluyla erişilebilir olacak. Ancak aramanızı evde halletmek istiyorsanız, okumaya devam edin.
Ev Yapımı Arama Çözümü
Daha ileri gitmeden önce, bu blogdaki arama kutusunu kullanmayı deneyin. Aşağıda tarif edeceğim işlemin aynısını kullanıyor. İstediğinizin bu olduğunu düşünüyorsanız, lütfen okumaya devam edin.
Bu çözüm, küçük web sitelerine yöneliktir. LIKE'ı her iki uçta da joker karakterlerle kullanıyorum, yani aramanız dizine eklenemez. Bu, çözümün tonlarca veri içermeyen blogunuz veya kişisel web siteniz için iyi çalışacağı anlamına gelir.Bunu daha büyük bir web sitesine taşıyın ve çok yavaş olabilir.MySQL, burada yapmadığımız Tam Metin Arama özelliğini sunar.
Not: 5000 blog yayınınız varsa, hala iyisiniz. .
Bu blogun yapısını referans olarak alacağız. Her blog gönderisinde şunlar bulunur:
- Bir başlık p_title
- bir url p_url
- Bir özet p_summary
- Bir gönderi içeriği p_content
- Ve kategoriler kategori.tagname
Arama terimimizle eşleşen her alan için ona bir puan vereceğiz. Skor maçın önemine göre belirlenir:
// tam terim eşleşmeleri başlıkta bulunur $scoreFullTitle = 6; // bölümdeki başlığı eşleştirin $scoreTitleKeyword = 5; // tam terim eşleşmeleri özette bulunur $scoreFullSummary = 5; // bölümdeki özeti eşleştirin $scoreSummaryKeyword = 4; // tam terim eşleşmeleri içerikte bulunur $scoreFullDocument = 4; // belgeyi bölümle eşleştirin $scoreDocumentKeyword = 3; // bir kategoriyle eşleşir $scoreCategoryKeyword = 2; // url ile eşleşir $scoreUrlKeyword = 1;
Başlamadan önce, kaldırılması gereken bir aramaya pek katkısı olmayan birkaç kelime var. Örnek "içinde", "it", "a", "bundan", "ve" ... . Bunları filtreleyeceğiz ve alakasız olduğunu düşündüğünüz herhangi bir kelimeyi eklemekten çekinmeyin. Başka bir şey, sorgumuzun uzunluğunu sınırlamak istiyoruz. Bir kullanıcının arama alanına bir roman yazmasını ve MySQL sunucumuzu çökertmesini istemiyoruz.
// Gereksiz kelimeleri arama teriminden kaldırın ve bir dizi işlevi olarak döndürün filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // bu listeyi kelimelerinizle genişletin $list = array("in","it","a","the","of","or","I","siz", $c = 0; foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( devam; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words; ) // word limit karakter karakter sayısı function limitChars($query, $limit = 200)( return substr($query, 0,$limit); )
Yardımcı fonksiyonlarımız artık karakter sayısını sınırlayabilir ve gereksiz kelimeleri filtreleyebilir. Algoritmamızı uygulama şeklimiz, her eşleşme bulduğumuzda bir puan vermektir. Kelimeleri if ifadesini kullanarak eşleştireceğiz ve daha fazla kelime eşleştirdikçe puan toplayacağız. Sonunda, sonuçlarımızı sıralamak için bu puanı kullanabiliriz.
Not: MySQL veritabanına nasıl bağlanılacağını göstermeyeceğim. Veritabanına verimli bir şekilde bağlanma konusunda sorun yaşıyorsanız, bunu okumanızı tavsiye ederim.
Önce fonksiyonumuza bir yapı verelim. Not Bölümleri ayrı ayrı uygulayabilmemiz için yer tutucular bıraktım.
function search($query)( $query = trim($query); if (mb_strlen($query)===0)( // boş aramaya gerek yok değil mi? return false; ) $query = limitChars($query) ; // Tartı puanları $scoreFullTitle = 6; $scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreCategoryKeywords( $score =UrlKeywords( $scoreSummaryKeywords = 4) $sorgu); $escQuery = DB::escape($query); // db nesnesini almak için yukarıdaki nota bakın $titleSQL = dizi(); $sumSQL = dizi(); $docSQL = dizi(); $categorySQL = dizi (); $urlSQL = array(); /** Tam tekrarları eşleştirme PLACE HOLDER **/ /** Anahtar Kelimeleri Eşleştirme PLACE HOLDER **/ $sql = "SELECT p.p_id,p.p_title,p.p_date_published,p. p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Başlık puanı ".implode(" + ", $titleSQL).")+ (-- Özet ".implode(" + ", $sumSQL) .")+ (-- belge ".implode(" + ", $docSQL).")+ (-- etiket/kategori ".implode(" + ", $categorySQL).")+ (-- url ". patlatmak(" + ", $urlSQL).")) alaka düzeyi olarak p NEREDE p.status = "yayınlandı" alaka düzeyine sahip >
Sorguda, tüm puanlar alaka değişkeni olarak toplanacak ve sonuçları sıralamak için bunu kullanabiliriz.
Tam oluşumları eşleştirme
Önce bazı anahtar kelimelerimiz olduğundan emin olduktan sonra sorgumuzu ekliyoruz.
If (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%" .$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument),0)"; )
Puanı yüksek olan maçlar bunlar. Arama terimi bunları içeren bir makaleyle eşleşirse, üstte görünme şansları daha yüksek olacaktır.
Eşleşen anahtar kelime oluşumları
Tüm anahtar kelimeler arasında dolaşıyoruz ve alanlardan herhangi biriyle eşleşip eşleşmediklerini kontrol ediyoruz. Bir gönderi birden fazla kategoriye sahip olabileceğinden, kategori eşleşmesi için bir alt sorgu kullandım.
Foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword),0)"; $sumSQL = "if (p_summary) LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%".DB::escape($key)."% ",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url GİBİ "%".DB::escape($key)."%",($scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) KATEGORİDEN post_category ON'a KATIL post_category.tag_id = kategori.tag_id NEREDE post_category.post_id = p.post_id VE Category.name = "".DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; )
Ayrıca aşağıda bir yorumcunun işaret ettiği gibi, bu değişkenlerin boş diziler olmadığından emin olmalıyız yoksa sorgu başarısız olur.
// Sadece boş olması durumunda 0 ekleyin if (empty($titleSQL))( $titleSQL = 0; ) if (empty($sumSQL))( $sumSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (empty($tagSQL))( $tagSQL = 0; )
Sonunda, sorguların tümü birleştirilir ve gönderinin arama terimiyle alaka düzeyini belirlemek için bir araya getirilir.
// Gereksiz kelimeleri arama teriminden kaldırın ve bir dizi işlevi olarak döndürün filterSearchKeys($query)( $query = trim(preg_replace("/(\s+)+/", " ", $query)); $words = array(); // bu listeyi kelimelerinizle genişletin $list = array("in","it","a","the","of","or","I","siz", $c = 0; foreach(explode(" ", $query) as $key)( if (in_array($key, $list))( devam; ) $words = $key; if ($c >= 15)( break; ) $c++ ; ) return $words; ) // kelimeleri sınırla karakter sayısı function limitChars($sorgu, $limit = 200)( return substr($sorgu, 0,$limit); ) function search($sorgu)( $sorgu = kırp ($query); if (mb_strlen($query)===0)( // boş aramaya gerek yok değil mi? return false; ) $query = limitChars($query); // Tartım puanları $scoreFullTitle = 6; $ scoreTitleKeyword = 5; $scoreFullSummary = 5; $scoreSummaryKeyword = 4; $scoreFullDocument = 4; $scoreDocumentKeyword = 3; $scoreCategoryKeyword = 2; $scoreUrlKe kelime = 1; $keywords = filterSearchKeys($sorgu); $escQuery = DB::escape($sorgu); // db nesnesini almak için yukarıdaki nota bakın $titleSQL = array(); $toplamSQL = dizi(); $docSQL = dizi(); $kategoriSQL = dizi(); $urlSQL = dizi(); /** Eşleşen tam oluşumlar **/ if (count($keywords) > 1)( $titleSQL = "if (p_title LIKE "%".$escQuery."%",($scoreFullTitle),0)"; $sumSQL = "if (p_summary LIKE "%".$escQuery."%",($scoreFullSummary),0)"; $docSQL = "if (p_content LIKE "%".$escQuery."%",($scoreFullDocument), 0)"; ) /** Anahtar Kelimeler Eşleşiyor **/ foreach($keywords as $key)( $titleSQL = "if (p_title LIKE "%".DB::escape($key)."%",($scoreTitleKeyword ),0)"; $sumSQL = "if (p_summary LIKE "%".DB::escape($key)."%",($scoreSummaryKeyword),0)"; $docSQL = "if (p_content LIKE "%" ".DB::escape($key)."%",($scoreDocumentKeyword),0)"; $urlSQL = "if (p_url GİBİ "%".DB::escape($key)."%",( $scoreUrlKeyword),0)"; $categorySQL = "if ((SELECT count(category.tag_id) KATEGORİSİNDEN post_category ON post_category.tag_id = kategori.tag_id NEREDE post_category.post_id = p.post_id AND kategori.name = "". DB::escape($key)."") > 0,($scoreCategoryKeyword),0)"; ) // Boşsa, 0 ekleyin if (empty($titleSQL))( $titleSQL = 0; ) eğer (boş($toplamSQL))( $toplamSQL = 0; ) if (empty($docSQL))( $docSQL = 0; ) if (empty($urlSQL))( $urlSQL = 0; ) if (boş($tagSQL))( $tagSQL = 0; ) $sql = " SELECT p.p_id,p.p_title,p.p_date_published,p.p_url, p.p_summary,p.p_content,p.thumbnail, ((-- Başlık puanı ".implode(" + ", $titleSQL). ")+ (-- Özet ".implode(" + ", $sumSQL).")+ (-- belge ".implode(" + ", $docSQL).")+ (-- etiket/kategori ".implode (" + ", $categorySQL).")+ (-- url ".implode(" + ", $urlSQL).")) alaka düzeyi olarak p gönderisinden itibaren p NEREDE p.status = "yayınlandı" alaka düzeyi > 0 SİPARİŞE GÖRE alaka düzeyi DESC,p.page_views DESC LIMIT 25"; $sonuçlar = DB::query($sql); if (!$results)( return false; ) return $sonuçlar; )
Artık search.php dosyanız şöyle görünebilir:
$term = isset($_GET["sorgu"])?$_GET["sorgu"]: ""; $search_results = arama($terim); if (!$search_results) ( echo "Sonuç yok"; çıkış; ) // Sonuçların olduğu sayfayı buraya yazdırın.
Adil miktarda içeriği işleyebilen basit bir arama algoritması oluşturduk. Her maç için keyfi olarak skoru seçtim, sizin için en uygun olana göre ayarlamaktan çekinmeyin. Ve her zaman iyileştirme için yer vardır.
Kullanıcılarınızdan gelen arama terimini izlemek iyi bir fikirdir, bu şekilde çoğu kullanıcının aynı şeyi arayıp aramadığını görebilirsiniz. Bir kalıp varsa, onlara bir gezi kaydedebilir ve kullanarak sonuçları önbelleğe alabilirsiniz. memcached.
Bu arama algoritmasını çalışırken görmek istiyorsanız, devam edin ve sayfanın üstündeki arama kutusunda bir makale aramayı deneyin. Metinde eşleşmenin bulunduğu kısmı döndürme gibi ekstra özellikler ekledim. Kendinize özellikler eklemekten çekinmeyin.
Bu makaleyi beğendin mi? Daha harikalarını okumak için abone olabilirsiniz. .
İlgili bir notta, burada bazı ilginç makaleler var.
mysql_* işlevleriyle sonsuza kadar ilgilenmenin zamanı geldi. Bu yöntemler kullanımdan kaldırılmıştır ve yavaştır. Yükseltme zamanı çoktan geçti ama hala her yerde görüyoruz. Her yazarı eğitimlerini ve bloglarını güncellemeye zorlayamadığım için, umarım daha iyi bir sıralamaya sahip olmak ve yeni gelenlere yardımcı olmak için gerekli bilgileri sağlamak için bir yazı yazmaya karar verdim.
Kendi web sitenizi yapmak çok zor olmamalı. Godaddy veya Hostgator gibi barındırma şirketleri, herkesin başlamasını çok kolaylaştırır; kod yazmadan bütün bir web sitesi oluşturmanıza izin verir. WordPress blogu Eğer aradığınız buysa hemen Godaddy.com'a gitmelisiniz.Burada işimiz bitti.Fakat öte yandan, kontrol sahibi olmak ve paylaşılan bir hosting'in eksiklikleri ile sınırlı kalmamak istiyorsanız. cüzdanınızı bozmadan doğru yere geldiniz.
Vim, terminaldeki en sevdiğim metin editörüdür. nano ve emacs ile bir süre oynadıktan sonra, sonunda sadeliği için vim ile anlaştım (lütfen benimle çıplak olun). Özelleştirilip bütün bir IDE gibi kullanılabilse de, çoğunlukla sunucularımdaki dosyaları düzenlemek ve küçük ama önemli değişiklikler yapmak için kullanıyorum. Editör savaşına girmeyelim ve başlayalım.
Yorumlar(45)
Zaryel 12 Ağustos 2015:
Ian Mustafa 26 Eylül 2015:
Soymak 29 Eylül 2015:
adeem 11 Şubat 2016:
Ivan Venediktov 9 Nisan 2016.
11.1KHerhangi bir sitedeki en popüler ve gerekli işlevlerden biri, özel bir form kullanılarak uygulanan bir aramadır. Bu işlevsellik, ziyaretçilerin ilgilendikleri içeriği sitede hızlı bir şekilde bulmalarını sağlar.
Bugün size veritabanı tablolarını sorgulayacak ve sitedeki mevcut yöneticilerle ilgili bilgileri görüntüleyecek özel bir form kullanarak sitede nasıl arama yapacağınızı anlatmak istiyoruz. Mevcut personel hakkında bilgi içeren bir veritabanı tablosunun nasıl oluşturulacağını öğreneceksiniz.
PHP ile arama formları geliştirin ve SQL'e aşina olun ( Yapılandırılmış sorgu dili) veritabanlarında bulunan bilgilerin toplanması, kaydedilmesi ve değiştirilmesi için özel bir dildir. Başlamadan önce şunları yapmanızı öneririz: proje dosyalarını indir.
neye ihtiyacın olacak
- MySQL veritabanı aracı.
- PHP destekli yerel veya uzak sunucu.
- Metin düzeltici.
Veritabanı oluşturma
Barındırma sisteminizdeki veritabanıyla başa çıkabileceğinizden tam olarak emin değilseniz, talimatlar veya yardım için ana bilgisayarla iletişime geçin. Veritabanı oluşturulduktan sonra, onu bağlamanız, bir tablo oluşturmanız ve gerekli verileri ona yazmanız gerekecektir.
En popüler MySQL yönetim aracı PHP My Admin'dir.Bu araç bugünkü rehberimiz için yeterli olacaktır.
Tablo oluştur
Tablomuz aşağıdaki formatta oluşturulmalıdır:
sütun adı | veri tipi | Uzunluk | Null veya Null Değil | birincil anahtar? | Otomatik artış |
İD | INT | 1 | Geçersiz değil | Evet | Evet |
İlk adı | Varchar | 50 | Geçersiz değil | hayır | hayır |
Soyadı | Varchar | 50 | Geçersiz değil | hayır | hayır |
E-posta | Varchar | 50 | Geçersiz değil | hayır | hayır |
Telefon numarası | Varchar | 15 | Geçersiz değil | hayır | hayır |
Bir veritabanı tablosu, tıpkı Excel'de olduğu gibi sütunlardan ve satırlardan oluşur. İlk sütun, verileri ada göre tanımlamanıza olanak tanır. Ardından, sütunda bulunan veri türünü bize gösteren Veri türleri (veri türü) sütunu gelir. Uzunluk (Uzunluk) alanında, bir tablo sütunu için maksimum bellek (depolama) miktarını gösterir. Daha fazla esneklik sağlayan değişkenler kullanıyoruz. Başka bir deyişle, tam adın uzunluğu 50 karakterden azsa, ayrılan alanın yalnızca bir kısmı işgal edilecektir.
Ve personel verileri arasında boş değerler olamaz ( boş, boş). Kimlik sütunu ana anahtarımız olduğu için ilk satır sarı renkle vurgulanmıştır. Veritabanındaki birincil anahtar, her girişin benzersiz olacağını garanti eder. Bu sütun aynı zamanda otomatik olarak artırılır, bu, veritabanımızdaki her kayda otomatik olarak benzersiz bir numara atanacağı anlamına gelir.
Tabloya personel temsilcilerini giriyoruz
Tabloyu anladıktan sonra, onu verilerle doldurmaya başlayın. İşlemi zihinde sabitlemek için 6 giriş yeterlidir. İşte kendi örneğim:
Sütun Kimliği | İlk adı | Soyadı | E-posta | Telefon numarası |
2 | Ryan | uşak | [e-posta korumalı] | 417-854-8547 |
3 | Brent | Callahan | [e-posta korumalı] | 417-854-6587 |
Form geliştirme
Google üzerinden bir site arama formu oluşturmak için uygun herhangi bir metin düzenleyiciyi açın. Ücretsiz PSPad kullanmanızı tavsiye ederim. Sözdizimi vurgulaması olan herhangi bir metin düzenleyiciyi kullanabilirsiniz. Bu, PHP kodunu yazma ve hata ayıklama sürecini büyük ölçüde kolaylaştıracaktır. Bir arama formu için bir sayfa oluştururken, onu .php formatında kaydettiğinizden emin olun, aksi takdirde PHP kodu düzgün şekilde ayrıştırılmayacaktır. Belgeyi kaydettikten sonra, aşağıdaki işaretlemeyi içine kopyalayın:
Ayrıntılı kişi arama
Adına veya soyadına göre arama yapabilirsiniz
HTML diline aşina iseniz, en azından açılış formu etiketine kadar her şey sizin için net olmalıdır. Bu etiketin içinde, tüm kodun en önemli öğesi olan action özelliği bulunur. Formumuzun eylemi olarak dosyamızın adını belirledik ve ardından sorgu dizesini uyguladık “ Git”.
Kriter kontrolü
Kullanıcı adını veya soyadını girip gönder düğmesine tıkladığında, form verileri kendisine gönderir ve sorgu dizesini ekler. Git". Bu noktada go sorgu dizesinin varlığını kontrol ediyoruz. Sonuç olumluysa, arama sonuçlarını görüntüleriz.
İstenen sonuçları görüntülemeden önce, iki kez kontrol etmemiz gerekir: (1) form gönderildi mi, (2) sorgu dizesi go değerini içeriyor mu, (3) arama terimi küçük harfle mi yoksa büyük harfle mi girildi? Kontrollerin hiçbiri olumlu sonuç vermiyorsa ( doğru), herhangi bir işlem yapmamıza gerek yoktur.
İlk olarak, kapanış etiketinden sonra site araması için küçük bir PHP kodu bloğu ekleyelim.: