MySQL

2008-12-28 11 views
6

में एक पंक्ति में एक शब्द की गणना की घटनाएं मैं अपनी वेबसाइट के लिए एक खोज फ़ंक्शन कर रहा हूं, जो डेटाबेस से प्रासंगिक परिणाम पाता है। मैं एक शब्द की घटनाओं की गिनती करने का एक तरीका ढूंढ रहा हूं, लेकिन मुझे यह सुनिश्चित करने की ज़रूरत है कि शब्द के दोनों किनारों पर शब्द सीमाएं हों (इसलिए जब मैं "चीर" चाहता हूं तो मैं "ट्रिपल" के साथ समाप्त नहीं होता)।MySQL

क्या किसी के पास कोई विचार है?


लोग मेरे सवाल का गलत समझा है:

मैं एक ही पंक्ति के भीतर इस तरह के आवृत्तियां की संख्या की गणना कैसे कर सकते हैं?

उत्तर

2

यह ऐसी चीज नहीं है जो संबंधपरक डेटाबेस बहुत अच्छे हैं, जब तक कि आप फुलटेक्स्ट इंडेक्सिंग का उपयोग नहीं कर सकते, और आपने पहले ही कहा है कि आप नहीं कर सकते हैं, क्योंकि आप इनो डीबी का उपयोग कर रहे हैं। मैं सुझाव देता हूं कि आप अपनी प्रासंगिक पंक्तियों का चयन करें और अपने आवेदन कोड में शब्द गिनती करें।

0

इस तरह काम करना चाहिए: मेज से जहां FIELDNAME regexp '[[: <:]] शब्द [[:>:]]'

चयन गिनती (*);

गोरी विवरण MySQL मैनुअल, सेक्शन 11.4.2 में हैं।

+2

यह जाँच करता है कि कितने पंक्तियों खोज स्ट्रिंग शामिल मदद करता है। प्रश्नकर्ता यह जानना चाहता है कि प्रत्येक पंक्ति में खोज स्ट्रिंग कितनी बार निहित होती है। – flu

0

कुछ पसंद या REGEXP स्केल नहीं करेगा (जब तक कि यह एक बाएं सबफ़िक्स मैच न हो)।

इसके बजाय fulltext index का उपयोग करने के लिए विचार करें कि आप क्या करना चाहते हैं।

select count(*) from yourtable where match(title, body) against ('some_word'); 
+0

फुलटेक्स्ट इंडेक्स नहीं कर सकता ... मैं इनो डीबी का उपयोग कर रहा हूं। – stalepretzel

0

मैंने नीचे दिए गए लिंक में वर्णित तकनीक का उपयोग किया है। विधि length और replace MySQL के कार्यों का उपयोग करती है।

Keyword Relevance

1

आप इस विकृत तरह से कोशिश कर सकते हैं:

SELECT 
(LENGTH(field) - LENGTH(REPLACE(field, 'word', '')))/LENGTH('word') AS `count` 
ORDER BY `count` DESC 
  • इस क्वेरी बहुत धीमी गति से
  • यह बहुत बदसूरत
  • REPLACE लग रहा है हो सकता है() केस-संवेदी है
+0

यह * स्ट्रिंग्स *, * शब्द * की गणना नहीं करेगा। – RandomSeed

1

LOWER() का उपयोग कर आप mysql के केस-संवेदी REPLACE() फ़ंक्शन के मुद्दे को दूर कर सकते हैं।

इसकी मैला, लेकिन मेरे अंत में यह क्वेरी बहुत तेज चलती है।

चीजों को गति देने के लिए मैं परिणाम में पुनर्प्राप्ति को पुनर्प्राप्त करता हूं जिसे मैंने अपनी 'बाहरी' क्वेरी में व्युत्पन्न तालिका के रूप में घोषित किया है। चूंकि mysql के पास पहले से ही इस बिंदु पर परिणाम हैं, प्रतिस्थापन विधि बहुत तेज़ी से काम करती है।

मैंने एकाधिक तालिकाओं और एकाधिक कॉलम में एकाधिक शर्तों की खोज के लिए नीचे दिए गए एक जैसा प्रश्न बनाया है।मैं प्राप्त सभी स्तंभों में सभी पाया खोज शब्दों के occurrances की गिनती की राशि के लिए एक 'प्रासंगिकता' संख्या बराबर की खोज

SELECT DISTINCT ( 
((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('there'),'')))/length('there')) 
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('there'),'')))/length('there')) 
+ ((length(x.ent_title) - length(replace(LOWER(x.ent_title),LOWER('another'),'')))/length('another')) 
+ ((length(x.ent_content) - length(replace(LOWER(x.ent_content),LOWER('another'),'')))/length('another')) 
) as relevance, 
x.ent_type, 
x.ent_id, 
x.this_id as anchor, 
page.page_name 
FROM ( 
(SELECT 
'Foo' as ent_type, 
sp.sp_id as ent_id, 
sp.page_id as this_id, 
sp.title as ent_title, 
sp.content as ent_content, 
sp.page_id as page_id 
FROM sp 
WHERE (sp.title LIKE '%there%' OR sp.content LIKE '%there%' OR sp.title LIKE '%another%' OR sp.content LIKE '%another%') AND (sp_content.title NOT LIKE '%goes%' AND sp_content.content NOT LIKE '%goes%') 
) UNION (
    [search a different table here.....] 
) 
) as x 
JOIN page ON page.page_id = x.page_id 
WHERE page.rstatus = 'ACTIVE' 
ORDER BY relevance DESC, ent_title; 

आशा इस मदद करता है किसी को

- सीक्रेस्ट बाहर

+0

यह * स्ट्रिंग *, * शब्द * की गणना नहीं करेगा। – RandomSeed

-3

यह आप जिस डीबीएमएस का उपयोग कर रहे हैं उस पर निर्भर करता है, कुछ यूडीएफ लिखने की अनुमति देते हैं जो ऐसा कर सकते हैं।

0

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

यह MySQL के साथ (कुछ हद तक) एकीकृत भी कर सकता है।

1

इस तरह एक उपयोगकर्ता परिभाषित समारोह बना सकते हैं और अपने प्रश्न में इसका इस्तेमाल

DELIMITER $$ 

CREATE FUNCTION `getCount`(myStr VARCHAR(1000), myword VARCHAR(100)) 
    RETURNS INT 
    BEGIN 
    DECLARE cnt INT DEFAULT 0; 
    DECLARE result INT DEFAULT 1; 

    WHILE (result > 0) DO 
    SET result = INSTR(myStr, myword); 
    IF(result > 0) THEN 
     SET cnt = cnt + 1; 
     SET myStr = SUBSTRING(myStr, result + LENGTH(myword)); 
    END IF; 
    END WHILE; 
    RETURN cnt;  

    END$$ 

DELIMITER ; 

आशा है कि यह Refer This