NoQuery (MongoDB) so với Lucene (hoặc Solr) làm cơ sở dữ liệu của bạn


280

Với phong trào NoQuery đang phát triển dựa trên cơ sở dữ liệu dựa trên tài liệu, tôi đã xem xét MongoDB gần đây. Tôi đã nhận thấy sự tương đồng đáng kinh ngạc với cách coi các vật phẩm là "Tài liệu", giống như Lucene (và người dùng Solr).

Vì vậy, câu hỏi: Tại sao bạn muốn sử dụng NoQuery (MongoDB, Cassandra, CouchDB, v.v.) trên Lucene (hoặc Solr) làm "cơ sở dữ liệu" của bạn?

Những gì tôi (và tôi chắc chắn rằng những người khác đang tìm kiếm trong một câu trả lời là một số so sánh sâu sắc của họ. Chúng ta hãy bỏ qua các cuộc thảo luận cơ sở dữ liệu quan hệ cùng nhau, vì chúng phục vụ một mục đích khác nhau.

Lucene cung cấp một số lợi thế nghiêm trọng, chẳng hạn như hệ thống tìm kiếm và trọng lượng mạnh mẽ. Không đề cập đến các khía cạnh trong Solr (mà Solr sẽ sớm được tích hợp vào Lucene, yay!). Bạn có thể sử dụng các tài liệu Lucene để lưu trữ ID và truy cập các tài liệu giống như MongoDB. Trộn nó với Solr và bây giờ bạn có được một giải pháp cân bằng tải dựa trên WebService.

Bạn thậm chí có thể so sánh các nhà cung cấp bộ đệm ngoài luồng như Velocity hoặc MemCached khi nói về lưu trữ dữ liệu tương tự và khả năng mở rộng của MongoDB.

Các hạn chế xung quanh MongoDB nhắc nhở tôi về việc sử dụng MemCached, nhưng tôi có thể sử dụng Velocity của Microsoft và có nhiều khả năng phân nhóm và liệt kê danh sách hơn MongoDB (tôi nghĩ). Không thể nhận được bất kỳ tốc độ nhanh hơn hoặc có thể mở rộng hơn dữ liệu bộ nhớ đệm trong bộ nhớ. Ngay cả Lucene cũng có một nhà cung cấp bộ nhớ.

MongoDB (và những người khác) có một số lợi thế, chẳng hạn như dễ sử dụng API của họ. Mới lập một tài liệu, tạo một id và lưu trữ nó. Làm xong. Tốt đẹp và dễ dàng.



4
Cảm ơn bạn, nhưng điều đó không trả lời câu hỏi của tôi: đó là, tại sao tôi sẽ sử dụng MongoDB thay vì Lucene cho cơ sở dữ liệu của mình? Cả hai đều xử lý tài liệu, nhưng Lucene có một số tùy chọn tìm kiếm rất mạnh mẽ. +1 mặc dù thực sự tìm thấy một câu hỏi liên quan. Tôi tìm kiếm nhiều lần trên Stackoverflow và không đưa ra một so sánh gần.
eduncan911

Bạn đang sử dụng Lucene như thế nào mà nó cung cấp chức năng tương tự MongoDB? Bạn đang buộc nó vào một DB quan hệ để lưu trữ?
Philip Tinney

1
@Philip: Đó là một câu hỏi giả định. Tại sao không sử dụng Lucene làm nơi lưu trữ tài liệu của bạn? Bạn nhận được nhiều sức mạnh tìm kiếm và khả năng mở rộng hơn (khi trộn với Solr, khiến Lucene thậm chí còn dễ sử dụng hơn).
eduncan911

Câu trả lời:


250

Đây là một câu hỏi tuyệt vời, một cái gì đó tôi đã suy nghĩ khá nhiều. Tôi sẽ tóm tắt những bài học của tôi đã học:

  1. Bạn có thể dễ dàng sử dụng Lucene / Solr thay cho MongoDB cho tất cả các tình huống, nhưng không phải ngược lại. Bài viết của Grant Ingersoll tổng hợp nó ở đây.

  2. MongoDB, vv dường như phục vụ một mục đích mà không có yêu cầu tìm kiếm và / hoặc faceting. Nó dường như là một quá trình chuyển đổi đơn giản hơn và dễ dàng hơn cho các lập trình viên cai nghiện từ thế giới RDBMS. Trừ khi ai đó quen với nó, Lucene & Solr có một đường cong học tập dốc hơn.

  3. Không có nhiều ví dụ về việc sử dụng Lucene / Solr làm kho dữ liệu, nhưng Guardian đã thực hiện một số bước tiến và tóm tắt điều này trong một sàn trượt tuyệt vời , nhưng họ cũng không tham gia vào việc nhảy hoàn toàn vào băng nhóm Solr và "điều tra" kết hợp Solr với CouchDB.

  4. Cuối cùng, tôi sẽ cung cấp kinh nghiệm của chúng tôi, tiếc là không thể tiết lộ nhiều về trường hợp kinh doanh. Chúng tôi làm việc trên quy mô của một vài TB dữ liệu, một ứng dụng gần thời gian thực. Sau khi điều tra các kết hợp khác nhau, quyết định gắn bó với Solr. Không hối tiếc cho đến nay (6 tháng và đếm) và không thấy lý do gì để chuyển sang một số khác.

Tóm tắt: nếu bạn không có yêu cầu tìm kiếm, Mongo cung cấp một cách tiếp cận đơn giản và mạnh mẽ. Tuy nhiên, nếu tìm kiếm là chìa khóa cho sản phẩm của bạn, bạn có khả năng tốt hơn nên gắn bó với một công nghệ (Solr / Lucene) và tối ưu hóa cái quái vật đó - ít bộ phận chuyển động hơn.

2 xu của tôi, hy vọng rằng đã giúp.


10
Solr không có chức năng giảm bản đồ. Do đó, báo cáo, số liệu thống kê, tính toán điểm số vv là không thể! Chỉ sử dụng Solr nếu bạn có / có thể đe dọa dữ liệu của mình dưới dạng dữ liệu văn bản
Roland Kofler

8
Solr không tích hợp sẵn bản đồ, nhưng bạn có thể kết hợp với Hadoop. architects.dzone.com/articles/solr-hadoop-big-data-love
Mikos

6
Map-less no, nhưng nó có khả năng chạy truy vấn song song trên nhiều máy chủ solr và tổng hợp các kết quả đó. Vì vậy, trong khi nó không có mục đích chung là giảm bản đồ, nó đã viết những gì bạn sẽ viết bằng map-less, đó là các truy vấn tìm kiếm song song.
chubbsondub

@Roo: Nó có phải là một tùy chọn để sử dụng Lucene làm DB chính và tạo các chỉ mục tổng hợp với MongoDB bằng cách nào đó không? Hay điều đó không có ý nghĩa? Và Mikos: câu trả lời tuyệt vời và +1 cho đề cập đến trải nghiệm thực tế.
Nỗi sợ hãi tuyệt vọng

2
từ solr6, nó hỗ trợ chức năng giảm bản đồ với các biểu thức song song
Divyang Shah

36

Bạn không thể cập nhật một phần tài liệu trong solr. Bạn phải đăng lại tất cả các trường để cập nhật tài liệu.

Và vấn đề hiệu suất. Nếu bạn không cam kết, thay đổi của bạn thành solr sẽ không có hiệu lực, nếu bạn cam kết mỗi lần, hiệu suất sẽ bị ảnh hưởng.

Không có giao dịch trong solr.

Vì solr có những nhược điểm này, đôi khi nosql là lựa chọn tốt hơn.


13
MongoDB cũng không có giao dịch.
dùng183037

1
Solr hoặc Lucene có tìm kiếm thời gian thực, vì vậy cam kết không phải là vấn đề.
mihaicc

1
@ user183037 trong MongoDB mọi cập nhật trong tài liệu là Nguyên tử. Và FYI, Lucene cũng không có giao dịch (theo nghĩa của bạn)
Aravind Yarram

48
Câu trả lời này đã trở thành không chính xác. Solr 4+ không hỗ trợ cập nhật một phần và các cam kết mềm / gần thời gian thực sẽ loại bỏ hầu hết các vấn đề của cam kết "kiểu cũ".
Mauricio Scheffer

1
Họ đã thêm hỗ trợ cho các giao dịch trên MongoDB 4.
Jonas

26

Chúng tôi sử dụng MongoDB và Solr cùng nhau và chúng hoạt động tốt. Bạn có thể tìm thấy bài đăng trên blog của tôi ở đây nơi tôi đã mô tả cách chúng tôi sử dụng các công nghệ này cùng nhau. Đây là một đoạn trích:

[...] Tuy nhiên, chúng tôi quan sát thấy hiệu suất truy vấn của Solr giảm khi kích thước chỉ mục tăng. Chúng tôi nhận ra rằng giải pháp tốt nhất là sử dụng cả Solr và Mongo DB cùng nhau. Sau đó, chúng tôi tích hợp Solr với MongoDB bằng cách lưu trữ nội dung vào MongoDB và tạo chỉ mục bằng Solr để tìm kiếm toàn văn. Chúng tôi chỉ lưu trữ id duy nhất cho mỗi tài liệu trong chỉ mục Solr và truy xuất nội dung thực tế từ MongoDB sau khi tìm kiếm trên Solr. Nhận tài liệu từ MongoDB nhanh hơn Solr vì không có máy phân tích, ghi điểm, v.v ... []]


3
Bài đăng blog tốt. Vâng, đây chính xác là cách tôi đã sử dụng Lucene trong quá khứ với kho dữ liệu SQL và MySql cũ hơn (lưu trữ ID trong Lucene và truy xuất các loại phức tạp từ kho dữ liệu). Về mặt kỹ thuật, câu hỏi này là để khám phá sự khác biệt giữa hai - không chính xác làm thế nào để sử dụng "tốt nhất của cả hai thế giới." +1 để sử dụng theo cách đó, vì đó thực sự là cách thực sự duy nhất để sử dụng lượng dữ liệu khổng lồ.
eduncan911

Cám ơn phản hồi của bạn. Tôi biết rằng câu hỏi là về việc chọn Nosql thay vì Lucene nhưng ở đây tôi muốn chỉ ra rằng, thay vì chọn cái này hơn cái khác, sử dụng chúng theo cách lai sẽ cho kết quả tốt hơn.
Parvin Gasimzade

2
Bạn có nhớ (bây giờ 1,5 năm sau) gần bằng kích thước của cơ sở dữ liệu Solr khi hiệu suất truy vấn đã giảm rất nhiều nên bạn bắt đầu nghĩ đến việc thêm MongoDB? (Đó là 10.000 tài liệu hay 10.000.000 tài liệu?)
KajMagnus

Rất hữu ích. Tôi làm việc trong GIS và vì vậy việc có thể kết hợp toàn văn với tìm kiếm không gian theo cách này rất hấp dẫn. Chúng tôi đã sử dụng MongoDB và Postgres và tôi đã suy nghĩ về Solr một thời gian.
John Powell

2
@ParvinGasimzade liên kết bài đăng blog không hoạt động. Bạn có thể vui lòng cung cấp một liên kết hoặc nguồn khác?
lãng quên

24

Ngoài ra, xin lưu ý rằng một số người đã tích hợp Solr / Lucene vào Mongo bằng cách lưu trữ tất cả các chỉ mục trong Solr và cũng giám sát các hoạt động oplog và xếp tầng các cập nhật có liên quan vào Solr.

Với phương pháp lai này, bạn thực sự có thể có cả hai thế giới tốt nhất với các khả năng như tìm kiếm toàn văn bản và đọc nhanh với kho dữ liệu đáng tin cậy cũng có thể có tốc độ ghi nhanh.

Đó là một chút kỹ thuật để thiết lập nhưng có rất nhiều thợ may oplog có thể tích hợp vào solr. Kiểm tra những gì rangespan đã làm trong bài viết này.

http://den normalised.com/home/mongodb-pub-sub-USE-the-replication-oplog.html


Nếu tôi hiểu đúng về bạn, lý do bạn sử dụng MongoDB (ngoài Solr), đó có phải là MongoDB có tốc độ chèn nhanh hơn + tốc độ đọc không? Bạn cũng đã chỉ ra rằng MongoDB có kho dữ liệu đáng tin cậy hơn? (Hoặc bạn đã đề cập đến Solr?) - Ban đầu bạn đã bắt đầu với cái gì? Chỉ MongoDB, chỉ Solr, hoặc cả Mongo + Solr?
KajMagnus

12

Từ kinh nghiệm của tôi với cả hai, Mongo rất tuyệt cho việc sử dụng đơn giản, dễ hiểu. Nhược điểm chính của Mongo mà chúng tôi phải chịu là hiệu suất kém đối với các truy vấn không dự đoán được (bạn không thể tạo chỉ mục mongo cho tất cả các kết hợp bộ lọc / sắp xếp có thể, bạn không thể đơn giản).

Và tại đây, nơi Lucene / Solr chiếm ưu thế thời gian lớn, đặc biệt là với bộ nhớ đệm FilterQuery, Hiệu suất rất nổi bật.


10

Vì không có ai khác đề cập đến nó, nên tôi thêm rằng MongoDB không có lược đồ, trong khi Solr thi hành một lược đồ. Vì vậy, nếu các trường trong tài liệu của bạn có thể thay đổi, đó là một lý do để chọn MongoDB thay vì Solr.


6
IMHO không hoàn toàn đúng. Solr có một lược đồ như được định nghĩa trong schema.xml, NHƯNG nó cũng có 'trường động', tức là các trường có loại được xác định thông qua thẻ đại diện, do đó bạn có thể có tất cả các trường khớp, giả sử, *_iđược lập chỉ mục là trường số nguyên. khi thêm tài liệu, sau đó bạn có thể có tài liệu conaining lĩnh vực như count_i, foo_i, bar_imà tất cả đều được hiểu như là lĩnh vực số nguyên mà không xuất hiện trong schema.xmlnghĩa đen. khá ít lược đồ, tôi muốn nói. xem youtube.com/watch?v=WYVM6Wz-XTw để biết thêm.
chảy

Tôi phải quay lại và tăng số này lên +1 vì đó là sự thật - các thay đổi lược đồ trong Solr luôn nằm trong PITA để giữ đồng bộ với các kho dữ liệu khác.
eduncan911

4
Solr có một tính năng hỗ trợ lược đồ hoặc không có lược đồ!
Krunal

5

@ mauricio-scheffer đã đề cập đến Solr 4 - đối với những người quan tâm đến điều đó, LucidWorks đang mô tả Solr 4 là "Máy chủ tìm kiếm NoQuery" và có một video tại http://www.lucidworks.com/webinar-solr-4-the-nosql -search-server / nơi họ đi vào chi tiết về các tính năng của NoQuery (ish). (The -ish dành cho phiên bản schemaless của họ thực sự là một lược đồ động.)


1

Nếu bạn chỉ muốn lưu trữ dữ liệu bằng định dạng khóa-giá trị, Lucene không được khuyến nghị vì chỉ mục đảo ngược của nó sẽ lãng phí quá nhiều không gian đĩa. Và với việc lưu dữ liệu trong đĩa, hiệu suất của nó chậm hơn nhiều so với cơ sở dữ liệu NoQuery như redis vì redis lưu dữ liệu trong RAM. Ưu điểm nhất đối với Lucene là nó hỗ trợ nhiều truy vấn, vì vậy các truy vấn mờ có thể được hỗ trợ.


1

Các giải pháp của bên thứ ba, như đuôi op-log mongo rất hấp dẫn. Một số suy nghĩ hoặc câu hỏi vẫn còn về việc các giải pháp có thể được tích hợp chặt chẽ hay không, giả sử viễn cảnh phát triển / kiến ​​trúc. Tôi không mong đợi thấy một giải pháp tích hợp chặt chẽ cho các tính năng này vì một số lý do (hơi suy đoán và có thể làm rõ và không cập nhật với các nỗ lực phát triển):

  • mongo là c ++, lucene / solr là java
  • lucene hỗ trợ các định dạng tài liệu khác nhau
    • mongo tập trung vào JSON (BSON)
  • lucene sử dụng tài liệu bất biến
    • cập nhật trường đơn là một vấn đề, nếu chúng có sẵn
  • chỉ số lucene là bất biến với ops hợp nhất phức tạp
  • truy vấn mongo là javascript
  • mongo không có máy phân tích văn bản / mã thông báo (AFAIK)
  • kích thước tài liệu mongo bị giới hạn, có thể đi ngược lại với hạt cho lucene
  • ops tập hợp mongo có thể không có chỗ trong lucene
    • lucene có các tùy chọn để lưu trữ các trường trên các tài liệu, nhưng đó không phải là điều tương tự
    • solr bằng cách nào đó cung cấp tổng hợp / thống kê và truy vấn SQL / đồ thị

0

MongoDB Atlas sẽ sớm có một công cụ tìm kiếm dựa trên lucene. Thông báo lớn được đưa ra tại hội nghị MongoDB World 2019 tuần này. Đây là một cách tuyệt vời để khuyến khích sử dụng nhiều hơn sản phẩm MongoDB Atlas có doanh thu cao của họ.

Tôi đã hy vọng thấy nó được đưa vào MongoDB Enterprise phiên bản 4.2 nhưng không có tin tức gì về việc đưa nó vào dòng sản phẩm tại chỗ của họ.

Thêm thông tin ở đây: https://www.mongodb.com/atlas/full-text-search

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.