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).