• 26-03-2010, 18:46:45
    #1
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Merhaba, basit bir konuda fikir ve tecrübelerinize ihtiyacım var.


    Klasik etiket(tag) sisteminde, basit gibi görünen bir arama işlemi yapıyorum


    aradığım örnek kelime yat

    örnek kelime sadece başta, ortada ve sonda geçebiliyor, örnek kelime boşluk içerebiliyor.("motor yat" gibi)



    (kelime ortada ise ", kelime, " yani virgülboşlukkelimevirgülboşluk diye geçebiliyor)


    tabloda satırlarında içerikleri şöyle;

    yat, ara, bul, gel, getir
    ara, bul, gel, yat, getir
    ara, bul, gel, getir, yat
    
    yatak, ara, bul, gel, getir
    ara, bul, gel, yatak, getir
    ara, bul, gel, getir, yatak
    
    bayat, ara, bul, gel, getir
    ara, bul, gel, bayat, getir
    ara, bul, gel, getir, bayat
    ...şeklindeki satırlarda ben sadece yat kelimeleri olanları bulmalıyım,
    yatak, bayat ları bulmamalıyım.


    SELECT kelimelerkolonu 
    FROM `tablo`
    WHERE (
    kelimelerkolonu LIKE 'yat'
    OR kelimelerkolonu LIKE 'yat, %'
    OR kelimelerkolonu LIKE '%, yat, %'
    OR kelimelerkolonu LIKE '%, yat'
    );
    sorgusu ile istediğimi istediğim şekilde buluyorum satır sayısı epey fazla olduğu için bu sorgu ağır ama sağlam çalışıyor.

    aynı sorguyu regexp ile buluyorum tabi bu yukarıdakine göre çok daha ağır çalışıyor.

    Fulltext arama konusunda epey kafa yorduğum halde gördüğüm kadarıyla burada fulltext işime yaramıyor zaten bahsi geçen tablo çok sık güncellendiği için doğası gereği fulltext yarardan çok zarar getiriyor.

    Geçici tablo açıp işi daha da uzun işlemlerle büyütmek de istemiyorum.


    Etiket sistemini değiştirip, örneğin "_yat__ara__bul haydi__gel gel__getir_" gibi yaparsam tek aramada aranan kelime _yat_ diyerek bulabiliyorum, başında sonunda ortasında geçmesi sorunu kalktığından 4 yerine 1 like kullanıyorum ki bu en makul görünen çözüm fakat daha kolay bir yöntem olmalı.


    Farklı bir yöntem ile de bu işin yapılabileceğini düşünüyorsanız lütfen fikrinizi yazın.
  • 26-03-2010, 19:58:52
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Arkadaşım bence en iyi yöntem eklerken belirleyici bir karakter arasında ekle. Misal sqle:

    |yat|ara|bul|gel|yatak|bayat|getir|
    olarak ekle, daha sonra:

    select kelimelerkolonu from `tablo` where  kelimelerkolonu like "%|yat|%"
    şeklinde rahatlıkla alabilirsin. İşlerken de explode ve implode vs. ile rahatlıkla işlemini yaparsın.
  • 27-03-2010, 01:13:20
    #3
    arkadaşlar aramalarda LIKe kullanmayın daha önce yazmıştım sanırım bunun hakkında ama bulamadım hem server yorucu hem de etkili değil.
    Aramalar için FULL_TEXT_INDEX search kullanın. bunun için arama yapacağınız sütün veya sütünları fulltextindex yapmalısınız daha sonra alakaya göre istediğiniz şekilde sıralayabilirsiniz hem de LIKE ın server yoruculuğundan kurtulursunuz.
    bunuda aşağıdaki gibi yapabilirsiniz.

    ALTER TABLE articles ADD FULLTEXT(body, title);
  • 27-03-2010, 01:38:47
    #4
    @hakimi;
    like için etkili değilden kastınızı anlamadım, mesajımda bahsi geçen bu işlemde fulltexti neden kullanmadığımı ve 4 like ile etkili(!?) sonuç bulduğumu yazmışım.

    Tam olarak hatırlayamasam da bildiğim kadarıyla her veri girişinde, mysql - fulltext için ürettiği index i tekrardan üretiyor, veya bunun gibi birşey yapıyor. (mysql5 ile işler değişmiş olabilir, araştırıyorum)
    Bahsi geçen tabloda yüzbinlerce kayıt var ve sürekli güncelleniyor/kayıt ekleniyor... Ayrıca bazı durumlarda ft_min değeriyle de oynamam 1 2 ye indirmem de gerekebiliyor...


    Velhasıl, gördüğüm kadarıyla farklı bir yöntem mevcut değil ve en kolayı kelimeleri
    (kelime1)(kelime2)(kelime evet3)(kelime4) gibi hatta
    @metadige önerisi gibi tutup ve aramada da buna göre davranmak.
  • 27-03-2010, 01:57:47
    #5
    bak şimdi ben like la da çalıştım fulltext ile de çalıştım. ikisiyle de ağır bir arama yaptırt ve sayfanın oluşturulma sürelerine bak. ona göre kararını sen ver.

    indexler mysql için vaz geçilmezlerdir. zaten işe yarmasa bunu + bir özellik olarak koymazlar.
    >Bir başkası ise sorguyu alaka düzeyine göre sıralaya biliyorsun. as score order by score diyerek en alakalıdan alakasıza göre sıralayabiliyorsun. işte senin aramak yapmak istediğini full text ile tam olarak yapabiliyorsun. biraz araştır derim.
    Ama yinede sen bilirsin deyince kavaga çıkmazmış
  • 27-03-2010, 02:16:48
    #6
    kavga çıkmaz, ben de fulltext kullanmaya özen gösteriyorum faydaları ve farkları tartışılmaz, fakat bu işlemde durum biraz farklı,
    sorumda da demek istediğim şu an aradığımı 4 like ile istediğim gibi bulduğumu, daha az işlemle buldurmaya çalışıyorum.

    Ayrıca fulltext indexi derken mysql indexlerinden bahsetmiyordum,
    Fulltext için oluşturulan, yine bu mysql index yapısına benzeyen bir şey olduğunu ve sık güncellenen veritabanları için fulltexti kullanmamak gerektiğini çünkü bu indexleme işini üzerine eklemek yerine tekrar tekrar yaptığını biliyorum.