• 07-12-2010, 22:30:13
    #1
    Merhaba arkadaşlar, Yazılım dilimi geliştirmek için bir arama motoru yazıyorum (kendi çapımda) Örümcekler 1-2 aksaklık olsada bitti. Şimdi arama algoritması geliştiriyorum ama aklıma takılan bir sorun var.

    Örnek ben 3 alanda arama yapıcam (title,desc,keyword) kişi "Webmaster" diye arattığında, bu 3 ün dede arama yapacak ve alakaya göre sıralayacak. (Buraya kadar yaptım) Takıldığım nokta ise, Örnek title ye 100 üzerinden 60 önem vericem. desc e 10 ve keyword ada 30. Yani verdiğim değere göre site sıralaması yapılacak.

    Bu konu hakkında acaba bi fikri olan var mı ?

    2. Olarak

    Yaptığım örümcekler indexliyor ama bazı sitelerin title des ve keywordları karakter hatalı oluyor. Tamamen nasıl bu karakter hatalarını filtre edebilirim ?
  • 07-12-2010, 22:48:04
    #2
    Üyeliği durduruldu
    Öncelikle arama motoru yaperken veritabanı ayarlarını temiz ve anlaşılır şekilde yapmaya önem gösretim.

    meta tag almak için
    <?php
    // Assuming the above tags are at www.example.com
    $tags = get_meta_tags('http://www.example.com/');
    
    // Notice how the keys are all lowercase now, and
    // how . was replaced by _ in the key.
    echo $tags['author'];       // name
    echo $tags['keywords'];     // php documentation
    echo $tags['description'];  // a php manual
    echo $tags['geo_position']; // 49.33;-86.59
    ?>
    hazır fonksiyon var.

    diğer bir özellik ise , zincirleme link toplamak.
    site içerisindeki tüm linkler toplanır bu linkler kayıt edilirken meta bilgileri alınır.
    yani r10.net sitesine bağlandık tüm linkleri aldık ve dış bağlantı linklerinide aldık.
    extra olarak h1 h2 taglarıda alınabilir.

    karakter hataları için preg replace ve türevleri kullanılabilir regex ile sorunu en aza indirebilirsiniz.

    sizde ufak bir algoritma kurarak sitelere belirli önem verebilirsiniz.
    mesela title şu kurala uyuyorsa 10 , uymuyorsa 5 vs vs

    sıralama yaparken verilen sıraya göre listelersiniz.
  • 07-12-2010, 23:23:43
    #3
    BHCoder adlı üyeden alıntı: mesajı görüntüle
    Öncelikle arama motoru yaperken veritabanı ayarlarını temiz ve anlaşılır şekilde yapmaya önem gösretim.

    meta tag almak için
    <?php
    // Assuming the above tags are at www.example.com
    $tags = get_meta_tags('http://www.example.com/');
    
    // Notice how the keys are all lowercase now, and
    // how . was replaced by _ in the key.
    echo $tags['author'];       // name
    echo $tags['keywords'];     // php documentation
    echo $tags['description'];  // a php manual
    echo $tags['geo_position']; // 49.33;-86.59
    ?>
    hazır fonksiyon var.

    diğer bir özellik ise , zincirleme link toplamak.
    site içerisindeki tüm linkler toplanır bu linkler kayıt edilirken meta bilgileri alınır.
    yani r10.net sitesine bağlandık tüm linkleri aldık ve dış bağlantı linklerinide aldık.
    extra olarak h1 h2 taglarıda alınabilir.

    karakter hataları için preg replace ve türevleri kullanılabilir regex ile sorunu en aza indirebilirsiniz.

    sizde ufak bir algoritma kurarak sitelere belirli önem verebilirsiniz.
    mesela title şu kurala uyuyorsa 10 , uymuyorsa 5 vs vs

    sıralama yaparken verilen sıraya göre listelersiniz.
    İlk önce yardımınız için çok teşekkürler, Peki sorumu biraz daha değiştireyim Peki 10 üzerinden puanlama yaptım diyelim, Arama yapıldığında o adresin aldığı puanı nasıl sıralamaya katabilirim ?

    + Önerdiğiniz başka şeyler var ise dinlemek isterim.
  • 08-12-2010, 01:23:53
    #4
    Arkadaşlar yatmaya gidiyorum, Arama motoru konusunda önerisi veya Tecrübesi olan var ise konu altından veya ö.m ile yardımcı olursa çok sevinirim.
  • 08-12-2010, 02:49:28
    #5
    1. Bu sıralama işlemini direkt SQL sorgusu ile de yapabilirsiniz. MySQL da bir sürü string fonksiyonları vardır (bkz. http://dev.mysql.com/doc/refman/5.0/...functions.html). Select kısmında gerekli işlemleri yaparak order by ile istediğiniz gibi sıralayabilirsiniz.

    2. Yok ben veriler tek tek çekiyorum. Sıralamayı PHP ile yapmak istiyorum derseniz. Alttaki örnek fonksiyonu kullanabilirsiniz. Veri yapınızın uyacağını umuyorum

    /* db den çekilen ve puan verilen veriler */
    $data = array(
    
    	/* 1. veri */
    	array(
    		'title' => 'Title bir',
    		'site' => 'Site bir',
    		'point' => 4,
    	),
    
    	/* 2. veri */
    	array(
    		'title' => 'Title iki',
    		'site' => 'Site iki',
    		'point' => 2,
    	),
    
    	/* 3. veri */
    	array(
    		'title' => 'Title üç',
    		'site' => 'Site üç',
    		'point' => 9,
    	),
    
    );
    
    // http://www.php.net/manual/en/function.sort.php#99700
    function array_sort($array, $on, $order='SORT_DESC')
    {
      $new_array = array();
      $sortable_array = array();
    
      if (count($array) > 0) {
    	  foreach ($array as $k => $v) {
    		  if (is_array($v)) {
    			  foreach ($v as $k2 => $v2) {
    				  if ($k2 == $on) {
    					  $sortable_array[$k] = $v2;
    				  }
    			  }
    		  } else {
    			  $sortable_array[$k] = $v;
    		  }
    	  }
    
    	  switch($order)
    	  {
    		  case 'SORT_ASC':
    			  asort($sortable_array);
    		  break;
    		  case 'SORT_DESC':
    			  arsort($sortable_array);
    		  break;
    	  }
    
    	  foreach($sortable_array as $k => $v) {
    		  $new_array[] = $array[$k];
    	  }
      }
      return $new_array;
    }
    
    
    echo '<pre>';
    print_r(array_sort($data, 'point', 'SORT_DESC'));
  • 08-12-2010, 08:41:40
    #6
    Şöyle yapabilirsin sanırım. Siteyi botlar indexlerken title ı alır. Kelimelere böler. sonra bu kelimeleri birerli, ikişerli, üçerli kombinasyonlar halinde descriptionda, keywordsde, metin içinde arar.
    Titlede zaten bulunacaktır. 60 standart puanla başlar fonksiyon, descriptionda aynı kelime ya da kelime grubu aynı şekilde geçiyorsa 10 puan daha, keywordsde geçiyorsa 30 puan daha, metin içinde strong tagi ile geçiyorsa 5 puan daha, i tagi ile geçiyorsa 3 puan daha underline ise puan daha gibi başka puan türleri de ekleyebilirsin. Çünkü değişkeni ne kadar çok tutarsa 2 sitenin aynı puanı alma şansıo o kadar azalır. Sonra siteye whois çekip site yaşına göre belirlediğin bir sabitin olur. Mesela 5 yaşından büyükse sabitin 1 olur, 3-5 yıl arası ise 0,85 olur, 1-3 arası ise 0,75 olur, 6-12 arası 0,50 olur, 3-6 ay arası 0,40 olur, 1-3 ay arası 0,20 olur. O kelime ya da kelime grubu ile ilgili title description keywords ve metinden alınan puanı site yaşından gelecek sabitle çarparsın. Çıkan puanı, aranan kelime, site, sayfa bilgileri ile veritabanına yazarsın. Arama yapıldığında arana kelime tablosundaki indexten aratır puana göre sıralatırsın.