2013-02-22 17 views
7

मेरे पास एक खोज फ़ॉर्म है जो उचित परिणाम वापस खींचने के लिए साइट सामग्री तालिका खोजता है।प्रासंगिकता द्वारा MySQL ऑर्डर

मैं शीर्षक और सामग्री फ़ील्ड खोजना चाहता हूं और प्रासंगिकता के क्रम में परिणामों को वापस खींचना चाहता हूं। शीर्षक को सर्वोच्च प्राथमिकता देना।

कहते हैं कि हम

intID | strTitle | txtContent 

1  | Smith John | Lorem Ipsum 
2  | Lorem Ipsum | Lorem John Smith Ipsum 
3  | John Smith | Lorem Ipsum Lorem Ipsum 
4  | Lorem Ipsum | Lorem Ipsum Lorem Ipsum 
5  | Lorem Ipsum | Lorem Ipsum Smith John 

की एक तालिका (tblContent) था और तुम "जॉन स्मिथ" के लिए खोज कर रहे थे परिणाम 3,2,1,5

कैसे के क्रम में वापस आ जाएंगे क्या यह संभव है?

+0

तालिका के अनुसार क्रमशः सुझाए गए समाधान की अनुशंसा करता हूं? – Achrome

+0

~ वर्तमान में 150 पंक्तियां। यह एक बहुत छोटी साइट है, इसलिए कभी भी 1k पंक्तियों के निकट नहीं मिलेगी – Fraser

+0

इसे देखें, शायद यह मदद कर सकता है: http://stackoverflow.com/a/35512410/1673161 –

उत्तर

16

मैं बहुत मिलता है इस के साथ स्थान पर करने में कामयाब मार्च एक अच्छी बात है लेकिन इसमें अनुक्रमित होने के लिए न्यूनतम 4 वर्णों की एक सीमा है। अल मुश्किल सीमा को बदला जा सकता है लेकिन सभी परिदृश्यों में सर्वर चर बदलना संभव नहीं है। ऐसी स्थिति में, मैं

select 
    * 
from 
mytable a 
WHERE 
    (a.title like 'somthing%' 
    OR a.title like '%somthing%' 
    OR a.title like 'somthing%') 
ORDER BY case 
WHEN a.title LIKE 'somthing%' THEN 1 
WHEN a.title LIKE '%somthing%' THEN 2 
WHEN a.title LIKE '%somthing' THEN 3 
ELSE 4 END; 
+1

मैच का अच्छा उपयोग। – Achrome

+1

क्यों, धन्यवाद :) – Fraser

+0

0.6 का उपयोग क्या ??? कृपया मुझे देखें कि मैं आरटीएम कहां कर सकता हूं। धन्यवाद – Karma

0

SELECT INT(id), strTitle, txtContent 
FROM tblContent 
WHERE name like '%John%' 
GROUP BY strTitle 
ORDER BY CASE WHEN strTitle like 'John %' THEN 0 
      WHEN strTitle like 'John%' THEN 1 
      WHEN strTitle like '% John%' THEN 2 
      ELSE 3 
     END, strTitle 
+0

समस्या यह है कि खोज मानदंड उपयोगकर्ता द्वारा आबादी से आना है खोज इनपुट ताकि सही समाधान को उस उपयोगकर्ता को फेंकने में सक्षम होने की आवश्यकता हो, – Fraser

+0

ओह ठीक है, तो डर भी नहीं, माफ करना! – Sim

4

की तर्ज पर कुछ के बारे में शायद एक अधिक कुशल तरीका और खोज स्ट्रिंग अधिक से अधिक 2 शब्द यह शायद संभव नहीं है हो सकता है यह देखते हुए भी नहीं है क्या, लेकिन मैं कुछ ऐसा करना चाहते हैं

SELECT *, 
((1.3 * (MATCH(strTitle) AGAINST ('+john+smith' IN BOOLEAN MODE))) + (0.6 * (MATCH(txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)))) AS relevance 
FROM content 
WHERE (MATCH(strTitle,txtContent) AGAINST ('+john+smith' IN BOOLEAN MODE)) 
ORDER BY relevance DESC 
+0

मुझे विचार पसंद है, लेकिन जैसा कि आप खोज का उल्लेख करते हैं, असीमित संख्या में शब्द हो सकता है क्योंकि यह एक खोज इनपुट – Fraser

+0

@ फ्रैसर से आ रहा है, आपको कभी भी असीमित कुछ भी अवसर प्रदान नहीं करना चाहिए। वैसे भी मुझे क्वेरी contatenate के साथ समस्या नहीं दिखाई दे रही है :) (आप गतिशील प्लेसहोल्डर का उपयोग कर सकते हैं, उपयोगकर्ता डेटा को गतिशील रूप से स्वच्छ कर सकते हैं और गतिशील रूप से क्वेरी को संयोजित कर सकते हैं :) –

+1

इससे बहुत कम प्रदर्शन क्वेरी होगी। – Amir

3

mysql की प्रतिलिपि प्राप्त रों:

ORDER BY CASE 
WHEN strTitle LIKE '%John Smith%' THEN 1 
WHEN txtContent LIKE '%John Smith%' THEN 2 
WHEN strTitle LIKE '%Smith John%' THEN 3 
WHEN txtContent LIKE '%Smith John%' THEN 4 
ELSE 5 END 
संबंधित मुद्दे