2016-02-04 2 views
52

हम Elasticsearch 2.1 से जानकारी पुनर्प्राप्त करते हैं और उपयोगकर्ता को परिणामों के माध्यम से पृष्ठ पर जाने की अनुमति देते हैं।लोचदार खोज 2.1: परिणाम खिड़की बहुत बड़ी है (index.max_result_window)

परिणाम खिड़की, बहुत बड़ा है से + आकार से कम या बराबर को होना चाहिए: [10000], लेकिन था [10020] उपयोगकर्ता हम निम्न त्रुटि संदेश मिलता है एक उच्च पेज नंबर अनुरोध करता है। बड़े डेटा सेट का अनुरोध करने के लिए अधिक कुशल तरीके के लिए स्क्रॉल एपीआई देखें। यह सीमा को बदलने के द्वारा स्थापित किया जा सकता [index.max_result_window] सूचकांक स्तर पैरामीटर

लोचदार दस्तावेज का कहना है कि इस उच्च स्मृति की खपत की वजह से है और स्क्रॉल एपीआई का उपयोग करने:

मान उच्च प्रति खोज और प्रति शार्ड खोज को निष्पादित करने के लिए हीप मेमोरी के महत्वपूर्ण भाग का उपभोग कर सकते हैं। यह के रूप में यह एक प्रयोग किसी के लिए स्क्रॉल एपीआई गहरी स्क्रॉल https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits

है इस मूल्य छोड़ने के लिए सबसे सुरक्षित है बात यह है कि मैं बड़े डेटा सेट को पुनः प्राप्त करने नहीं करना चाहती। मैं केवल डेटा सेट से एक टुकड़ा पुनर्प्राप्त करना चाहता हूं जो परिणाम सेट में बहुत अधिक है। इसके अलावा स्क्रॉल दस्तावेज कहते हैं:

स्क्रॉल वास्तविक समय उपयोगकर्ता के लिए इरादा नहीं है का अनुरोध करता है https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html

यह मैं कुछ सवालों के साथ छोड़ देता है:

1) स्मृति की खपत वास्तव में कम होगा (किसी भी यदि ऐसा है तो क्यों) यदि मैं परिणाम 10000-10020 के लिए "सामान्य" खोज अनुरोध करने के बजाय परिणाम 10020 (और 10000 से नीचे सब कुछ की उपेक्षा) तक स्क्रॉल करने के लिए स्क्रॉलिंग एपीआई का उपयोग करता हूं?

2) ऐसा प्रतीत नहीं होता है कि स्क्रॉलिंग एपीआई मेरे लिए एक विकल्प है लेकिन मुझे "index.max_result_window" बढ़ाना है। क्या किसी को इसका कोई अनुभव है?

3) क्या मेरी समस्या का समाधान करने के लिए कोई अन्य विकल्प हैं?

उत्तर

15

गहरी पेजिंग के बारे में लोचदार प्रलेखन बात में अगले पन्नों:

https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

अपने दस्तावेज़ों के आकार, के टुकड़े की संख्या, और हार्डवेयर आप उपयोग कर रहे के आधार पर, पेजिंग 10,000 से 50,000 परिणाम (1,000 से 5,000 पृष्ठों) गहराई पूरी तरह से करने योग्य होना चाहिए। लेकिन मानों से काफी बड़े के साथ, सीपीयू, मेमोरी और बैंडविड्थ की विशाल मात्रा का उपयोग करके सॉर्टिंग प्रक्रिया वास्तव में बहुत भारी हो सकती है। इस कारण से, हम दृढ़ता से गहरी पेजिंग के खिलाफ सलाह देते हैं।

+0

तो यहां, हमें गहरी अंकन छोड़ देना चाहिए, है ना? असल में एक दर्शक के लिए पेजिंग 4000 पृष्ठों का कोई अर्थ नहीं है। आइए कहें, Google खोज, परिणाम की जांच करने के लिए शायद ही हम पृष्ठ 8 या 9 तक स्क्रॉल करते हैं। आम तौर पर हम केवल शीर्ष 3-5 पृष्ठों का ख्याल रखते हैं जो Google हमें देता है। – dotslash

+2

क्या हमें गहरी अंकन की आवश्यकता होने पर स्क्रॉल एपीआई का उपयोग कर सकते हैं? –

+2

लेकिन जब हम सॉर्ट सुविधा सक्षम करते हैं, तो ई-कॉमर्स साइट पर कहें। जब उपयोगकर्ता उच्चतम मूल्य वाले आइटम देखना चाहता है। परिणाम तब अलग होंगे जब हम सबसे कम कीमत से क्रमबद्ध करते हैं जब हम निम्नतम पृष्ठ से क्रमबद्ध होते हैं लेकिन अंतिम पृष्ठ पर जाते हैं? चूंकि हम परिणाम की संख्या को सीमित कर सकते हैं। इसके लिए कोई काम? –

55

आप बड़े गहरे पृष्ठांकन की जरूरत है, मुझे लगता है कि समाधान का केवल एक ही संस्करण मूल्य max_result_window

curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "index" : { "max_result_window" : 500000 } }' 

स्मृति के उपयोग में वृद्धि, मैं ~ 100k

+0

मेरे पास एक ही त्रुटि है '' परिणाम विंडो बहुत बड़ी है, + आकार से कम या बराबर होना चाहिए: [10000] लेकिन [471 9 0] था। बड़े डेटा सेट का अनुरोध करने के लिए एक अधिक कुशल तरीके से स्क्रॉल एपीआई देखें। यह सीमा [index.max_result_window] अनुक्रमणिका स्तर पैरामीटर को बदलकर सेट की जा सकती है। ')' यह कहा गया है कि इसमें 4719 पृष्ठ हैं (प्रत्येक पृष्ठ 10 परिणाम)। और मुझे लगता है कि आपका सुझाव काम करता है। – dotslash

+0

यह 500000 – Ezzat

+1

से कम दस्तावेजों की छोटी मात्रा के लिए एक अच्छा समाधान है, मैं ES v2.2.0 का उपयोग कर रहा हूं और मुझे काम करने के लिए पेलोड को '{" max_result_window ": 500000}' में बदलना पड़ा। तो कर्ल कमांड बन गया - 'curl -XPUT" http: // localhost: 9200/my_index/_settings "-d '{" max_result_window ": 500000}'' –

2
के मूल्यों के लिए नहीं मिला है बढ़ाने के लिए है

10000 से अधिक परिणाम प्राप्त करने के लिए स्क्रॉल API का उपयोग करें।

Scroll example in ElasticSearch NEST API

मैं इसे इस तरह इस्तेमाल किया है:

private static Customer[] GetCustomers(IElasticClient elasticClient) 
{ 
    var customers = new List<Customer>(); 
    var searchResult = elasticClient.Search<Customer>(s => s.Index(IndexAlias.ForCustomers()) 
          .Size(10000).SearchType(SearchType.Scan).Scroll("1m")); 

    do 
    { 
     var result = searchResult; 
     searchResult = elasticClient.Scroll<Customer>("1m", result.ScrollId); 
     customers.AddRange(searchResult.Documents); 
    } while (searchResult.IsValid && searchResult.Documents.Any()); 

    return customers.ToArray(); 
} 
-5

मुख्य कारण आपको यह त्रुटि हो रही है - क्योंकि आप एक गलत तरह से लोचदार खोज का उपयोग कर रहे हो गया। ईएस एक खोज इंजन है। यह आपके डेटा के कई तत्व या कई पृष्ठों को प्राप्त करने में प्रभावी नहीं है। हो सकता है कि आप अपने सभी डेटा को लोचदार खोज के साथ संचालित करने की कोशिश कर रहे हों, न केवल प्रासंगिक परिणाम खोजें? यह गलत है

तो, आपको इसे खोज के लिए उपयोग करना चाहिए। और जैसा कि मुझे लगता है, 10 000 से अधिक परिणाम आइटम प्राप्त करना आवश्यक नहीं है। उदाहरण के लिए Google केवल पहले 1000 परिणाम देता है।

0

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

0

2) ऐसा प्रतीत नहीं होता है कि स्क्रॉलिंग एपीआई मेरे लिए एक विकल्प है लेकिन मुझे "index.max_result_window" बढ़ाना है। क्या किसी को इसका कोई अनुभव है?

-> आप इंडेक्स टेम्पलेट्स में इस मान को परिभाषित कर सकते हैं, तो टेम्पलेट केवल नए इंडेक्स के लिए लागू होगा, इसलिए आपको टेम्पलेट बनाने के बाद या पुराने डेटा में लोचदार होने के लिए नए इंडेक्स को हटाना होगा।

{ "आदेश": 1, "टेम्पलेट": "index_template *", "सेटिंग": { "index.number_of_replicas": "0", "index.number_of_shards": "1", "index.max_result_window": 2147483647 },

9

सही समाधान स्क्रॉलिंग का उपयोग करना होगा।Dev Tools को

जाओ और सिर्फ पोस्ट अपने सूचकांक के लिए निम्न (your_index_name), specifing नया होगा क्या:
हालांकि, अगर आप परे 10,000 परिणाम परिणाम search रिटर्न का विस्तार करना चाहते हैं, आप इसे आसानी से Kibana साथ कर सकते हैं

: अधिकतम परिणाम खिड़की

enter image description here

PUT your_index_name/_settings 
{ 
    "max_result_window" : 500000 
} 

सब कुछ ठीक है, तो आप निम्नलिखित सफलता प्रतिक्रिया देखना चाहिए

+1

मैंने लोचदार खोज कोड (put_settings) में ऐसा करने के तरीके का पालन करने का प्रयास किया आदि ..) और कई त्रुटियों तक पहुंचे। यह मुझे घंटे बचाओ! धन्यवाद! – cpres

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