Arama sonuçları sıralama için SQL yardıma ihtiyacınız var

0 Cevap php

Ben mysql kullanarak küçük bir egzersiz arama motoru oluşturmak için çalışıyorum.

Her bir egzersiz arama etiketleri keyfi bir sayıda olabilir.

İşte benim veri yapısıdır:

TABLE exercises
  ID
  title

TABLE searchtags
  ID
  title

TABLE exerciseSearchtags
  exerciseID -> exercises.ID
  searchtagID -> searchtags.ID

... ExerciseSearchtags egzersizleri ve searchtags arasındaki ilişkiyi ifade eden tablo katılmak birçok bir çok olduğu.

Arama motoru kullanıcı girilen anahtar kelime sayısı bilinmeyen kabul eder.

Ben anahtar kelime / searchtag maç sayısına göre arama sonuçlarını sıralamak istiyorum.

İşte şu anda egzersizleri seçmek için kullanıyorum sql. OLGU kurallar ve NEREDE kurallar hem de dinamik, her anahtar kelime için bir oluşturulur. Bir kullanıcı 3 anahtar kelime girerse Yani, örneğin,, 3 CASE kurallar ve 3 olacak NEREDE kuralları.

    SELECT 
        exercises.ID AS ID,
        exercises.title AS title, 
        (
            (CASE WHEN searchtags.title LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END)+
            (CASE WHEN searchtags.title LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END)+
            ...etc...
            (CASE WHEN searchtags.title LIKE CONCAT('%',?,'%') THEN 1 ELSE 0 END)
        ) AS relevance

    FROM 
        exercises

    LEFT JOIN exerciseSearchtags
        ON exerciseSearchtags.exerciseID = exercises.ID 

    LEFT JOIN searchtags
        ON searchtags.ID = exerciseSearchtags.searchtagID

    WHERE
        searchtags.title LIKE CONCAT('%',?,'%') OR
        searchtags.title LIKE CONCAT('%',?,'%') OR
        ...etc...
        searchtags.title LIKE CONCAT('%',?,'%') 

    GROUP BY 
        exercises.ID                

    ORDER BY 
        relevance DESC

Bu almost çalışır. Ancak sonuçlar, beklediğiniz sırayla sıralanmıyorsa.

Bu neden oluyor olarak benim en iyi tahminim, satırlar exercise.ID göre gruplandırılmış ÖNCE relevence puan hesaplanır ediliyor olmasıdır. Sol nedenlerini sonuç sette 10 kez görünür belirli bir egzersiz, ve 4 kez görünmesi için başka bir egzersiz katılmak, o zaman ilk egzersiz daha fazla anahtar kelime / searchtag sonuç yok olsa bile, daha yüksek bir relevence puan alabilirsiniz.

Herkes Bunu önlemek konusunda herhangi bir öneri / tavsiye var mı / düzeltebilirim?

Yardımlarınız için teşekkürler (peşin).

0 Cevap