Tampilkan semua hasil / keranjang agregasi Elasticsearch dan bukan hanya 10


165

Saya mencoba membuat daftar semua ember pada agregasi, tetapi tampaknya hanya menampilkan 10 ember pertama.

Pencarian saya:

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

Pengembalian:

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

Saya memiliki lebih dari 10 kunci untuk agregasi ini. Dalam contoh ini saya akan memiliki 145 kunci, dan saya ingin menghitung untuk masing-masing. Apakah ada pagination pada bucket? Bisakah saya mendapatkan semuanya?

Saya menggunakan Elasticsearch 1.1.0

Jawaban:


196

Param ukuran harus menjadi param untuk contoh kueri istilah:

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

Seperti yang disebutkan dalam dokumen hanya berfungsi untuk versi 1.1.0 dan seterusnya

Edit

Memperbarui jawabannya berdasarkan komentar @PhaedrusTheGreek.

pengaturan size:0tidak digunakan dalam 2.x dan seterusnya, karena masalah memori yang ditimbulkan pada cluster Anda dengan nilai bidang kardinalitas tinggi. Anda dapat membaca lebih lanjut tentang itu di masalah github di sini .

Disarankan untuk secara eksplisit menetapkan nilai yang masuk akal untuk sizeangka antara 1 hingga 2147483647.


8
Perhatikan bahwa ukuran pengaturan: 0 sekarang tidak digunakan lagi, karena masalah memori yang ditimbulkan pada cluster Anda dengan nilai bidang kardinalitas tinggi. github.com/elastic/elasticsearch/issues/18838 . Alih-alih, gunakan angka nyata yang masuk akal antara 1 hingga 2147483647.
PhaedrusTheGreek

terima kasih @PhaedrusTheGreek untuk menunjukkan ini, saya telah mengedit jawaban untuk memasukkan komentar Anda.
keety

0 bekerja pada 2.5.2. apa yang kamu maksud dengan 2.x dan seterusnya? maksudmu setelah versi 5? Saya juga ingin tahu masalah memori apa yang dapat terjadi jika saya ingin mengembalikan semua kemungkinan, apa perbedaan antara pengaturan 0 (max_value) dan 10000 (Beberapa batas atas besar)?
batmaci

4
@batmaci sudah tidak digunakan lagi di 2.x jadi masih akan bekerja dan dihapus dari 5.x
keety

@ Batmaci Saya percaya penggunaan ukuran: <big number> tidak kurang intensif memori tetapi hanya membuatnya lebih eksplisit untuk klien bahwa ada biaya kinerja. Saya pikir itu adalah alasan di balik penghinaan size:0. Anda dapat membacanya lebih banyak di edisi
keety

37

Bagaimana cara menunjukkan semua ember?

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

Catatan

  • "size":10000Dapatkan maksimal 10.000 ember. Defaultnya adalah 10.

  • "size":0Hasilnya, "hits"berisi 10 dokumen secara default. Kami tidak membutuhkan mereka.

  • Secara default, bucket dipesan oleh doc_counturutan menurun.


Mengapa saya mendapatkan Fielddata is disabled on text fields by defaultkesalahan?

Karena data field dinonaktifkan pada bidang teks secara default . Jika Anda belum memilih pemetaan jenis bidang, pemetaan dinamis default untuk bidang string .

Jadi, alih-alih menulis, "field": "your_field"Anda harus memilikinya "field": "your_field.keyword".


Apakah memiliki ukuran yang lebih besar untuk bucket, memengaruhi kinerja (waktu menjalankan kueri) kueri penelusuran elastis?
user3522967

Bagaimana kita bisa menambahkan pagination untuk bucket?
Miind

7

Tingkatkan ukuran (ukuran 2) menjadi 10.000 dalam agregasi istilah Anda dan Anda akan mendapatkan ember ukuran 10.000. Secara default ukurannya adalah 10. Juga jika Anda ingin melihat hasil pencarian, buat saja ukuran 1 ke 1, Anda dapat lihat 1 dokumen, karena ES memang mendukung pencarian dan agregasi.

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

         }
      }
   }
}'

3

Jika Anda ingin mendapatkan semua nilai unik tanpa menetapkan angka ajaib ( size: 10000), maka gunakan AGREGASI KOMPOSIT (ES 6.5+) .

Dari dokumentasi resmi :

"Jika Anda ingin mengambil semua istilah atau semua kombinasi istilah dalam agregasi istilah bersarang, Anda harus menggunakan AGREGASI KOMPOSIT yang memungkinkan untuk memberi peringkat pada semua istilah yang mungkin alih-alih menetapkan ukuran lebih besar dari kardinalitas bidang dalam agregasi istilah. agregasi istilah dimaksudkan untuk mengembalikan istilah teratas dan tidak mengizinkan pagination. "

Contoh implementasi dalam JavaScript:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.