Veritabanınız olarak NoSQL (MongoDB) vs Lucene (veya Solr)


280

Belge tabanlı veritabanlarına dayalı olarak büyüyen NoSQL hareketi ile son zamanlarda MongoDB'ye baktım. Lucene'nin (ve Solr kullanıcılarının) yaptığı gibi, "Belgeler" olarak nasıl davranılacağına dair çarpıcı bir benzerlik fark ettim.

Peki, soru: Neden NoSQL'i (MongoDB, Cassandra, CouchDB, vb.) Lucene (veya Solr) üzerinde "veritabanı" olarak kullanmak istersiniz?

Ben bir cevapta aradığım (ve başkalarının da olduğundan emin olduğum) onların derin dalış karşılaştırmalarıdır. İlişkisel veritabanı tartışmalarını farklı bir amaca hizmet ettikleri için birlikte atlayalım.

Lucene, güçlü arama ve ağırlık sistemleri gibi bazı ciddi avantajlar sağlar. Solr'daki yönlerden bahsetmiyorum (Solr yakında Lucene'ye entegre edilecek, yay!). Kimlikleri saklamak ve tıpkı MongoDB gibi belgelere erişmek için Lucene belgelerini kullanabilirsiniz. Solr ile karıştırın ve şimdi WebService tabanlı, yük dengeli bir çözüm elde edersiniz.

Benzer veri depolama ve MongoDB'nin ölçeklenebilirliği hakkında konuşurken Velocity veya MemCached gibi proc-proc önbellek sağlayıcılarının bir karşılaştırmasını bile yapabilirsiniz.

MongoDB ile ilgili kısıtlamalar MemCached'i kullanmamı hatırlatıyor, ancak Microsoft'un Hızını kullanabilir ve MongoDB üzerinde daha fazla gruplama ve liste toplama gücüne sahip olabilirim (sanırım). Bellekteki verileri önbelleğe almaktan daha hızlı veya ölçeklenebilir olamaz. Lucene'nin bile bir bellek sağlayıcısı var.

MongoDB (ve diğerleri), API'lerinin kullanım kolaylığı gibi bazı avantajlara sahiptir. Bir belge oluşturun, bir kimlik oluşturun ve saklayın. Bitti. Güzel ve kolay.



4
Teşekkür ederim, ama bu sorumu cevaplamıyor: yani, veritabanım için neden Lucene yerine MongoDB'yi kullanayım? Her ikisi de belgeleri işler, ancak Lucene'nin çok güçlü arama seçenekleri vardır. Ancak ilgili bir soruyu bulmak için + 1'leyin. Stackoverflow üzerinde birkaç kez arama ve yakın bir karşılaştırma ile gelmedi.
eduncan911

Lucene'yi MongoDB'ye benzer işlevler sağladığı için nasıl kullanıyorsunuz? Depolama için ilişkisel bir DB'ye mi bağlıyorsunuz?
Philip Tinney

1
@Philip: Bu varsayımsal bir soru. Neden Lucene'i belge deponuz olarak kullanmıyorsunuz? Çok daha fazla arama gücü ve ölçeklenebilirlik elde edersiniz (Solr ile karıştırıldığında Lucene'in kullanımını daha da kolaylaştırır).
eduncan911

Yanıtlar:


250

Bu harika bir soru, biraz düşündüğüm bir şey. Öğrenilen derslerimi özetleyeceğim:

  1. Lucene / Solr'u hemen hemen tüm durumlar için MongoDB yerine kolayca kullanabilirsiniz, ancak bunun tersi de mümkün değildir. Grant Ingersoll'un gönderisi burada özetliyor.

  2. MongoDB vb., Arama ve / veya faceting gerekmediği bir amaca hizmet ediyor gibi görünmektedir. RDBMS dünyasından detoks yapan programcılar için daha basit ve tartışmasız daha kolay bir geçiş gibi görünüyor. Birisi buna alışmadıkça Lucene & Solr daha dik bir öğrenme eğrisine sahiptir.

  3. Lucene / Solr'i bir veri deposu olarak kullanmanın pek bir örneği yok, ancak Guardian bir yol kat etti ve bunu mükemmel bir slayt güvertesinde özetledi , ancak onlar da Solr bandwagonuna tamamen atlamak ve Solr'ı birleştirerek "araştırmak" konusunda kararsız değiller CouchDB ile.

  4. Son olarak, deneyimlerimizi sunacağım, maalesef iş vakası hakkında çok fazla bilgi veremem. Gerçek zamanlıya yakın bir uygulama olan birkaç TB veri ölçeği üzerinde çalışıyoruz. Çeşitli kombinasyonları araştırdıktan sonra Solr. Şimdiye kadar pişmanlık yok (6 ay ve sayım) ve başka birine geçmek için hiçbir neden görmüyorum.

Özet: bir arama gereksiniminiz yoksa, Mongo basit ve güçlü bir yaklaşım sunar. Bununla birlikte, arama teklifinizin anahtarı ise, muhtemelen bir teknolojiye (Solr / Lucene) bağlı kalmanız ve halkı optimize etmeniz daha iyi olur - daha az hareketli parça.

Benim 2 sent, umarım yardımcı oldu.


10
Solr'un harita azaltma işlevi yoktur. Bu nedenle raporlama, istatistikler, puanların hesaplanması vb. Mümkün değildir! Solr'u yalnızca verilerinizi metin verisi olarak tehdit ediyorsanız / tehdit edebiliyorsa kullanın
Roland Kofler

8
Solr'da yerleşik harita azaltma özelliği yoktur, ancak Hadoop ile birleştirebilirsiniz. architects.dzone.com/articles/solr-hadoop-big-data-love
Mikos

6
Harita azaltma hayır, ancak birden çok solr sunucusunda paralel olarak bir sorgu çalıştırma ve bu sonuçları toplama yeteneği vardır. Genel amaçlı bir harita azaltma özelliği olmasa da, paralel arama sorguları olan harita azaltma ile ne yazacağınızı zaten yazmıştır.
chubbsondubs

@Roo: Lucene'yi ana DB olarak kullanmak ve bir şekilde MongoDB ile toplu dizinler oluşturmak bir seçenek olabilir mi? Yoksa mantıklı değil mi? Ve Mikos: gerçek dünya deneyimi için harika bir cevap ve +1.
Umutsuzluğun Yüz burcu

2
Solr6'dan paralel ifadelerle harita azaltma işlevselliğini destekler
Divyang Shah

36

Solr'da bir belgeyi kısmen güncelleyemezsiniz. Bir belgeyi güncellemek için tüm alanları yeniden göndermeniz gerekir.

Ve performans önemlidir. Taahhüt etmezseniz, solr'daki değişikliğiniz etkili olmaz, her seferinde taahhüt ederseniz performans düşer.

Solr'da işlem yok.

Solr bu dezavantajlara sahip olduğundan, bazen nosql daha iyi bir seçimdir.


13
MongoDB'nin de işlemleri yoktur.
user183037

1
Solr veya Lucene gerçek zamanlı aramaya sahip, bu yüzden taahhüt etmek sorun değil.
mihaicc

1
@ user183037 in MongoDB bir belgedeki herhangi bir güncelleme Atomic'dir. Ve FYI, Lucene'in de (sizin adınıza) işlemleri yok
Aravind Yarram

48
Bu cevap yanlış oldu. Solr 4+ kısmi güncellemeleri destekliyor ve "eski stil" Solr taahhütlerinin çoğu sorunuyla yumuşak taahhütler / gerçek zamanlıya yakın bir zamanda ortadan kalkıyor.
Mauricio Scheffer

1
MongoDB 4'teki işlemler için destek eklediler.
Jonas

26

MongoDB ve Solr'ı birlikte kullanıyoruz ve iyi performans gösteriyorlar. Blog yayınımı burada bu teknolojileri birlikte nasıl kullandığımızı açıkladığım yerde bulabilirsiniz . İşte bir alıntı:

[...] Ancak, dizin boyutu arttıkça Solr'un sorgu performansının düştüğünü gözlemliyoruz. En iyi çözümün hem Solr hem de Mongo DB'yi birlikte kullanmak olduğunu fark ettik. Ardından, içeriği MongoDB'ye depolayarak ve tam metin araması için Solr kullanarak dizin oluşturarak Solr'ı MongoDB ile entegre ediyoruz. Her belge için benzersiz kimliği yalnızca Solr dizininde saklıyoruz ve Solr'da arama yaptıktan sonra gerçek içeriği MongoDB'den alıyoruz. MongoDB'den belge almak Solr'dan daha hızlıdır çünkü analizör, puanlama vb. Yoktur. [...]


3
İyi blog yazısı. Evet, geçmişte Lucene'i eski SQL ve MySql veri depolarıyla (Lucene'de kimlikleri depolamak ve karmaşık türleri veri deposundan almak) bu şekilde kullandım. Teknik olarak, bu soru ikisi arasındaki farkları araştırmaktı - tam olarak "her iki dünyanın en iyisi" nin nasıl kullanılacağı değil. Bu şekilde kullandığınız için +1, çünkü büyük miktarda veri kullanmanın tek gerçek yolu budur.
eduncan911

Yanıtınız için teşekkürler. Sorunun Lucene üzerinde Nosql seçmekle ilgili olduğunu biliyorum, ancak burada, diğerini seçmek yerine, onları melez bir şekilde kullanmanın daha iyi sonuç vereceğini göstermek istiyorum.
Parvin Gasimzade

2
Sorgu performansı çok düştüğünde (şimdi 1,5 yıl sonra) kabaca Solr veritabanının boyutunu hatırlıyor musunuz, böylece MongoDB eklemeyi düşünmeye başladınız mı? (10.000 doküman mı yoksa 10.000.000 doküman mı?)
KajMagnus

Çok yararlı. CBS'de çalışıyorum ve bu nedenle tam metni mekansal arama ile birleştirebilmem çok ilginç. Zaten MongoDB ve Postgres kullanıyoruz ve bir süredir Solr'ı düşünüyorum.
John Powell

2
@ParvinGasimzade blog yazısı bağlantısı çalışmıyor. Lütfen başka bir bağlantı veya kaynak sağlayabilir misiniz?
unutulma

24

Ayrıca, bazı kişilerin tüm endekslerin Solr'da depolanmasını sağlayarak ve ayrıca oplog işlemlerini izleyerek ve ilgili güncellemeleri Solr'a basamaklayarak Solr / Lucene'yi Mongo'ya entegre ettiğini lütfen unutmayın.

Bu hibrit yaklaşımla, tam metin araması ve hızlı okuma gibi yetenekleri ile her iki dünyanın da en iyisine sahip olabilirsiniz.

Kurulumu biraz teknik ama solr ile entegre olabilen birçok oplog döşeme var. Bu makalede hangi menzilin yapıldığına bakın.

http://denormalised.com/home/mongodb-pub-sub-using-the-replication-oplog.html


Sizi doğru anladıysam, MongoDB'yi kullanmanın nedeni (Solr'a ek olarak), MongoDB'nin daha hızlı yerleştirme + okuma hızı olması mı? Ayrıca MongoDB'nin daha güvenilir bir veri deposuna sahip olduğunu mu belirtdiniz? (Yoksa Solr'a mı atıfta bulundunuz?) - Başlangıçta ne ile başladınız? Sadece MongoDB, sadece Solr veya her ikisi de Mongo + Solr?
KajMagnus

12

Her ikisiyle de yaşadığım deneyime göre, Mongo basit, basit kullanım için mükemmeldir. Yaşadığımız ana Mongo dezavantajı, beklenmedik sorgular üzerindeki düşük performanstır (tüm olası filtre / sıralama kombinasyonları için mongo dizinleri oluşturamazsınız, basit yapamazsınız).

Ve burada Lucene / Solr'un özellikle FilterQuery önbelleklemesi ile büyük zaman kazandığı Performans olağanüstü.


10

Hiç kimse bundan bahsetmediği için, MongoDB'nin şema içermediğini eklememe izin verirken Solr bir şemayı zorlar. Dolayısıyla, belgelerinizin alanlarının değişmesi muhtemelse, Solr yerine MongoDB'yi seçmenin bir nedeni budur.


6
IMHO tam olarak doğru değil. Solr'da tanımlandığı gibi bir şema var schema.xml, ANCAK 'dinamik alanlar' da var, yani türleri joker kartlarla belirlenen alanlar, böylece tüm alanların, örneğin *_itamsayı alanları olarak dizine eklenmesini sağlayabilirsiniz . belgeleri eklerken, daha sonra benzeri alanlar conaining belgeler olabilir count_i, foo_i, bar_igörünen olmadan tüm tamsayı alanları olarak anlaşıldığını schema.xmlanlamıyla. oldukça şemadan uzak, diyebilirim. daha fazla bilgi için youtube.com/watch?v=WYVM6Wz-XTw adresine bakın .
akış

Geri dönüp bunu bir +1 ile çarpmalıyım çünkü bu doğru - Solr'daki şema değişiklikleri her zaman diğer veri depolarıyla senkronize tutmak için bir PITA'da olmuştur.
eduncan911

4
Solr, şemayı veya şemayı desteklemeyen bir özelliğe sahiptir!
Krunal


1

Yalnızca anahtar / değer biçimini kullanarak veri depolamak istiyorsanız, tersine çevrilmiş dizini çok fazla disk alanı harcayacağından Lucene önerilmez. Diskteki veri tasarrufu ile performansı redis gibi NoSQL veritabanlarından çok daha yavaştır, çünkü redis verileri RAM'e kaydeder. Lucene için en büyük avantaj, sorguların çoğunu desteklemesidir, bu nedenle bulanık sorgular desteklenebilir.


1

Mongo op-log kuyruğu gibi üçüncü taraf çözümleri caziptir. Bir geliştirme / mimari perspektifi varsayarak çözümlerin sıkı bir şekilde entegre edilip edilemeyeceğine dair bazı düşünceler veya sorular devam etmektedir. Birkaç nedenden dolayı bu özellikler için sıkı bir şekilde bütünleşmiş bir çözüm görmeyi beklemiyorum (biraz spekülatif ve açıklığa tabi ve geliştirme çabalarıyla güncel değil):

  • mongo c ++, lucene / solr java
  • lucene çeşitli belge formatlarını destekler
    • mongo JSON'a (BSON) odaklanmıştır
  • lucene değişmez belgeler kullanıyor
    • Tek alanlı güncellemeler varsa kullanılabilir
  • lucene endeksleri karmaşık birleştirme operasyonları ile değişmez
  • mongo sorguları javascript
  • mongo'nun metin çözümleyicisi / belirteçleri yoktur (AFAIK)
  • mongo doc boyutları sınırlı, lucene için tahıl karşı gidebilir
  • mongo toplama operasyonunun lucene'de yeri olmayabilir
    • lucene, alanları dokümanlar arasında saklama seçeneklerine sahiptir, ancak bu aynı şey değildir
    • solr bir şekilde toplama / istatistik ve SQL / grafik sorguları sağlar

0

MongoDB Atlas yakında lucene tabanlı bir arama motoruna sahip olacak. Büyük duyuru bu haftanın MongoDB World 2019 konferansında yapıldı. Bu, yüksek gelirli MongoDB Atlas ürününün daha fazla kullanılmasını teşvik etmenin harika bir yoludur.

MongoDB Enterprise sürüm 4.2'ye eklendiğini umuyordum, ancak şirket içi ürün serisine getirme haberi yoktu.

Daha fazla bilgi burada: https://www.mongodb.com/atlas/full-text-search

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.