Sadece 10 değil, tüm Elasticsearch toplama sonuçlarını / kovalarını göster


166

Bir toplama üzerindeki tüm kovaları listelemeye çalışıyorum, ancak sadece ilk 10'u gösteriyor gibi görünüyor.

Arama:

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

İadeler:

{
  "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
      } ]
    }
  }
}

Bu toplama için 10'dan fazla anahtarım var. Bu örnekte 145 anahtarım vardı ve her biri için sayım istiyorum. Kovalarda biraz sayfalandırma var mı? Hepsini alabilir miyim?

Elasticsearch 1.1.0 kullanıyorum

Yanıtlar:


196

Size parametresi, sorgu sorgusu örneği için bir param olmalıdır:

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

Belgede belirtildiği gibi sadece 1.1.0 sonrası için çalışır

Düzenle

Cevabı @PhaedrusTheGreek yorumuna göre güncelleme.

size:0yüksek kardinalite alan değerlerine sahip kümenizde meydana gelen bellek sorunları nedeniyle bu ayar 2.x ve sonrasında kullanımdan kaldırılmıştır. Bununla ilgili daha fazla bilgiyi buradan github sayısında okuyabilirsiniz .

size1 ile 2147483647 arasında bir sayı için açıkça makul bir değer ayarlamanız önerilir .


8
Yüksek kardinalite alanı değerlerine sahip kümenizdeki bellek sorunları nedeniyle, boyut ayarı 0'ın artık kullanılmadığını unutmayın. github.com/elastic/elasticsearch/issues/18838 . Bunun yerine 1 ile 2147483647 arasında gerçek ve makul bir sayı kullanın.
PhaedrusTheGreek

Teşekkürler @PhaedrusTheGreek bunu işaret ettiğiniz için, ben yorumunuzu dahil etmek cevap düzenledi.
keety

0 2.5.2 üzerinde çalışıyor. 2.x'den sonra ne demek istiyorsun? 5 sürümünden sonra ne demek istiyorsun? Ayrıca, olası tüm agg'ları döndürmek istersem ne tür bellek sorunlarına neden olabileceğini merak ediyorum, 0 (max_value) ve 10000 (Bazı büyük üst sınır) arasındaki fark nedir?
batmaci

4
@batmaci o kullanımdan kaldırıldı 2.x hala işe bu yüzden ve kaldırıldı 5.x
keety

@batmaci Ben boyutu kullanımı inanıyorum: <büyük sayı> daha az bellek yoğun değil ama sadece müşteri için performans maliyeti olduğunu daha açık hale getirir. Sanırım itirazın ardındaki sebep bu size:0. Bu github sayısında
keety

37

Tüm kovalar nasıl gösterilir?

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

Not

  • "size":10000En fazla 10000 kova alın. Varsayılan 10'dur.

  • "size":0Sonuç olarak, "hits"varsayılan olarak 10 belge içerir. Onlara ihtiyacımız yok.

  • Varsayılan olarak, kovalar doc_countazalan sırada sıralanır.


Neden Fielddata is disabled on text fields by defaulthata alıyorum?

Çünkü alan verileri varsayılan olarak metin alanlarında devre dışıdır . Bir alan türü eşlemesini açıkça seçmediyseniz, dize alanları için varsayılan dinamik eşlemelere sahiptir .

Yani yazmak yerine "field": "your_field" olmanız gerekir "field": "your_field.keyword".


Bölümler için daha büyük bir boyuta sahip olmak, elastik arama sorgusunun performansını (sorguyu çalıştırma süresi) etkiler mi?
user3522967

Kovalar için sayfa numaralandırmayı nasıl ekleyebiliriz?
Miind

7

Terim kümelerinizde boyutu (2. boyut) 10000'e yükseltin ve 10000 boyutunda bir kova elde edersiniz. Varsayılan olarak 10 olarak ayarlanır. Ayrıca, arama sonuçlarını görmek istiyorsanız 1. boyutu 1'e getirin, ES, hem aramayı hem de toplamayı desteklediğinden 1 belgeye bakın.

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

         }
      }
   }
}'

4

Tüm benzersiz değerleri sihirli bir sayı ( ) koymadan almak istiyorsanız , o zaman KOMPOZİT TOPLAMA (ES 6.5+) kullanınsize: 10000 .

Gönderen Resmi belgelerin :

"Tüm terimleri veya terimlerin tüm birleşimlerini iç içe geçmiş terimler kümesinde almak istiyorsanız, birleşim terimlerindeki alanın öneminden daha büyük bir boyut ayarlamak yerine tüm olası terimler üzerinde sayfalandırma yapılmasını sağlayan KOMPOZİT TOPLAMA kullanmalısınız . terimlerin toplanması en üstteki terimleri döndürmek içindir ve sayfalandırmaya izin vermez. "

JavaScript'teki uygulama örneği:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.