2011-12-20 15 views
10

परिणाम MySQL में मैं की तरह कुछ कर सकते हैं:लचीला खोजें सीमा

SELECT id FROM table WHERE field = 'foo' LIMIT 5 

मेज, 10,000 पंक्तियां हैं तो इस प्रश्न के रास्ते रास्ते से अगर मैं सीमा हिस्सा बाहर छोड़ दिया तेजी है।

{ 
    "query":{ 
     "fuzzy_like_this_field":{ 
      "body":{ 
      "like_text":"REALLY LONG (snip) TEXT HERE", 
      "max_query_terms":1, 
      "min_similarity":0.95, 
      "ignore_tf":true 
      } 
     } 
    } 
} 

जब मैं यह खोज चलाने के लिए, यह एक कुछ सेकंड लेता है, जबकि mysql दूर में एक ही क्वेरी के लिए परिणाम वापस कर सकते हैं, अब तक कम समय:

ElasticSearch में, मैं निम्नलिखित मिल गया है।

यदि मैं आकार पैरामीटर (1 पर सेट) में पास करता हूं, तो यह सफलतापूर्वक केवल 1 परिणाम देता है, लेकिन अगर मैं आकार को असीमित सेट करता हूं और सभी परिणामों को वापस कर देता हूं तो क्वेरी स्वयं तेज़ी से नहीं होती है। मुझे संदेह है कि क्वेरी पूरी तरह से चल रही है और पूछताछ के बाद केवल 1 परिणाम लौटाया जा रहा है। इसका मतलब है कि "आकार" विशेषता मेरे उद्देश्यों के लिए बेकार है।

क्या कोई खोज प्राप्त करने से पहले इंडेक्स में प्रत्येक रिकॉर्ड को संसाधित करने के बजाय, एक खोज रिकॉर्ड से मेल खाने के लिए कोई भी तरीका है, जैसे ही यह एक खोज रिकॉर्ड से मेल खाता है? क्या मैं इस बारे में कुछ और मौलिक समझ रहा हूं?

अग्रिम धन्यवाद।

उत्तर

9

आप सही हैं कि क्वेरी पूरी तरह से चल रही है। स्कोर द्वारा क्रमबद्ध डिफ़ॉल्ट वापसी डेटा द्वारा क्वेरीज़, इसलिए आपकी क्वेरी प्रत्येक दस्तावेज़ को स्कोर करने जा रही है। दस्तावेज़ बताते हैं कि fuzzy query अच्छी तरह से स्केल नहीं करेगा, इसलिए अन्य प्रश्नों पर विचार करना चाहेंगे।

limit filter आपको जो भी ढूंढ रहा है उसके समान व्यवहार दे सकता है।

एक सीमा फिल्टर

पर (प्रति ठीकरा) दस्तावेजों की संख्या पर अमल करने की सीमा को दोहराने के लिए mysql field='foo' एक term filter उपयोग करके देखें। जब आप स्कोरिंग की परवाह नहीं करते हैं तो आपको फ़िल्टर का उपयोग करना चाहिए, वे तेज़ और कैश-सक्षम हैं।

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