2011-09-16 20 views
7

Mysql veritabanında tam metin aramasında yaptığım arama sonuçlarını sıralayarak küçük bir sorunum var (umduğum şey). Ben denedim iki şekilde yazma:Tam metin araması sıralaması

DOĞAL YOLU:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,keywords) AGAINST('$cl_search') AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 

BOOLE YOLU:

SELECT SQL_CALC_FOUND_ROWS *, 
((MATCH(productname) AGAINST('$cl_search' IN BOOLEAN MODE))+ 
(MATCH(keywords) AGAINST('\"$cl_search\"' IN BOOLEAN MODE))) AS score 
FROM products 
WHERE MATCH(productname,keywords) AGAINST('$cl_search') 
ORDER BY score DESC,lastupdated DESC; 
Ben doğal dil modunda arama yaparken ben almak indeksleme gibi

ama nasıl yapmam iyi arama sonuçları elde etmek için birisinin "çanta poşet çanta torbası" gibi bir ürün ismi olarak girmesini önlemek?

Bu sorunu düzeltmek için boolean yolunu yazdım ancak 1. daha yavaş ve 2. Diğer sözcüklerin indekslemesini 'kelime sayısıyla karşılaştır' gibi elde edemiyorum.

Her iki dünyanın en iyisini nasıl elde edeceğinize dair herhangi bir düşünce var mı?

cevap

-3

Oldukça kolay, Lucene kullanın, çok daha gelişmiş ve kesinlikle istediğiniz şeyi işlemek için seçenekleri vardır.

1

Yinelenen anahtar kelimeleri kaldıracak kullanıcı tanımlı bir işlev yazmaktan ne haber? Sorunuz ne gibi görünüyor:

SELECT SQL_CALC_FOUND_ROWS *, 
MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') AS score 
FROM products 
    WHERE MATCH(productname,RM_DUP(keywords)) AGAINST('$cl_search') 
    ORDER BY score DESC,lastupdated DESC;