2015-01-15 8 views
5

विशेष रूप से, मैं पेजिनेशन करने के लिए लोचदार खोज का उपयोग कर रहा हूं, लेकिन यह प्रश्न किसी भी डेटाबेस पर लागू हो सकता है।स्रोत डेटा अक्सर बदलते समय पेजिनेशन को कैसे संभालें

Elasticsearch पर from और to पैरामीटर के साथ विधियों को प्रदान करता है।

तो मैं एक प्रश्न get me the most recent data from result 1 to 10

यह अच्छा काम करता है चलाते हैं।

उपयोगकर्ता "अगले पृष्ठ" क्लिक करता है और क्वेरी है: get me the most recent data from result 11 to 20

समस्या यह है कि दो प्रश्नों के बीच के समय में, 2 नए रिकॉर्ड समर्थन डेटाबेस में जोड़ा गया है, जो पृष्ठवार परिणाम का मतलब है ओवरलैप होगा (पहले पृष्ठ से अंतिम 2 दूसरे पृष्ठ पर पहले दो के रूप में दिखाई देगा)।

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

उत्तर

5

यदि आप पहले से ही प्रासंगिक टाइमस्टैम्प को अनुक्रमणित कर रहे हैं, तो फ़िल्टर खराब विकल्प नहीं है। अपने प्रश्नों को सही ढंग से तैयार करने के लिए आपको क्लाइंट पक्ष पर उस टाइमस्टैम्प को ट्रैक करना होगा। आपको यह भी पता होना चाहिए कि इससे छुटकारा पाने के लिए कब। लेकिन वे दुर्बल समस्या नहीं हैं।

स्क्रॉल एपीआई इसके लिए एक ठोस विकल्प है, क्योंकि यह प्रभावी ढंग से Elasticsearch पक्ष पर समय पर स्नैपशॉट करता है। स्क्रॉल एपीआई का इरादा गहरी अंकन के लिए एक स्थिर खोज क्वेरी प्रदान करना है, जिसे आप अनुभव कर रहे परिवर्तन के सटीक मुद्दे से निपटना है।

आप अपनी क्वेरी और scroll पैरामीटर की आपूर्ति करके Scrolling Search शुरू करते हैं, जिसके लिए लोचदार खोज scroll_id देता है। फिर आप /_search/scroll पर उस आईडी की आपूर्ति करने के लिए अनुरोध करते हैं, जिनमें से प्रत्येक परिणाम के एक पृष्ठ को वापस भेजता है और अगले अनुरोध के लिए एक नया scroll_id देता है।

(ध्यान दें कि आप नहींscan खोज यहाँ टाइप करना चाहते हैं । यही कारण है कि दस्तावेजों को निकालने के लिए प्रयोग किया जाता है सामूहिक रूप से, और किसी भी छंटाई लागू नहीं होता।)

छानने की तुलना में, आप अभी भी है किसी मूल्य को ट्रैक करने के लिए: scroll_id परिणामों के अपने अगले पृष्ठ के लिए। चाहे टाइमस्टैम्प को ट्रैक करने से कहीं अधिक आसान हो, आपके ऐप पर निर्भर करता है।

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

Scroll API के लिए ईएस दस्तावेज उपर्युक्त सभी पर अच्छा विवरण प्रदान करता है।

नीचे पंक्ति: टाइमस्टैम्प द्वारा फ़िल्टरिंग वास्तव में एक खराब विकल्प नहीं है। स्क्रॉल एपीआई एक और वैध विकल्प है, जो एक समान उपयोग के मामले के लिए डिज़ाइन किया गया है, लेकिन इसकी कमी के बिना नहीं है।

+0

विस्तृत स्पष्टीकरण के लिए धन्यवाद। किसी कारण से, मैं सोच रहा था कि स्कैन/स्क्रॉल एक ही चीज़ थी, लेकिन यह स्पष्ट रूप से सच नहीं है! जब आपके पास फ़िल्टर करने के लिए नवीनतम टाइमस्टैम्प की तरह कुछ नहीं है तो स्क्रॉल एक अच्छी पसंद की तरह लगता है। – bradvido

+0

टाइमस्टैम्प फ़िल्टरिंग के लिए दोष यह होगा कि अगर कोई दस्तावेज़ हटाए, तो आप परिणाम के अगले पृष्ठ में वापस आने से दस्तावेज़ को छोड़ सकते हैं? स्क्रॉल एपीआई डॉक्स से – writofmandamus

+0

नोट 'स्क्रॉल वास्तविक समय उपयोगकर्ता अनुरोधों के लिए नहीं है,' – Ben

-1

आपको इसके लिए स्कैन एपीआई का उपयोग करने की आवश्यकता है। स्कैन करें और एपीआई स्क्रॉल करें, आप समय की खोज और पेजिनेशन में इंगित करते हैं। स्कैन एपीआई -

+1

स्कैन एपीआई का उपयोग करना यहां करने के लिए सही बात नहीं हो सकती है। यह परिणामों पर सॉर्टिंग लागू नहीं करता है। – bittusarkar

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