elasticsearch vs MongoDB สำหรับการกรองแอปพลิเคชัน [ปิด]


180

คำถามนี้เกี่ยวกับการเลือกสถาปัตยกรรมก่อนเจาะลึกในรายละเอียดของการทดลองและการใช้งาน มันเกี่ยวกับความเหมาะสมในด้านความยืดหยุ่นและประสิทธิภาพของ elasticsearch vs MongoDB สำหรับจุดประสงค์ที่ค่อนข้างเฉพาะเจาะจง

สมมุติฐานทั้งเก็บวัตถุข้อมูลที่มีเขตข้อมูลและค่าและอนุญาตให้สอบถามเนื้อหาของวัตถุนั้น ดังนั้นการกรองชุดย่อยของวัตถุตามเขตข้อมูลที่เลือกไว้จึงเป็นสิ่งที่เหมาะสมสำหรับทั้งคู่

แอปพลิเคชันของฉันจะหมุนไปรอบ ๆ การเลือกวัตถุตามเกณฑ์ มันจะเลือกวัตถุโดยการกรองพร้อมกันโดยมากกว่าหนึ่งเขตข้อมูลใส่แตกต่างกันเกณฑ์การกรองแบบสอบถามของมันมักจะประกอบด้วยที่ใดก็ได้ระหว่าง 1 ถึง 5 สาขาอาจจะมากกว่าในบางกรณี ในขณะที่ฟิลด์ที่เลือกเป็นตัวกรองจะเป็นชุดย่อยของฟิลด์จำนวนมาก รูปภาพชื่อฟิลด์ 20 ชื่อที่มีอยู่และแต่ละแบบสอบถามเป็นความพยายามในการกรองวัตถุโดยไม่กี่ฟิลด์จาก 20 เขตข้อมูลโดยรวมเหล่านั้น (อาจเป็นชื่อฟิลด์โดยรวมที่มีอยู่น้อยกว่าหรือมากกว่า 20 ชื่อฉันใช้หมายเลขนี้เพื่อแสดงอัตราส่วน เขตข้อมูลไปยังเขตข้อมูลที่ใช้เป็นตัวกรองในแบบสอบถามแบบแยกทั้งหมด) การกรองสามารถทำได้โดยการมีอยู่ของเขตข้อมูลที่เลือกเช่นเดียวกับค่าของเขตข้อมูลเช่นการกรองวัตถุที่มีสนาม A และเขต B ของพวกเขาอยู่ระหว่าง x และ y

แอปพลิเคชันของฉันจะทำการกรองแบบนี้อย่างต่อเนื่องในขณะที่จะไม่มีอะไรคงที่หรือน้อยมากในแง่ของเขตข้อมูลที่จะใช้สำหรับการกรองในเวลาใดก็ได้ บางทีใน elasticsearch ดัชนีจะต้องมีการกำหนด แต่บางทีแม้จะไม่มีความเร็วดัชนีอยู่ในระดับเดียวกับ MongoDB

ตามข้อมูลที่เข้ามาในร้านไม่มีรายละเอียดพิเศษเกี่ยวกับสิ่งนั้น .. วัตถุเกือบจะไม่เปลี่ยนแปลงหลังจากถูกใส่เข้าไป บางทีวัตถุเก่าจะต้องถูกทิ้งไปฉันต้องการสมมติว่าแหล่งข้อมูลทั้งสองสนับสนุนการหมดอายุการลบสิ่งภายในหรือโดยแอปพลิเคชันที่ทำแบบสอบถาม (บ่อยน้อยกว่าวัตถุที่ตรงกับแบบสอบถามบางอย่างจะต้องลดลงเช่นกัน)

คุณคิดอย่างไร? และคุณได้ทดลองแง่มุมนี้ไหม?

ฉันสนใจในประสิทธิภาพและความสามารถในการปรับขยายได้ของที่เก็บข้อมูลสองแห่งสำหรับงานประเภทนี้ นี่เป็นคำถามเกี่ยวกับสถาปัตยกรรมและรายละเอียดของตัวเลือกเฉพาะร้านค้าหรือสิ่งสำคัญในการค้นหาที่ควรทำให้ได้รับการออกแบบอย่างดียินดีต้อนรับเพื่อเป็นการสาธิตข้อเสนอแนะที่คิดมาอย่างเต็มที่

ขอบคุณ!


ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงได้รับการโหวตพวกเขามีตัวเลือกที่โดดเด่นเช่นนี้มาเป็นเวลานานหรือไม่
matanster

8
น่าสนใจเพียงไรคุณเลือก 6 ปีที่แล้วและอะไรคือสิ่งที่คุณสนใจจนถึงตอนนี้ :)?
Arūnas Smaliukas

8
อัปเดต - สำหรับผู้ที่อยากรู้อยากเห็นหากคำตอบนี้ยังมีความเกี่ยวข้องตอนนี้ MongoDB มีดัชนีข้อความแบบเต็มเพื่อให้ฟังก์ชั่นและประโยชน์เช่นเดียวกับการค้นหายืดหยุ่นได้อธิบายไว้ในคำตอบที่เลือก พวกเขาจะถูกเก็บไว้เป็นดัชนีแยกต่างหากและสามารถสอบถามได้ตามต้องการ แต่คุณจะไม่สูญเสียผลประโยชน์ใด ๆ ของการมีฐานข้อมูลวัตถุประสงค์ทั่วไป ฉันใช้ MongoDB เพื่อวัตถุประสงค์ทั่วไปและเพื่อค้นหาข้อความในปีที่แล้วและขอแนะนำอย่างยิ่ง แค่สองเซ็นต์ของฉัน
Jason Roell

คำตอบ:


391

ก่อนอื่นมีความแตกต่างที่สำคัญที่จะทำให้ที่นี่: MongoDB เป็นฐานข้อมูลวัตถุประสงค์ทั่วไป Elasticsearch เป็นเครื่องมือค้นหาข้อความกระจายการสนับสนุนจาก Lucene ผู้คนได้พูดถึงการใช้ Elasticsearch เป็นฐานข้อมูลวัตถุประสงค์ทั่วไป แต่รู้ว่ามันไม่ใช่การออกแบบดั้งเดิม ฉันคิดว่าจุดประสงค์ทั่วไปของฐานข้อมูล NoSQL และเสิร์ชเอ็นจิ้นนั้นมุ่งเน้นไปที่การรวมเข้าด้วยกัน

เราใช้ทั้ง MongoDB และ Elasticsearch ใน บริษัท ของฉัน เราเก็บข้อมูลของเราใน MongoDB และใช้ Elasticsearch สำหรับความสามารถในการค้นหาข้อความแบบเต็ม เราจะส่งชุดย่อยของเขตข้อมูล Mongo ที่เราต้องการสอบถามเพื่อยืดหยุ่น กรณีการใช้งานของเราแตกต่างจากของคุณในกรณีที่ข้อมูล Mongo ของเราเปลี่ยนแปลงตลอดเวลา: บันทึกหรือชุดย่อยของเขตข้อมูลของระเบียนสามารถอัปเดตได้หลายครั้งต่อวันและสิ่งนี้สามารถเรียกใช้การจัดทำดัชนีของเร ด้วยเหตุผลดังกล่าวการใช้อีลาสติกเป็นที่เก็บข้อมูลเพียงอย่างเดียวจึงไม่ใช่ตัวเลือกที่ดีสำหรับเราเนื่องจากเราไม่สามารถอัปเดตฟิลด์ที่เลือก เราจะต้องจัดทำดัชนีเอกสารใหม่ให้ครบถ้วน นี่ไม่ใช่ข้อ จำกัด ที่ยืดหยุ่นนี่คือวิธีการทำงานของ Lucene เครื่องมือค้นหาที่อยู่เบื้องหลังความยืดหยุ่น ในกรณีของคุณความจริงที่ว่าระเบียนได้รับรางวัล ' ไม่สามารถเปลี่ยนแปลงได้เมื่อจัดเก็บแล้วช่วยให้คุณไม่ต้องทำการเลือก ต้องบอกว่าถ้าความปลอดภัยของข้อมูลเป็นเรื่องที่น่ากังวลฉันจะคิดสองครั้งเกี่ยวกับการใช้ Elasticsearch เป็นกลไกการจัดเก็บเพียงอย่างเดียวสำหรับข้อมูลของคุณ อาจถึงจุด ๆ หนึ่ง แต่ฉันก็ยังไม่แน่ใจ

ในแง่ของความเร็วไม่เพียง แต่เป็น Elastic / Lucene เทียบกับความเร็วในการสอบถามของ Mongo ในกรณีของคุณที่มี "ค่าคงที่น้อยมากในแง่ของเขตข้อมูลที่ใช้สำหรับการกรองในเวลาใดก็ได้" มันอาจเป็นคำสั่งของ ขนาดเร็วขึ้นโดยเฉพาะเมื่อชุดข้อมูลมีขนาดใหญ่ขึ้น ความแตกต่างอยู่ในการใช้งานแบบสอบถามพื้นฐาน:

  • Elastic / Lucene ใช้Vector Space Modelและดัชนีกลับหัวสำหรับการดึงข้อมูลซึ่งเป็นวิธีที่มีประสิทธิภาพสูงในการเปรียบเทียบความคล้ายคลึงกันของระเบียนกับแบบสอบถาม เมื่อคุณเคียวรี Elastic / Lucene มันจะรู้คำตอบอยู่แล้ว งานส่วนใหญ่นั้นอยู่ในการจัดอันดับผลลัพธ์สำหรับคุณโดยคนที่น่าจะตรงกับคำค้นหาของคุณมากที่สุด นี่คือจุดสำคัญ: เครื่องมือค้นหาซึ่งตรงข้ามกับฐานข้อมูลไม่สามารถรับประกันผลลัพธ์ที่แน่นอนได้ พวกเขาจัดอันดับผลลัพธ์ด้วยการเข้าใกล้คิวรีของคุณมากแค่ไหน มันเกิดขึ้นจนเกือบทุกครั้งผลลัพธ์ใกล้เคียงกับความจริง
  • วิธีการของ Mongo นั้นเป็นที่เก็บข้อมูลที่มีวัตถุประสงค์ทั่วไปมากกว่า มันเปรียบเทียบเอกสาร JSON กับอีกเอกสารหนึ่ง คุณสามารถได้รับประสิทธิภาพที่ยอดเยี่ยมจากทุกวิธี แต่คุณต้องจัดทำดัชนีของคุณอย่างระมัดระวังเพื่อให้ตรงกับข้อความค้นหาที่คุณกำลังเรียกใช้ โดยเฉพาะถ้าคุณมีหลายฟิลด์ที่คุณจะทำการสืบค้นคุณจะต้องสร้างคีย์ผสมของคุณอย่างรอบคอบเพื่อลดชุดข้อมูลที่จะทำการสืบค้นให้เร็วที่สุด เช่นคีย์แรกของคุณควรกรองชุดข้อมูลส่วนใหญ่ของคุณชุดที่สองของคุณควรกรองสิ่งที่เหลือและอื่น ๆ ไปเรื่อย ๆ หากคำค้นหาของคุณไม่ตรงกับคีย์และลำดับของคีย์เหล่านั้นในดัชนีที่กำหนดประสิทธิภาพของคุณจะลดลงเล็กน้อย ในทางกลับกัน Mongo เป็นฐานข้อมูลที่แท้จริงดังนั้นหากความถูกต้องเป็นสิ่งที่คุณต้องการคำตอบที่จะให้นั้นจะเป็นจุดที่ถูกต้อง

สำหรับการหมดอายุบันทึกเก่ายืดหยุ่นมีคุณสมบัติ TTL ในตัว Mongo เพิ่งเปิดตัวเป็นเวอร์ชั่น 2.2 ฉันคิดว่า

เนื่องจากฉันไม่ทราบข้อกำหนดอื่น ๆ ของคุณเช่นขนาดข้อมูลที่คาดไว้ธุรกรรมความถูกต้องหรือสิ่งที่ตัวกรองของคุณจะมีลักษณะเช่นนั้นจึงยากที่จะให้คำแนะนำเฉพาะ หวังว่าจะมีที่นี่พอที่จะให้คุณเริ่มต้น


92
เพียงเพื่อแสดงความคิดเห็นว่านี่อาจเป็นระดับสูงสุดของการตอบสนองที่จะหวังในหัวข้อสถาปัตยกรรมในเว็บไซต์นี้ ขอบคุณสำหรับการเรียนรู้วิเคราะห์พูดชัดแจ้งและมีส่วนร่วมอย่างแท้จริงในสถานการณ์
matanster

12
เกี่ยวกับความแม่นยำคุณสามารถควบคุมด้วย Elastic / Lucene ได้โดยเลือกวิธีที่คุณโทเค็นและวิเคราะห์เขตข้อมูลของคุณ หากฟิลด์ของคุณไม่ได้รับการวิเคราะห์ (เช่นแบ่งออกเป็นคำที่คั่นด้วยช่องว่าง) คุณสามารถบังคับให้เครื่องมือค้นหาปฏิบัติต่อพวกเขาตามที่เป็นอยู่ จากนั้นหากคุณค้นหาโดยใช้ข้อความค้นหา ( elasticsearch.org/guide/reference/query-dsl/term-query.html ) คุณสามารถมั่นใจได้ว่าคุณได้รับผลลัพธ์การจับคู่ที่ตรงกันเท่านั้น วิธีนี้จะคล้ายกับวิธีการที่ DB ปกติจะทำการแข่งขันที่แน่นอน
gstathis

7
อัปเดต - สำหรับผู้ที่อยากรู้อยากเห็นหากคำตอบนี้ยังมีความเกี่ยวข้องตอนนี้ MongoDB มีดัชนีข้อความแบบเต็มเพื่อให้ฟังก์ชั่นและประโยชน์เช่นเดียวกับการค้นหายืดหยุ่นได้อธิบายไว้ในคำตอบที่เลือก พวกเขาจะถูกเก็บไว้เป็นดัชนีแยกต่างหากและสามารถสอบถามได้ตามต้องการ แต่คุณจะไม่สูญเสียผลประโยชน์ใด ๆ ของการมีฐานข้อมูลวัตถุประสงค์ทั่วไป ฉันใช้ MongoDB เพื่อวัตถุประสงค์ทั่วไปและเพื่อค้นหาข้อความในปีที่แล้วและขอแนะนำอย่างยิ่ง แค่สองเซ็นต์ของฉัน
Jason Roell

@ JasonRoell ฉันต้องการที่จะได้ยินจากใครบางคนบทความอื่น ๆ ทั้งหมดบนอินเทอร์เน็ตถูกเขียนขึ้นก่อนที่จะปล่อยดัชนีข้อความเมื่อ regex ช้าเป็นตัวเลือกเดียว ฉันชอบที่จะเห็นการเปรียบเทียบความเร็วระหว่าง MongoDB กับ Elasticsearch
Dheeraj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.