Trước hết, có một sự khác biệt quan trọng cần thực hiện ở đây:MongoDB là một cơ sở dữ liệu mục đích chung, Elasticsearch là một công cụ tìm kiếm văn bản phân tán được hỗ trợ bởi Lucene. Mọi người đã nói về việc sử dụng Elasticsearch làm cơ sở dữ liệu mục đích chung nhưng biết rằng đó không phải là 'thiết kế ban đầu của nó. Tôi nghĩ rằng cơ sở dữ liệu NoSQL và công cụ tìm kiếm có mục đích chung đang được hợp nhất nhưng như hiện tại, cả hai đến từ hai phe rất khác nhau.
Chúng tôi đang sử dụng cả MongoDB và Elasticsearch trong công ty của tôi. Chúng tôi lưu trữ dữ liệu của mình trong MongoDB và sử dụng Elasticsearch dành riêng cho 'khả năng tìm kiếm toàn văn bản của nó. Chúng tôi chỉ gửi một tập hợp con của các trường dữ liệu mongo mà chúng tôi cần truy vấn để co giãn. Trường hợp sử dụng của chúng tôi khác với trường hợp của bạn ở chỗ dữ liệu Mongo của chúng tôi thay đổi liên tục:một bản ghi hoặc một tập hợp con của các trường của bản ghi, có thể được cập nhật vài lần trong ngày và điều này có thể khiến việc lập chỉ mục lại bản ghi đó trở nên đàn hồi. Chỉ vì lý do đó, sử dụng đàn hồi làm kho lưu trữ dữ liệu duy nhất không phải là một lựa chọn tốt cho chúng tôi, vì chúng tôi không thể cập nhật các trường đã chọn; chúng tôi sẽ cần lập chỉ mục lại toàn bộ tài liệu. Đây không phải là một giới hạn đàn hồi, đây là cách Lucene hoạt động, công cụ tìm kiếm cơ bản đằng sau đàn hồi. Trong trường hợp của bạn, thực tế là các bản ghi sẽ không bị thay đổi sau khi được lưu trữ giúp bạn không phải đưa ra lựa chọn đó. Phải nói rằng, nếu an toàn dữ liệu là một mối quan tâm, tôi sẽ suy nghĩ kỹ về việc sử dụng Elasticsearch làm cơ chế lưu trữ duy nhất cho dữ liệu của bạn. Nó có thể đến đó vào một lúc nào đó nhưng tôi không chắc nó đã ở đó.
Về tốc độ, không chỉ Elastic / Lucene ngang bằng với tốc độ truy vấn của Mongo, trong trường hợp của bạn khi có "rất ít hằng số về trường được sử dụng để lọc bất kỳ lúc nào", nó có thể là nhanh hơn, đặc biệt là khi tập dữ liệu trở nên lớn hơn. Sự khác biệt nằm ở việc triển khai truy vấn cơ bản:
- Elastic / Lucene sử dụng Mô hình không gian vectơ và các chỉ mục đảo ngược để Truy xuất thông tin, đây là những cách hiệu quả cao để so sánh mức độ tương tự của bản ghi với một truy vấn. Khi bạn truy vấn Elastic / Lucene, nó đã biết câu trả lời; hầu hết công việc của nó nằm ở việc xếp hạng kết quả cho bạn theo những kết quả có khả năng phù hợp nhất với các cụm từ truy vấn của bạn. Đây là một điểm quan trọng:công cụ tìm kiếm, trái ngược với cơ sở dữ liệu, không thể đảm bảo cho bạn kết quả chính xác; họ xếp hạng kết quả theo mức độ họ đến gần truy vấn của bạn. Điều này xảy ra là hầu hết các trường hợp, kết quả gần chính xác.
- Cách tiếp cận của Mongo là một kho lưu trữ dữ liệu có mục đích chung hơn; nó so sánh các tài liệu JSON với nhau. Bạn có thể đạt được hiệu suất tuyệt vời từ nó bằng mọi cách, nhưng bạn cần phải xây dựng các chỉ mục của mình một cách cẩn thận để phù hợp với các truy vấn bạn sẽ chạy. Cụ thể, nếu bạn có nhiều trường mà bạn sẽ truy vấn, bạn cần phải tạo các khóa ghép của mình một cách cẩn thận để chúng giảm bớt tập dữ liệu sẽ được truy vấn nhanh nhất có thể. Ví dụ. khóa đầu tiên của bạn sẽ lọc ra phần lớn tập dữ liệu của bạn, khóa thứ hai sẽ lọc thêm những gì còn lại, vân vân và vân vân. Nếu các truy vấn của bạn không khớp với các khóa và thứ tự của các khóa đó trong các chỉ mục đã xác định, hiệu suất của bạn sẽ giảm khá nhiều. Mặt khác, Mongo là một cơ sở dữ liệu thực sự, vì vậy nếu độ chính xác là những gì bạn cần, câu trả lời mà nó đưa ra sẽ được hiển thị ngay.
Đối với các bản ghi cũ sắp hết hạn, Elastic đã tích hợp sẵn tính năng TTL. Tôi nghĩ là Mongo vừa giới thiệu nó ở phiên bản 2.2.
Vì tôi không biết các yêu cầu khác của bạn như kích thước dữ liệu dự kiến, giao dịch, độ chính xác hoặc bộ lọc của bạn sẽ như thế nào, nên thật khó để đưa ra bất kỳ đề xuất cụ thể nào. Hy vọng rằng có đủ ở đây để giúp bạn bắt đầu.