elasticsearch vs MongoDB untuk aplikasi penyaringan [ditutup]

180

Pertanyaan ini adalah tentang membuat pilihan arsitektur sebelum menggali rincian eksperimen dan implementasi. Ini tentang kesesuaian, dalam skalabilitas dan kinerja, dari elasticsearch vs MongoDB, untuk tujuan yang agak spesifik.

Secara hipotetis keduanya menyimpan objek data yang memiliki bidang dan nilai, dan memungkinkan untuk menanyakan objek tersebut. Jadi mungkin menyaring subset objek sesuai dengan bidang yang dipilih ad-hoc, adalah sesuatu yang cocok untuk keduanya.

Aplikasi saya akan berputar di sekitar memilih objek sesuai dengan kriteria. Ini akan memilih objek dengan memfilter secara simultan oleh lebih dari satu bidang, dengan kata lain, kriteria penyaringan kueri biasanya akan terdiri dari antara 1 dan 5 bidang, mungkin lebih dalam beberapa kasus. Sedangkan bidang yang dipilih sebagai filter akan menjadi bagian dari jumlah bidang yang jauh lebih besar. Bayangkan sekitar 20 nama bidang yang ada, dan setiap kueri adalah upaya untuk memfilter objek berdasarkan beberapa bidang dari keseluruhan 20 bidang (Bisa kurang dari atau lebih dari 20 nama bidang keseluruhan yang ada, saya hanya menggunakan nomor ini untuk menunjukkan rasio dari bidang ke bidang yang digunakan sebagai filter dalam setiap permintaan diskrit). Pemfilteran bisa dengan keberadaan bidang yang dipilih, serta oleh nilai bidang, misalnya memfilter objek yang memiliki bidang A, dan bidang B di antara x dan y,

Aplikasi saya akan terus melakukan pemfilteran semacam ini, sedangkan tidak akan ada atau sedikit konstanta dalam hal bidang mana yang digunakan untuk pemfilteran setiap saat. Mungkin dalam indeks pencarian elastics perlu didefinisikan, tetapi mungkin bahkan tanpa indeks kecepatan setara dengan MongoDB.

Sesuai data yang masuk ke toko, tidak ada detail khusus tentang itu .. objek akan hampir tidak pernah berubah setelah dimasukkan. Mungkin objek lama perlu dijatuhkan, saya ingin mengasumsikan bahwa dukungan data store kedaluwarsa menghapus hal-hal secara internal atau oleh permintaan aplikasi yang dibuat. (Lebih jarang, objek yang cocok dengan kueri tertentu juga perlu dijatuhkan).

Bagaimana menurut anda? Dan, sudahkah Anda mencoba aspek ini?

Saya tertarik pada kinerja dan skalabilitasnya, dari masing-masing dari dua penyimpanan data, untuk tugas semacam ini. Ini adalah semacam pertanyaan desain arsitektur, dan rincian opsi khusus toko atau pilar permintaan yang harus membuatnya menjadi arsitek dapat diterima sebagai demonstrasi dari saran yang dipikirkan sepenuhnya.

Terima kasih!

matanster
sumber
Saya tidak tahu mengapa ini terus mendapatkan suara, apakah mereka opsi yang menonjol setelah sekian lama?
matanster
8
hanya menarik apa yang Anda pilih 6 tahun yang lalu dan apa expierence Anda sampai sekarang :)?
Arūnas Smaliukas
8
PEMBARUAN - Bagi mereka yang penasaran jika jawaban ini masih relevan, MongoDB sekarang memiliki indeks teks lengkap untuk memberikan fungsionalitas dan manfaat yang sama seperti yang dijelaskan oleh pencarian elastis dalam jawaban yang dipilih. Mereka disimpan sebagai indeks yang terpisah dan dapat ditanyakan sesuai kebutuhan tetapi Anda tidak kehilangan manfaat memiliki basis data tujuan umum. Saya telah menggunakan MongoDB untuk keperluan umum dan untuk permintaan pencarian teks untuk tahun lalu dan sangat merekomendasikannya. Hanya dua sen saya.
Jason Roell

Jawaban:

391

Pertama, ada perbedaan penting untuk dibuat di sini: MongoDB adalah database tujuan umum, Elasticsearch adalah mesin pencari teks terdistribusi yang didukung oleh Lucene. Orang-orang telah berbicara tentang menggunakan Elasticsearch sebagai basis data tujuan umum tetapi tahu bahwa itu bukan desain aslinya. Saya pikir bahwa tujuan umum database NoSQL dan mesin pencari sedang menuju konsolidasi tetapi seperti berdiri, keduanya berasal dari dua kubu yang sangat berbeda.

Kami menggunakan MongoDB dan Elasticsearch di perusahaan saya. Kami menyimpan data kami di MongoDB dan menggunakan Elasticsearch secara eksklusif untuk kemampuan pencarian teks lengkapnya. Kami hanya mengirim subset bidang data mongo yang kami perlu kueri ke elastis. Kasing penggunaan kami berbeda dengan milik Anda karena data Mongo kami berubah setiap saat: catatan, atau subset bidang catatan, dapat diperbarui beberapa kali sehari dan ini dapat meminta pengindeksan ulang catatan tersebut menjadi elastis. Untuk alasan itu saja, menggunakan elastis sebagai satu-satunya penyimpan data bukanlah pilihan yang baik bagi kami, karena kami tidak dapat memperbarui bidang yang dipilih; kita perlu mengindeks ulang dokumen secara keseluruhan. Ini bukan batasan elastis, ini adalah cara kerja Lucene, mesin pencari yang mendasari elastis. Dalam kasus Anda, fakta bahwa catatan tidak akan t diubah setelah disimpan menyelamatkan Anda dari keharusan membuat pilihan itu. Karena itu, jika keamanan data menjadi perhatian, saya akan berpikir dua kali tentang menggunakan Elasticsearch sebagai satu-satunya mekanisme penyimpanan untuk data Anda. Mungkin sampai di sana pada suatu titik tetapi saya tidak yakin itu ada di sana.

Dalam hal kecepatan, tidak hanya Elastis / Lucene setara dengan kecepatan kueri Mongo, dalam kasus Anda di mana ada "sangat sedikit konstanta dalam hal bidang mana yang digunakan untuk penyaringan setiap saat", itu bisa berupa pesanan dari besarnya lebih cepat, terutama karena dataset menjadi lebih besar. Perbedaannya terletak pada implementasi permintaan yang mendasarinya:

  • Elastic / Lucene menggunakan Vector Space Model dan indeks terbalik untuk Information Retrieval , yang merupakan cara yang sangat efisien untuk membandingkan kesamaan rekaman dengan kueri. Ketika Anda meminta Elastic / Lucene, ia sudah tahu jawabannya; sebagian besar pekerjaannya terletak di peringkat hasil untuk Anda oleh yang paling mungkin untuk mencocokkan istilah permintaan Anda. Ini adalah poin penting: mesin pencari, tidak seperti database, tidak dapat menjamin Anda hasil yang tepat; mereka memberi peringkat hasil berdasarkan seberapa dekat mereka dengan kueri Anda. Kebetulan bahwa sebagian besar waktu, hasilnya hampir tepat.
  • Pendekatan Mongo adalah penyimpanan data yang lebih umum; itu membandingkan dokumen JSON satu sama lain. Anda bisa mendapatkan kinerja yang hebat dengan segala cara, tetapi Anda perlu menyusun indeks dengan cermat untuk mencocokkan permintaan yang akan Anda jalankan. Khususnya, jika Anda memiliki beberapa bidang , Anda perlu menyusun dengan cermat kunci majemuksehingga mereka mengurangi dataset yang akan ditanyakan secepat mungkin. Misalnya kunci pertama Anda harus menyaring sebagian besar dataset Anda, yang kedua Anda harus lebih lanjut menyaring apa yang tersisa, dan seterusnya dan seterusnya. Jika kueri Anda tidak cocok dengan kunci dan urutan kunci-kunci itu dalam indeks yang ditentukan, kinerja Anda akan turun sedikit. Di sisi lain, Mongo adalah database yang benar, jadi jika akurasi adalah apa yang Anda butuhkan, jawaban yang diberikannya akan tepat.

Untuk catatan lama yang kedaluwarsa, Elastic memiliki fitur TTL bawaan. Mongo baru saja memperkenalkannya pada versi 2.2 saya pikir.

Karena saya tidak tahu persyaratan Anda yang lain seperti ukuran data yang diharapkan, transaksi, keakuratan atau seperti apa filter Anda, sulit untuk membuat rekomendasi khusus. Semoga ada cukup banyak di sini untuk memulai.

gstathis
sumber
92
Sekedar berkomentar bahwa ini mungkin tingkat respons tertinggi yang diharapkan pada topik arsitektur di situs ini. Terima kasih telah menjadi terpelajar, analitik, diartikulasikan, dan benar-benar terlibat dalam skenario.
matanster
12
Mengenai akurasi, Anda mungkin dapat mengendalikannya dengan Elastic / Lucene dengan memilih cara Anda memberi tokenize dan menganalisis bidang Anda. Jika bidang Anda tidak dianalisis (yaitu dipecah menjadi istilah yang dipisahkan oleh ruang), Anda dapat memaksa mesin pencari untuk memperlakukannya apa adanya. Kemudian, jika Anda kueri menggunakan kueri istilah ( elasticsearch.org/guide/reference/query-dsl/term-query.html ), Anda dapat memastikan bahwa Anda hanya mendapatkan hasil pencocokan tepat. Pendekatan ini akan mirip dengan bagaimana DB biasa akan melakukan pencocokan tepat.
gstathis
7
PEMBARUAN - Bagi mereka yang penasaran jika jawaban ini masih relevan, MongoDB sekarang memiliki indeks teks lengkap untuk memberikan fungsionalitas dan manfaat yang sama seperti yang dijelaskan oleh pencarian elastis dalam jawaban yang dipilih. Mereka disimpan sebagai indeks yang terpisah dan dapat ditanyakan sesuai kebutuhan tetapi Anda tidak kehilangan manfaat memiliki basis data tujuan umum. Saya telah menggunakan MongoDB untuk keperluan umum dan untuk permintaan pencarian teks untuk tahun lalu dan sangat merekomendasikannya. Hanya dua sen saya.
Jason Roell
@JasonRoell saya perlu mendengar bahwa dari seseorang, semua artikel lain di internet ditulis sebelum rilis indeks teks ketika regex lambat adalah satu-satunya pilihan. saya ingin melihat perbandingan kecepatan antara mongodb dan elasticsearch,
Dheeraj