2008-09-06 15 views
9

मेरे पास एक वेबपैप विकास समस्या है जिसके लिए मैंने एक समाधान विकसित किया है, लेकिन मैं उन अन्य विचारों को ढूंढने की कोशिश कर रहा हूं जो कुछ प्रदर्शन मुद्दों के आसपास हो सकते हैं।कैसे करें: रैंकिंग खोज परिणाम

समस्या बयान: कई कीवर्ड्स/टोकन मैचों के लिए

  • आवेदन खोजें

    • है, जो उपयोगकर्ता टोकन
    • प्रत्येक टोकन
      • यानी के लिए एक परिणाम की जरूरत के लिए, एक प्रवेश करता है, तो 3 टोकन हैं, मुझे एंट्री आईडी 3 बार
    • भाग गया टोकन मैच के लिए
      • असाइन एक्स अंक k परिणाम
      • तरह प्रवेश बिंदुओं के आधार पर आईडी
      • अगर अंक मान रहे हैं सॉर्ट करने के लिए एक ही है, उपयोग तारीख परिणाम

    क्या मैं ऐसा करने में सक्षम होना चाहते हैं, लेकिन पता नहीं लगाया गया है, 1 क्वेरी भेजना है जो किसी() के परिणामों के समान कुछ देता है, लेकिन प्रत्येक प्रविष्टि आईडी के लिए प्रत्येक टोकन मैचों के लिए एक डुप्लिकेट एंट्री आईडी देता है।

    क्या मैं कर रहा हूं उससे अधिक करने के लिए एक बेहतर तरीका है, एकाधिक प्रश्नों का उपयोग करने के लिए प्रति प्रश्न एक प्रश्न चल रहा है? यदि हां, तो उनको लागू करने का सबसे आसान तरीका क्या है?

    संपादित
    मैं पहले से ही प्रविष्टियों tokenized किया है, इसलिए, उदाहरण के लिए, "स्थान रन देख" 1 का एक प्रविष्टि आईडी है, और तीन टोकन, 'देख', 'स्पॉट', 'रन', और उन एक अलग टोकन तालिका में कर रहे हैं, प्रवेश के साथ उनके काम का आईडीएस तो तालिका इस प्रकार दिखाई देंगे:

    'see', 1 
    'spot', 1 
    'run', 1 
    'run', 2 
    'spot', 3 
    
  • उत्तर

    6

    आप MySQL में यूनियन सभी 'का उपयोग कर एक क्वेरी में इस हासिल कर सकते हैं।

    बस PHP में टोकन सभी प्रत्येक टोकन के लिए एक संघ बनाने के माध्यम से लूप:

    जैसे टोकन हैं, तो 'एक्स', 'y' और 'z' आपकी क्वेरी कुछ इस

    SELECT * FROM `entries` 
    WHERE token like "%x%" union all 
        SELECT * FROM `entries` 
        WHERE token like "%y%" union all 
         SELECT * FROM `entries` 
         WHERE token like "%z%" ORDER BY score ect... 
    
    दिखाई दे सकता है

    ऑर्डर क्लॉज पूरे परिणाम सेट पर एक के रूप में काम करना चाहिए, जो आपको चाहिए।

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

    +0

    @rmbarnes - जहां उन यूनिअन ऑप्स मैं db मूल बातें वर्षों में देखा वापस अचानक मतलब यह होना चाहिए; मैं यह सुनिश्चित करने के लिए एक प्रदर्शन रन दे दूंगा कि यह कुल गति – warren

    +0

    में तुलना कैसे करता है बस यूनियन का उपयोग न करें, न केवल यूनियन, अन्यथा मुझे नहीं लगता कि आपको वही आईडी के साथ कई पंक्तियां मिलेंगी जैसे आप चाहते हैं। - rmbarnes 6 सितंबर 08 को 20:23 बजे – warren

    1

    आप यूनिअन सभी पैटर्न आप भी आपकी क्वेरी के लिए निम्न भागों शामिल करना चाहें उपयोग कर रहे हैं:

    SELECT COUNT(*) AS C 
    ... 
    GROUP BY ID 
    ORDER BY c DESC 
    

    हालांकि यह एक बहुत तुच्छ उदाहरण यह आप के लिए मैचों की आवृत्ति प्राप्त करता है प्रत्येक परिणाम और यह शुरू करने के लिए एक छद्म रैंक हो सकता है।

    0

    यदि आप किसी डेटाबेस की बजाय खोज कार्यों के लिए डिज़ाइन की गई डेटा संरचना का उपयोग करते हैं तो आपको शायद बेहतर प्रदर्शन मिलेगा। उदाहरण के लिए, आप inverted index बनाने की कोशिश कर सकते हैं। हालांकि, इसे स्वयं लिखने के बजाय, आप Lucene जैसे कुछ भी देखना चाहते हैं जो आपके लिए अधिकांश काम करता है।

    3

    मुझे पता है कि यह पर पूछे जाने वाले प्रश्न का सख्ती से जवाब नहीं है, लेकिन यदि आपकी तालिका लाखों पंक्तियों के बजाय हजारों है, तो यहां जाने के लिए एक FULLTEXT समाधान सबसे अच्छा तरीका हो सकता है।

    MySQL में जब आप अपने अनुक्रमित कॉलम पर MATCH का उपयोग करते हैं, तो आपके द्वारा प्रदान किए जाने वाले प्रत्येक कीवर्ड को एक प्रासंगिकता स्कोर दिया जाएगा (प्रत्येक कीवर्ड का उल्लेख किए जाने की संख्या के आधार पर गणना की जाएगी) जो आपकी विधि से अधिक सटीक होगा और निश्चित रूप से अधिक प्रभावशाली होगा एकाधिक खोजशब्दों के लिए।

    यहाँ देखें: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

    संबंधित मुद्दे