Elasticsearch 2.1: परिणाम विंडो बहुत बड़ी है (index.max_result_window)


86

हम Elasticsearch 2.1 से जानकारी प्राप्त करते हैं और उपयोगकर्ता को परिणामों के माध्यम से पृष्ठ की अनुमति देते हैं। जब उपयोगकर्ता एक उच्च पृष्ठ संख्या का अनुरोध करता है तो हमें निम्नलिखित त्रुटि संदेश मिलता है:

परिणाम विंडो बहुत बड़ी है, + आकार से कम या बराबर होना चाहिए: [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) क्या मेमोरी की खपत वास्तव में कम होगी (यदि ऐसा है तो क्यों नहीं) यदि मैं 10020 को रिजल्ट करने के लिए स्क्रॉल एप का उपयोग करता हूं (और 10000 से नीचे सब कुछ अवहेलना करता हूं) तो 10000-10020 के परिणाम के लिए "सामान्य" खोज अनुरोध करने के बजाय?

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

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

जवाबों:


79

यदि आपको गहरी पैगमेंट की आवश्यकता है, तो मूल्य बढ़ाने के लिए एक संभव समाधान है max_result_window। आप इसे curlअपने शेल कमांड लाइन से करने के लिए उपयोग कर सकते हैं :

curl -XPUT "http://localhost:9200/my_index/_settings" -H 'Content-Type: application/json' -d '{ "index" : { "max_result_window" : 500000 } }'

मैंने ~ 100k के मूल्यों के लिए, मेमोरी के उपयोग में वृद्धि को नोटिस नहीं किया।


मेरे पास एक ही त्रुटि है 'Result window is too large, from + size must be less than or equal to: [10000] but was [47190]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')इसमें कहा गया है कि इसमें 4719 पृष्ठ (प्रत्येक पृष्ठ 10 परिणाम) हैं। और मुझे लगता है कि आपका सुझाव काम करता है।
dotslash

1
500000 से कम दस्तावेजों की छोटी राशि के लिए यह एक अच्छा समाधान है
इज़्ज़त

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

3
उन लोगों के लिए जो इस कमांड के साथ elasticsearch के लिए हेडर त्रुटि प्राप्त करते हैं, आपको हेडर पास करने की आवश्यकता है, साथ ही कर्ल -XPUT " लोकलहोस्ट: 9200 / my_index / _settings " -H "कंटेंट-टाइप: एप्लीकेशन / 'json" -d' { "अनुक्रमणिका": {"max_result_window": ५००००}} ''
सट्स

32

स्क्रॉलिंग का उपयोग करने के लिए सही समाधान होगा।
हालाँकि, यदि आप परिणामों को search10,000 परिणामों से आगे बढ़ाना चाहते हैं, तो आप इसे किबाना के साथ आसानी से कर सकते हैं:

पर जाएं Dev Toolsऔर अपने अनुक्रमणिका (your_index_name) पर निम्न पोस्ट करें, यह निर्दिष्ट करते हुए कि नई अधिकतम परिणाम विंडो क्या होगी

यहाँ छवि विवरण दर्ज करें

PUT your_index_name/_settings
{ 
  "max_result_window" : 500000 
}

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

{
  "acknowledged": true
}

1
मैंने इलास्टिसर्च कोड (put_settings आदि ..) में ऐसा करने के तरीके का अनुसरण करने की कोशिश की और कई त्रुटियों तक पहुंच गया। यह मुझे घंटे बचाओ! धन्यवाद!
1

24

इलास्टिक डॉक्यूमेंटेशन में निम्न पृष्ठ गहरी पेजिंग के बारे में बात करते हैं:

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 पृष्ठ) गहरी पेजिंग पूरी तरह से उचित होनी चाहिए। लेकिन मूल्यों से बड़े-से-बड़े पैमाने पर, बड़ी मात्रा में सीपीयू, मेमोरी और बैंडविड्थ का उपयोग करके छंटनी प्रक्रिया वास्तव में बहुत भारी हो सकती है। इस कारण से, हम गहरी पेगिंग के खिलाफ दृढ़ता से सलाह देते हैं।


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

2
क्या हम गहरी एपीआई की आवश्यकता होने पर स्क्रॉल एपीआई का उपयोग कर सकते हैं?
अभि.जी।

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

3

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

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();
}

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},।


0

मेरे मामले में ऐसा लगता है कि परिणाम और आकार और उपसर्ग के माध्यम से क्वेरी को कम करना त्रुटि को दूर करेगा क्योंकि हमें सभी परिणामों की आवश्यकता नहीं है:

GET widgets_development/_search
{
  "from" : 0, 
  "size": 5,
  "query": {
    "bool": {}
  },
  "sort": {
    "col_one": "asc"
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.