वर्तमान उच्चतम रैंकिंग उत्तर काम करता है, लेकिन इसे परिणामों की पूरी सूची को स्मृति में लोड करने की आवश्यकता होती है, जो बड़े परिणाम सेट के लिए स्मृति समस्याएं पैदा कर सकती है, और किसी भी मामले में अनावश्यक है।
मैंने एक जावा क्लास बनाया है जो SearchHit
से अधिक अच्छा बनाता है, जो सभी परिणामों के माध्यम से पुन: सक्रिय करने की अनुमति देता है। आंतरिक रूप से, यह from:
फ़ील्ड को शामिल करने वाले प्रश्नों को जारी करके पृष्ठांकन को संभालता है, और यह केवल मेमोरी के एक पृष्ठ में रहता है।
उपयोग:
// build your query here -- no need for setFrom(int)
SearchRequestBuilder requestBuilder = client.prepareSearch(indexName)
.setTypes(typeName)
.setQuery(QueryBuilders.matchAllQuery())
SearchHitIterator hitIterator = new SearchHitIterator(requestBuilder);
while (hitIterator.hasNext()) {
SearchHit hit = hitIterator.next();
// process your hit
}
ध्यान दें कि, जब बनाने अपने SearchRequestBuilder
, आप setFrom(int)
कॉल करने के लिए, के रूप में यह SearchHitIterator
द्वारा interally किया जाएगा जरूरत नहीं है। यदि आप किसी पृष्ठ का आकार निर्दिष्ट करना चाहते हैं (यानी प्रति पृष्ठ खोज हिट की संख्या), तो आप setSize(int)
पर कॉल कर सकते हैं, अन्यथा लोचदार खोज का डिफ़ॉल्ट मान उपयोग किया जाता है।
SearchHitIterator:
import java.util.Iterator;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.SearchHit;
public class SearchHitIterator implements Iterator<SearchHit> {
private final SearchRequestBuilder initialRequest;
private int searchHitCounter;
private SearchHit[] currentPageResults;
private int currentResultIndex;
public SearchHitIterator(SearchRequestBuilder initialRequest) {
this.initialRequest = initialRequest;
this.searchHitCounter = 0;
this.currentResultIndex = -1;
}
@Override
public boolean hasNext() {
if (currentPageResults == null || currentResultIndex + 1 >= currentPageResults.length) {
SearchRequestBuilder paginatedRequestBuilder = initialRequest.setFrom(searchHitCounter);
SearchResponse response = paginatedRequestBuilder.execute().actionGet();
currentPageResults = response.getHits().getHits();
if (currentPageResults.length < 1) return false;
currentResultIndex = -1;
}
return true;
}
@Override
public SearchHit next() {
if (!hasNext()) return null;
currentResultIndex++;
searchHitCounter++;
return currentPageResults[currentResultIndex];
}
}
वास्तव में, को साकार कैसे सुविधाजनक यह, मुझे आश्चर्य है कि इस तरह के एक वर्ग के लिए क्यों ElasticSearch के जावा ग्राहक कुछ इसी तरह की पेशकश नहीं करता है।
मुझे भी यही समस्या है। आपके प्रश्न के लिए Thans –
मेरे पास 100 दस्तावेज़ हैं। मैं integer.MAX_VALUE को आकार के रूप में सेट करता हूं। गॉट आउटऑफमेमरी एरर [जावा हीप स्पेस] माई जब्स में भी। अगर मैं 1000 देता हूं, तो ठीक काम करता है। –