Pencarian elastis, beberapa indeks vs satu indeks dan jenis untuk set data yang berbeda?

161

Saya memiliki aplikasi yang dikembangkan menggunakan pola MVC dan saya ingin mengindeks sekarang beberapa model itu, ini berarti setiap model memiliki struktur data yang berbeda.

  • Apakah lebih baik menggunakan indeks mutliple, satu untuk setiap model atau memiliki tipe dalam indeks yang sama untuk setiap model? Kedua cara itu juga akan membutuhkan kueri penelusuran yang berbeda menurut saya. Saya baru saja memulai ini.

  • Apakah ada perbedaan kinerja antara kedua konsep jika kumpulan data kecil atau besar?

Saya akan menguji pertanyaan kedua sendiri jika seseorang dapat merekomendasikan saya beberapa data sampel yang baik untuk tujuan itu.

burzum
sumber

Jawaban:

184

Ada implikasi yang berbeda untuk kedua pendekatan.

Dengan asumsi Anda menggunakan pengaturan default Elasticsearch, memiliki 1 indeks untuk setiap model akan secara signifikan meningkatkan jumlah pecahan Anda karena 1 indeks akan menggunakan 5 pecahan, 5 model data akan menggunakan 25 pecahan; sementara memiliki 5 jenis objek dalam 1 indeks masih akan menggunakan 5 pecahan.

Implikasi untuk membuat setiap model data sebagai indeks:

  • Efisien dan cepat untuk mencari di dalam indeks, karena jumlah data harus lebih kecil di setiap beling karena didistribusikan ke indeks yang berbeda.
  • Pencarian kombinasi model data dari 2 indeks atau lebih akan menghasilkan overhead, karena permintaan harus dikirim ke lebih banyak pecahan di seluruh indeks, dikompilasi dan dikirim kembali ke pengguna.
  • Tidak disarankan jika kumpulan data Anda kecil karena Anda akan mengalami lebih banyak penyimpanan dengan setiap pecahan tambahan dibuat dan peningkatan kinerja marjinal.
  • Disarankan jika kumpulan data Anda besar dan pertanyaan Anda membutuhkan waktu lama untuk diproses, karena pecahan khusus menyimpan data spesifik Anda dan akan lebih mudah untuk diproses oleh Elasticsearch.

Implikasi untuk memiliki setiap model data sebagai tipe objek dalam indeks:

  • Lebih banyak data akan disimpan dalam 5 pecahan indeks, yang berarti ada masalah overhead yang lebih rendah ketika Anda query di berbagai model data tetapi ukuran beling Anda akan secara signifikan lebih besar.
  • Lebih banyak data di dalam pecahan akan membutuhkan waktu lebih lama untuk Elasticsearch untuk mencari karena ada lebih banyak dokumen untuk disaring.
  • Tidak disarankan jika Anda tahu bahwa Anda akan melalui 1 terabyte data dan Anda tidak mendistribusikan data Anda di berbagai indeks atau beberapa pecahan dalam pemetaan Elasticsearch Anda.
  • Disarankan untuk set data kecil, karena Anda tidak akan menyia-nyiakan ruang penyimpanan untuk peningkatan kinerja marjinal karena setiap serpihan menghabiskan ruang di perangkat keras Anda.

Jika Anda bertanya apa yang terlalu banyak data vs data kecil? Biasanya itu tergantung pada kecepatan prosesor dan RAM perangkat keras Anda, jumlah data yang Anda simpan dalam setiap variabel dalam pemetaan Anda untuk Elasticsearch dan persyaratan permintaan Anda; menggunakan banyak sisi dalam permintaan Anda akan memperlambat waktu respons Anda secara signifikan. Tidak ada jawaban langsung untuk ini dan Anda harus melakukan benchmark sesuai dengan kebutuhan Anda.

Jonathan Moo
sumber
8
Jawaban ini tidak lengkap tanpa info dari elasticsearch.org/guide/en/elasticsearch/guide/current/…
AndreKR
5
Untuk menambah jawaban yang sangat baik, saya kutip dari ES 5.2 doc yang menjelaskan mengapa mempertahankan sejumlah besar pecahan tidak disarankan: " By default elasticsearch rejects search requests that would query more than 1000 shards. The reason is that such large numbers of shards make the job of the coordinating node very CPU and memory intensive. It is usually a better idea to organize data in such a way that there are fewer larger shards. In case you would like to bypass this limit, which is discouraged, you can update the action.search.shard_count.limit cluster setting to a greater value."
terlupakan
49

Meskipun jawaban Jonathan benar pada saat itu, dunia telah bergerak dan sekarang tampaknya orang-orang di belakang ElasticSearch memiliki rencana jangka panjang untuk menjatuhkan dukungan untuk berbagai jenis:

Di mana kami ingin pergi ke: Kami ingin menghapus konsep jenis dari Elasticsearch, sambil tetap mendukung orang tua / anak.

Jadi untuk proyek baru, hanya menggunakan satu jenis per indeks akan membuat upgrade akhirnya ke ElasticSearch 6.x menjadi lebih mudah.

Danack
sumber
13

Jawaban Jonathan luar biasa. Saya hanya akan menambahkan beberapa poin lain untuk dipertimbangkan:

  • jumlah pecahan dapat disesuaikan per solusi yang Anda pilih. Anda mungkin memiliki satu indeks dengan 15 pecahan utama, atau membaginya menjadi 3 indeks untuk 5 pecahan - perspektif kinerja tidak akan berubah (dengan asumsi data didistribusikan secara merata)
  • pikirkan tentang penggunaan data. Yaitu. jika Anda menggunakan kibana untuk memvisualisasikan, lebih mudah untuk memasukkan / mengecualikan indeks tertentu, tetapi jenis harus difilter di dasbor
  • penyimpanan data: untuk log aplikasi / data metrik, gunakan indeks yang berbeda jika Anda memerlukan periode penyimpanan yang berbeda
Marcel Matus
sumber
Apa yang dimaksud dengan periode retensi? Apakah Anda mengacu pada bidang waktu untuk hidup? Itu diatur pada basis per dokumen.
Kshitiz Sharma
Tidak, di sini periode retensi dimaksudkan sebagai retensi dokumen / indeks - berapa lama untuk menyimpan data tersebut. Berdasarkan kualitas data, ukuran, kepentingan - saya gunakan untuk menentukan kebijakan penyimpanan yang berbeda. Beberapa data / indeks dihapus setelah 7 hari, yang lain setelah 6w, dan beberapa setelah 10 tahun ...
Marcel Matus
2

Kedua jawaban di atas sangat bagus!

Saya menambahkan contoh beberapa jenis dalam indeks. Misalkan Anda sedang mengembangkan aplikasi untuk mencari buku di perpustakaan. Ada beberapa pertanyaan untuk diajukan kepada pemilik Perpustakaan,

Pertanyaan:

  1. Berapa banyak buku yang Anda rencanakan untuk disimpan?

  2. Buku apa yang akan Anda simpan di perpustakaan?

  3. Bagaimana Anda akan mencari buku?

Jawaban:

  1. Saya berencana untuk menyimpan 50 k - hingga 70 k buku (kurang-lebih)

  2. Saya akan memiliki 15 k-20 k buku yang berhubungan dengan teknologi (ilmu komputer, teknik mesin, teknik kimia dan sebagainya), 15 k buku sejarah, 10 k buku ilmu kedokteran. 10 k buku terkait bahasa (Inggris, Spanyol dan sebagainya)

  3. Cari berdasarkan nama depan penulis, nama belakang penulis, tahun penerbitan, nama penerbit. (Ini memberi Anda ide tentang informasi apa yang harus Anda simpan dalam indeks)

Dari jawaban di atas kita dapat mengatakan skema dalam indeks kita akan terlihat seperti ini.

// Ini bukan pemetaan yang tepat, hanya sebagai contoh

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

Untuk mencapai hal di atas, kita dapat membuat satu indeks yang disebut Buku dan dapat memiliki berbagai jenis.

Indeks: Buku

Jenis: Sains, Seni

(Atau Anda dapat membuat banyak jenis seperti Teknologi, Ilmu Kedokteran, Sejarah, Bahasa, jika Anda memiliki lebih banyak buku)

Hal penting yang perlu diperhatikan di sini adalah skema serupa tetapi datanya tidak identik. Dan yang penting lainnya adalah total data yang Anda simpan.

Semoga di atas membantu kapan harus mencari berbagai jenis dalam Indeks, jika Anda memiliki skema yang berbeda Anda harus mempertimbangkan indeks yang berbeda. Indeks kecil untuk lebih sedikit data. indeks besar untuk data besar :-)

Sourav
sumber