Saya memiliki database kecil di Elasticsearch dan untuk tujuan pengujian ingin menarik semua catatan kembali. Saya mencoba menggunakan URL formulir ...
http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}}
Bisakah seseorang memberi saya URL yang akan Anda gunakan untuk mencapai ini, tolong?
database
elasticsearch
query-string
elasticsearch-dsl
John Livermore
sumber
sumber
Jawaban:
Saya pikir sintaks lucene didukung sehingga:
http://localhost:9200/foo/_search?pretty=true&q=*:*
ukuran default ke 10, jadi Anda mungkin juga perlu
&size=BIGNUMBER
mendapatkan lebih dari 10 item. (di mana BIGNUMBER sama dengan angka yang Anda yakini lebih besar dari dataset Anda)TETAPI, dokumentasi elasticsearch menyarankan untuk set hasil yang besar, menggunakan tipe pencarian pindai.
MISALNYA:
dan kemudian terus meminta sesuai tautan dokumentasi di atas yang disarankan.
EDIT:
scan
Tidak digunakan lagi dalam 2.1.0.scan
tidak memberikan manfaat apa pun atasscroll
permintaan reguler yang diurutkan berdasarkan_doc
. tautan ke dokumen elastis (terlihat oleh @ christophe-roussy)sumber
Perhatikan param ukuran , yang meningkatkan hit yang ditampilkan dari default (10) menjadi 1000 per shard.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html
sumber
max_result_window
elasticsearch (ES) mendukung permintaan GET atau POST untuk mendapatkan data dari indeks cluster ES.
Ketika kami melakukan GET:
Ketika kami melakukan POST:
Saya akan menyarankan untuk menggunakan plugin UI dengan elasticsearch http://mobz.github.io/elasticsearch-head/ Ini akan membantu Anda mendapatkan perasaan yang lebih baik tentang indeks yang Anda buat dan juga menguji indeks Anda.
sumber
from
+size
tidak boleh lebih dariindex.max_result_window
pengaturan indeks yang default ke 10.000curl -XGET ... -d '{...}'
yang merupakanun
gaya resmi campuran permintaan. Terima kasih telah menunjukkan format GET dan POST yang benar.Kueri di bawah ini akan mengembalikan NO_OF_RESULTS yang ingin Anda kembalikan ..
Sekarang, pertanyaannya di sini adalah Anda ingin semua catatan dikembalikan. Jadi secara alami, sebelum menulis kueri, Anda tidak akan tahu nilai NO_OF_RESULTS .
Bagaimana kami tahu berapa banyak catatan yang ada di dokumen Anda? Cukup ketik kueri di bawah ini
Ini akan memberi Anda hasil yang terlihat seperti di bawah ini
Hasil Total memberitahu Anda berapa banyak catatan yang tersedia dalam dokumen Anda. Jadi, itu cara yang bagus untuk mengetahui nilai HASIL NO_OF
Cari semua jenis di semua indeks
Cari semua jenis dalam indeks foo
Cari semua jenis dalam indeks foo1 dan foo2
Cari semua jenis dalam indeks yang dimulai dengan f
Jenis pencarian pengguna dan tweet di semua indeks
sumber
Ini adalah solusi terbaik yang saya temukan menggunakan klien python
https://gist.github.com/drorata/146ce50807d16fd4a6aa
Menggunakan klien java
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html
sumber
elasticsearch_dsl==5.4.0
dan berfungsi tanpasearch_type = 'scan',
.size=10000
, di suatu tempat antara iterasi 5-7. denganstatus=127
,main ERROR Null object returned for RollingFile in Appenders
,main ERROR Unable to locate appender "rolling" for logger config "root"
ada log in/var/log/elasticsearch/elasticsearch.log
scan
helper` yang melakukan scroll di bawah tenda (sejak versi 5.xx saat leat)search_type = 'scan'
sudah ditinggalkan. Kode serupa akan berfungsi tanpa itu, meskipun ada beberapa perbedaan menarik yang terkubur dalam dokumentasi lama. elastic.co/guide/en/elasticsearch/reference/1.4/... Khususnya, ketika bermigrasi untuk tidak menggunakan search_type = scan, kueri 'pencarian' pertama akan datang dengan batch pertama hasil untuk diproses.Elasticsearch akan menjadi lebih lambat secara signifikan jika Anda hanya menambahkan sejumlah besar sebagai ukuran, salah satu metode yang digunakan untuk mendapatkan semua dokumen adalah menggunakan pindai dan gulir id.
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
Di Elasticsearch v7.2, Anda melakukannya seperti ini:
Hasil dari ini akan berisi _scroll_id yang harus Anda query untuk mendapatkan 100 chunk berikutnya.
sumber
search_type=scan
sekarang sudah ditinggalkan. Jadi Anda harus menghapusnya, tetapi kemudian perilakunya sedikit berubah. Kumpulan data pertama kembali dari panggilan pencarian awal. Tautan yang Anda berikan memang menunjukkan cara yang benar untuk melakukannya.gunakan
server:9200/_stats
juga untuk mendapatkan statistik tentang semua alias Anda .. seperti ukuran dan jumlah elemen per alias, itu sangat berguna dan memberikan informasi bermanfaatsumber
Jika Anda ingin menarik ribuan catatan, maka ... beberapa orang memberikan jawaban yang benar menggunakan 'gulir' (Catatan: Beberapa orang juga menyarankan menggunakan "search_type = scan". Ini tidak digunakan lagi, dan pada v5.0 dihapus. Kamu tidak membutuhkannya)
Mulailah dengan permintaan 'pencarian', tetapi tentukan parameter 'gulir' (di sini saya menggunakan batas waktu 1 menit):
Itu termasuk 'gelombang' pertama Anda. Tapi kita belum selesai di sini. Output dari perintah curl di atas akan menjadi seperti ini:
Sangat penting untuk memiliki _scroll_id berguna karena selanjutnya Anda harus menjalankan perintah berikut:
Namun, meneruskan scroll_id bukanlah sesuatu yang dirancang untuk dilakukan secara manual. Taruhan terbaik Anda adalah menulis kode untuk melakukannya. misalnya dalam java:
Sekarang LOOP pada perintah terakhir gunakan SearchResponse untuk mengekstrak data.
sumber
Sederhana! Anda dapat menggunakan
size
danfrom
parameter!maka Anda mengubah
from
secara bertahap sampai Anda mendapatkan semua data.sumber
from
+size
tidak boleh lebih dari pengaturan indeks index.max_result_window yang default ke 10.000from
dan-size
pendekatan Anda akan mengalami masalah Pagination Jauh. Gunakan API gulir untuk melakukan dump semua dokumen.Cara terbaik untuk menyesuaikan ukuran menggunakan ukuran = angka di depan URL
Catatan: nilai maksimum yang dapat didefinisikan dalam ukuran ini adalah 10000. Untuk nilai apa pun di atas sepuluh ribu, ia mengharapkan Anda untuk menggunakan fungsi gulir yang akan meminimalkan kemungkinan dampak pada kinerja.
sumber
Anda dapat menggunakan
_count
API untuk mendapatkan nilai untuksize
parameter:Pengembalian
{count:X, ...}
. Ekstrak nilai 'X' dan kemudian lakukan permintaan sebenarnya:sumber
http: // localhost: 9200 / foo / _search / ? ukuran = 1000 & cantik = 1
Anda perlu menentukan parameter kueri ukuran karena standarnya adalah 10
sumber
param ukuran meningkatkan hit yang ditampilkan dari default (10) menjadi 500.
Mengubah dari langkah demi langkah untuk mendapatkan semua data.
sumber
Untuk Elasticsearch 6.x
Permintaan:
GET /foo/_search?pretty=true
Tanggapan: Dalam jumlah Hits->, berikan hitungan pada dokumen
sumber
Jika ini adalah dataset kecil (mis. Rekaman 1K) , Anda dapat dengan mudah menentukan
size
:The pertandingan semua permintaan tidak diperlukan, karena itu implisit.
Jika Anda memiliki dataset berukuran sedang, seperti catatan 1M , Anda mungkin tidak memiliki cukup memori untuk memuatnya, jadi Anda perlu sebuah gulir .
Gulir seperti kursor dalam DB. Dalam Elasticsearch, ia mengingat di mana Anda tinggalkan dan menjaga tampilan indeks yang sama (yaitu mencegah pencari pergi dengan refresh , mencegah segmen dari penggabungan ).
Dari sisi API, Anda harus menambahkan parameter gulir ke permintaan pertama:
Anda mendapatkan kembali halaman pertama dan ID gulir:
Ingat bahwa ID gulir yang Anda dapatkan kembali dan batas waktu berlaku untuk halaman berikutnya . Kesalahan umum di sini adalah untuk menentukan batas waktu yang sangat besar (nilai
scroll
), yang akan mencakup untuk memproses seluruh dataset (misalnya catatan 1M) alih-alih satu halaman (misalnya 100 catatan).Untuk mendapatkan halaman berikutnya, isi ID gulir terakhir dan batas waktu yang akan berlangsung hingga mengambil halaman berikut:
Jika Anda memiliki banyak ekspor (mis. Dokumen 1B) , Anda ingin memparalelkan. Ini dapat dilakukan melalui scroll yang diiris . Katakanlah Anda ingin mengekspor pada 10 utas. Utas pertama akan mengeluarkan permintaan seperti ini:
Anda mendapatkan kembali halaman pertama dan ID gulir, persis seperti permintaan gulir normal. Anda akan mengkonsumsinya persis seperti gulungan biasa, kecuali bahwa Anda mendapatkan 1/10 data.
Utas lainnya akan melakukan hal yang sama, kecuali itu
id
adalah 1, 2, 3 ...sumber
sumber
Secara default Elasticsearch mengembalikan 10 catatan sehingga ukuran harus disediakan secara eksplisit.
Tambahkan ukuran dengan permintaan untuk mendapatkan jumlah catatan keinginan.
http: // {host}: 9200 / {index_name} / _search? pretty = true & size = (jumlah catatan)
Catatan: Ukuran halaman maks. Tidak boleh lebih dari pengaturan indeks index.max_result_window yang default ke 10.000.
sumber
Dari Kibana DevTools-nya:
sumber
Sebuah solusi sederhana menggunakan paket python elasticsearch-dsl :
Lihat juga https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan .
sumber
Hasil maksimum yang akan dikembalikan oleh elasticSearch adalah 10.000 dengan memberikan ukuran
Setelah itu, Anda harus menggunakan Scroll API untuk mendapatkan hasilnya dan mendapatkan nilai _scroll_id dan memasukkan nilai ini ke scroll_id
sumber
Dokumentasi resmi memberikan jawaban untuk pertanyaan ini! Anda dapat menemukannya di sini .
Anda cukup mengganti ukuran (1) dengan jumlah hasil yang ingin Anda lihat!
sumber
Untuk mengembalikan semua catatan dari semua indeks yang dapat Anda lakukan:
curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty
Keluaran:
sumber
sumber
Tidak ada kecuali @Akira Sendoh telah menjawab bagaimana sebenarnya mendapatkan SEMUA dokumen. Tetapi bahkan solusi itu crash layanan ES 6.3 saya tanpa log. Satu-satunya hal yang berhasil bagi saya menggunakan
elasticsearch-py
pustaka tingkat rendah adalah melalui pemindai pembantu yang menggunakanscroll()
api:Namun, cara yang lebih bersih saat ini tampaknya melalui
elasticsearch-dsl
perpustakaan, yang menawarkan panggilan yang lebih abstrak dan lebih bersih, misalnya: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hitssumber
Jika masih ada yang mencari semua data yang akan diambil dari Elasticsearch seperti saya untuk beberapa usecases, inilah yang saya lakukan. Terlebih lagi, semua data berarti, semua indeks dan semua jenis dokumen. Saya menggunakan Elasticsearch 6.3
Referensi penelitian Elastics
sumber
ini adalah kueri untuk mencapai apa yang Anda inginkan, (saya menyarankan untuk menggunakan Kibana, karena membantu memahami pertanyaan dengan lebih baik)
untuk mendapatkan semua catatan, Anda harus menggunakan kueri "match_all".
ukuran adalah jumlah catatan yang ingin Anda ambil (jenis batas). secara default, ES hanya akan mengembalikan 10 catatan
dari seperti melompat, lewati 3 rekaman pertama.
Jika Anda ingin mengambil persis semua catatan, cukup gunakan nilai dari bidang "total" dari hasil setelah Anda menekan kueri ini dari Kibana dan menggunakannya dengan "ukuran".
sumber
Menggunakan Elasticsearch 7.5.1
jika Anda juga dapat menentukan ukuran array Anda dengan & size = $ {number}
jika Anda tidak tahu indeks Anda
sumber
Menggunakan kibana console dan my_index sebagai indeks untuk mencari yang berikut ini dapat dikontribusikan. Meminta indeks untuk hanya mengembalikan 4 bidang indeks, Anda juga dapat menambahkan ukuran untuk menunjukkan berapa banyak dokumen yang ingin Anda kembalikan oleh indeks. Pada ES 7.6 Anda harus menggunakan _source daripada memfilternya akan merespons lebih cepat.
sumber
Anda dapat menggunakan ukuran = 0 ini akan mengembalikan Anda semua contoh dokumen
sumber