सभी ऐलिटिक्स खोज एकत्रीकरण परिणाम / बाल्टियाँ दिखाएँ और न केवल 10


166

मैं एक एकत्रीकरण पर सभी बाल्टियों को सूचीबद्ध करने की कोशिश कर रहा हूं, लेकिन यह केवल पहले 10 को दिखा रहा है।

मेरी खोज:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0, 
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw"
         }
      }
   }
}'

यह दिखाता है:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 16920,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "bairro_count" : {
      "buckets" : [ {
        "key" : "Barra da Tijuca",
        "doc_count" : 5812
      }, {
        "key" : "Centro",
        "doc_count" : 1757
      }, {
        "key" : "Recreio dos Bandeirantes",
        "doc_count" : 1027
      }, {
        "key" : "Ipanema",
        "doc_count" : 927
      }, {
        "key" : "Copacabana",
        "doc_count" : 842
      }, {
        "key" : "Leblon",
        "doc_count" : 833
      }, {
        "key" : "Botafogo",
        "doc_count" : 594
      }, {
        "key" : "Campo Grande",
        "doc_count" : 456
      }, {
        "key" : "Tijuca",
        "doc_count" : 361
      }, {
        "key" : "Flamengo",
        "doc_count" : 328
      } ]
    }
  }
}

मेरे पास इस एकत्रीकरण के लिए 10 से अधिक कुंजी हैं। इस उदाहरण में मेरे पास 145 चाबियां होंगी, और मैं उनमें से प्रत्येक के लिए गिनती चाहता हूं। क्या बाल्टी पर कुछ अंकुरण है? क्या मैं उन सभी को प्राप्त कर सकता हूं?

मैं एलिजाबेथ 1.1.0 का उपयोग कर रहा हूं

जवाबों:


196

आकार परम शब्द क्वेरी उदाहरण के लिए एक परम होना चाहिए:

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 0,
   "aggregations": {
      "bairro_count": {
         "terms": {
            "field": "bairro.raw",
             "size": 0
         }
      }
   }
}'

जैसा कि डॉक्टर में उल्लेख किया गया है, केवल संस्करण 1.1.0 के लिए काम करता है

संपादित करें

@PhaedrusTheGreek टिप्पणी के आधार पर उत्तर को अपडेट करना।

size:0उच्च-कार्डिनलिटी फ़ील्ड मानों के साथ आपके क्लस्टर पर लगाए गए मेमोरी मुद्दों के कारण सेटिंग को 2.x बाद में हटा दिया जाता है। आप इसके बारे में अधिक जीथूब मुद्दे में पढ़ सकते हैं ।

यह size1 से 2147483647 के बीच की संख्या के लिए स्पष्ट रूप से उचित मूल्य निर्धारित करने के लिए अनुशंसित है ।


8
ध्यान दें कि सेटिंग आकार: 0 अब उच्च-कार्डिनलिटी फ़ील्ड मानों के साथ आपके क्लस्टर पर दिए गए मेमोरी मुद्दों के कारण, पदावनत है। github.com/elastic/elasticsearch/issues/18838 । इसके बजाय, 1 2147483647 के बीच एक असली, उचित संख्या का उपयोग
PhaedrusTheGreek

धन्यवाद @PhaedrusTheGreek इस ओर इशारा करने के लिए, मैंने आपकी टिप्पणी को शामिल करने के लिए उत्तर संपादित किया है।
किल्ली

0 2.5.2 पर काम कर रहा है। 2.x से आपको क्या मतलब है? 5 संस्करण के बाद क्या आपका मतलब है? मुझे यह भी उत्सुकता है कि यदि मैं सभी संभावित एग्स को वापस करना चाहता हूं, तो यह किस तरह के मेमोरी मुद्दों का कारण बन सकता है, 0 (मैक्स_वेल्यू) और 10000 (कुछ बड़ी ऊपरी सीमा) सेट करने के बीच क्या अंतर होगा?
बैटमेसी

4
@batmaci को 2.x में अपदस्थ किया गया था इसलिए यह अभी भी काम करेगा और 5.x
keety

@batmaci मेरा मानना ​​है कि आकार का उपयोग: <बड़ी संख्या> कम स्मृति गहन नहीं है, लेकिन ग्राहक के लिए यह अधिक स्पष्ट है कि प्रदर्शन लागत है। मुझे लगता है कि पदावनत करने के पीछे तर्क है size:0। आप इसके बारे में और अधिक पढ़ सकते हैं इस github मुद्दे में
केटी

37

सभी बाल्टी कैसे दिखाएं?

{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "terms": {
        "field": "your_field",
        "size": 10000
      }
    }
  }
}

ध्यान दें

  • "size":10000अधिक से अधिक 10000 रुपये प्राप्त करें। डिफ़ॉल्ट 10 है।

  • "size":0इसके अतिरिक्त, "hits"डिफ़ॉल्ट रूप से 10 दस्तावेज़ शामिल हैं। हमें उनकी जरूरत नहीं है।

  • डिफ़ॉल्ट रूप से, बाल्टी doc_countघटते क्रम से होती है।


मुझे Fielddata is disabled on text fields by defaultत्रुटि क्यों मिलती है?

क्योंकि फील्डडेटा डिफ़ॉल्ट रूप से पाठ फ़ील्ड पर अक्षम है । यदि आपने किसी फ़ील्ड प्रकार की मैपिंग को स्पष्ट रूप से नहीं चुना है, तो इसमें स्ट्रिंग फ़ील्ड के लिए डिफ़ॉल्ट डायनेमिक मैपिंग है

इसलिए, लिखने के बजाय "field": "your_field"आपको होना चाहिए "field": "your_field.keyword"


बाल्टी के लिए बड़ा आकार होने से, लोचदार खोज क्वेरी के प्रदर्शन (क्वेरी को चलाने का समय) प्रभावित होता है?
user3522967

हम बाल्टी के लिए पेजिंग कैसे जोड़ सकते हैं?
Miind

7

अपने टर्म एग्रीगेशन में साइज़ (2 साइज़) को 10000 तक बढ़ाएँ और आपको साइज़ की बकेट 10000 मिल जाएगी। डिफ़ॉल्ट रूप से इसे 10 पर सेट किया जाता है। यदि आप सर्च रिजल्ट देखना चाहते हैं तो सिर्फ 1 साइज़ को 1 करें, आप कर सकते हैं 1 दस्तावेज़ देखें, क्योंकि ES खोज और एकत्रीकरण दोनों का समर्थन करता है।

curl -XPOST "http://localhost:9200/imoveis/_search?pretty=1" -d'
{
   "size": 1,
   "aggregations": {
      "bairro_count": {
         "terms": {
             "field": "bairro.raw",
             "size": 10000

         }
      }
   }
}'

4

यदि आप मैजिक नंबर ( size: 10000) सेट किए बिना सभी अद्वितीय मान प्राप्त करना चाहते हैं , तो COMPOSITE AGGREGATION (ES 6.5+) का उपयोग करें

से आधिकारिक दस्तावेज :

"यदि आप एक नेस्टेड शर्तों के एकत्रीकरण में सभी शर्तों या सभी संयोजनों को फिर से प्राप्त करना चाहते हैं, तो आपको COMPOSITE AGGREGATION का उपयोग करना चाहिए जो शर्तों के एकत्रीकरण में क्षेत्र की कार्डिनैलिटी से अधिक एक आकार सेट करने के बजाय सभी संभावित शर्तों पर पृष्ठांकित करने की अनुमति देता है।" शब्द एकत्रीकरण का मतलब शीर्ष शर्तों को वापस करना है और यह अंकुरण की अनुमति नहीं देता है। "

जावास्क्रिप्ट में कार्यान्वयन उदाहरण:

const ITEMS_PER_PAGE = 1000;

const body =  {
    "size": 0, // Returning only aggregation results: https://www.elastic.co/guide/en/elasticsearch/reference/current/returning-only-agg-results.html
    "aggs" : {
        "langs": {
            "composite" : {
                "size": ITEMS_PER_PAGE,
                "sources" : [
                    { "language": { "terms" : { "field": "language" } } }
                ]
            }
        }
     }
};

const uniqueLanguages = [];

while (true) {
  const result = await es.search(body);

  const currentUniqueLangs = result.aggregations.langs.buckets.map(bucket => bucket.key);

  uniqueLanguages.push(...currentUniqueLangs);

  const after = result.aggregations.langs.after_key;

  if (after) {
      // continue paginating unique items
      body.aggs.langs.composite.after = after;
  } else {
      break;
  }
}

console.log(uniqueLanguages);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.