Kami mengambil informasi dari Elasticsearch 2.1 dan mengizinkan pengguna untuk membuka halaman melalui hasil. Ketika pengguna meminta nomor halaman yang tinggi, kami mendapatkan pesan kesalahan berikut:
Jendela hasil terlalu besar, dari + size harus kurang dari atau sama dengan: [10000] tetapi sebelumnya [10020]. Lihat api gulir untuk cara yang lebih efisien dalam meminta kumpulan data yang besar. Batas ini dapat disetel dengan mengubah parameter level indeks [index.max_result_window]
Docu elastis mengatakan bahwa ini karena konsumsi memori yang tinggi dan menggunakan api gulir:
Nilai yang lebih tinggi dari dapat menghabiskan banyak memori heap per pencarian dan per pecahan yang menjalankan pencarian. Paling aman meninggalkan nilai ini karena ini adalah penggunaan api gulir untuk pengguliran dalam apa pun https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits
Masalahnya adalah saya tidak ingin mengambil kumpulan data yang besar. Saya hanya ingin mengambil sepotong dari kumpulan data yang sangat tinggi di kumpulan hasil. Juga docu bergulir mengatakan:
Pengguliran tidak dimaksudkan untuk permintaan pengguna waktu nyata https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html
Ini membuat saya memiliki beberapa pertanyaan:
1) Akankah konsumsi memori benar-benar lebih rendah (ada jika demikian mengapa) jika saya menggunakan api gulir untuk menggulir ke atas hingga hasil 10020 (dan mengabaikan semua yang di bawah 10000) daripada melakukan permintaan pencarian "normal" untuk hasil 10000-10020?
2) Tampaknya API gulir merupakan pilihan bagi saya tetapi saya harus meningkatkan "index.max_result_window". Apakah ada yang punya pengalaman dengan ini?
3) Apakah ada opsi lain untuk menyelesaikan masalah saya?
sumber
'Result window is too large, from + size must be less than or equal to: [10000] but was [47190]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter.')
Dikatakan memiliki 4719 halaman (setiap halaman 10 hasil). dan saya pikir saran Anda berhasil.{ "max_result_window" : 500000 }
agar ini berfungsi. Jadi perintah curl menjadi -curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "max_result_window" : 500000 }'
Solusi yang tepat adalah menggunakan scrolling.
Namun, jika Anda ingin memperluas
search
pengembalian hasil melebihi 10.000 hasil, Anda dapat melakukannya dengan mudah dengan Kibana:Pergi ke
Dev Tools
dan posting yang berikut ini ke indeks Anda (nama_anda_anda), tentukan apa yang akan menjadi jendela hasil maksimal yang baruJika semuanya berjalan dengan baik, Anda akan melihat respons sukses berikut:
sumber
Halaman-halaman berikut dalam dokumentasi elastis berbicara tentang deep paging:
https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html
sumber
Gunakan Scroll API untuk mendapatkan lebih dari 10.000 hasil.
Contoh gulir di ElasticSearch NEST API
Saya telah menggunakannya seperti ini:
sumber
Jika Anda menginginkan lebih dari 10.000 hasil maka di semua node data penggunaan memori akan sangat tinggi karena harus mengembalikan lebih banyak hasil di setiap permintaan kueri. Kemudian jika Anda memiliki lebih banyak data dan lebih banyak pecahan, penggabungan hasil tersebut tidak akan efisien. Juga es cache konteks filter, karenanya lebih banyak memori. Anda harus coba-coba berapa banyak tepatnya yang Anda ambil. Jika Anda mendapatkan banyak permintaan di jendela kecil, Anda harus melakukan beberapa kueri selama lebih dari 10k dan menggabungkannya sendiri ke dalam kode, yang seharusnya mengambil lebih sedikit memori aplikasi daripada jika Anda meningkatkan ukuran jendela.
sumber
2) Tampaknya API gulir merupakan pilihan bagi saya tetapi saya harus meningkatkan "index.max_result_window". Apakah ada yang punya pengalaman dengan ini?
-> Anda dapat menentukan nilai ini di templat indeks, templat es hanya akan berlaku untuk indeks baru, jadi Anda harus menghapus indeks lama setelah membuat templat atau menunggu data baru diserap di elasticsearch.
{"order": 1, "template": "index_template *", "settings": {"index.number_of_replicas": "0", "index.number_of_shards": "1", "index.max_result_window": 2147483647},
sumber
Dalam kasus saya, sepertinya mengurangi hasil melalui awalan from & size ke kueri akan menghapus kesalahan karena kami tidak memerlukan semua hasil:
sumber