NoSQL (MongoDB) vs Lucene (lub Solr) jako baza danych

280

Ponieważ ruch NoSQL rośnie w oparciu o bazy danych oparte na dokumentach, ostatnio patrzyłem na MongoDB. Zauważyłem uderzające podobieństwo do traktowania przedmiotów jako „Dokumentów”, podobnie jak Lucene (i użytkownicy Solr).

Pytanie: dlaczego miałbyś używać NoSQL (MongoDB, Cassandra, CouchDB itp.) Nad Lucene (lub Solr) jako „bazy danych”?

To, czego szukam (i jestem pewien, że inni) w odpowiedzi, to ich głębokie porównania. Pomińmy razem dyskusje o relacyjnych bazach danych, ponieważ służą one innym celom.

Lucene ma kilka poważnych zalet, takich jak potężne systemy wyszukiwania i wagi. Nie wspominając już o aspektach w Solr (które Solr zostanie wkrótce zintegrowany z Lucene, tak!). Możesz używać dokumentów Lucene do przechowywania identyfikatorów i uzyskiwać dostęp do dokumentów jako takich, jak MongoDB. Wymieszaj go z Solr, a otrzymasz rozwiązanie oparte na WebService, z równoważeniem obciążenia.

Możesz nawet dodać porównanie dostawców pamięci podręcznej poza procesem, takich jak Velocity lub MemCached, mówiąc o podobnym przechowywaniu danych i skalowalności MongoDB.

Ograniczenia dotyczące MongoDB przypominają mi o korzystaniu z MemCached, ale mogę korzystać z Velocity Microsoftu i mieć większą moc grupowania i zbierania list nad MongoDB (tak myślę). Nie może być szybszy ani skalowalny niż buforowanie danych w pamięci. Nawet Lucene ma dostawcę pamięci.

MongoDB (i inne) mają pewne zalety, takie jak łatwość użycia ich API. Utwórz nowy dokument, utwórz identyfikator i zapisz go. Gotowe. Miło i łatwo.

eduncan911
źródło
8
Zobacz stackoverflow.com/questions/2546494/…
bajafresh4life
4
Dziękuję, ale to nie odpowiada na moje pytanie: dlaczego miałbym używać MongoDB zamiast Lucene do mojej bazy danych? Obie obsługują dokumenty, ale Lucene ma kilka bardzo zaawansowanych opcji wyszukiwania. +1 za faktyczne znalezienie powiązanego pytania. Szukałem kilka razy na Stackoverflow i nie znalazłem bliskiego porównania.
eduncan911
Jak korzystasz z Lucene, która zapewnia funkcjonalność podobną do MongoDB? Czy wiążesz go z relacyjną bazą danych do przechowywania?
Philip Tinney,
1
@Philip: To hipotetyczne pytanie. Dlaczego nie wykorzystać Lucene jako miejsca do przechowywania dokumentów? Otrzymujesz znacznie więcej mocy wyszukiwania i skalowalności (po zmieszaniu z Solr, dzięki czemu Lucene jest jeszcze łatwiejsza w użyciu).
eduncan911,

Odpowiedzi:

250

To świetne pytanie, nad czym dość długo się zastanawiałem. Podsumuję wyciągnięte wnioski:

  1. Możesz łatwo użyć Lucene / Solr zamiast MongoDB w prawie wszystkich sytuacjach, ale nie odwrotnie. Podsumowanie postu Granta Ingersolla znajduje się tutaj.

  2. MongoDB itp. Wydają się służyć celowi, w którym nie ma wymogu wyszukiwania i / lub facetingu. Wydaje się, że jest to łatwiejsze i prawdopodobnie łatwiejsze przejście dla programistów odtruwających ze świata RDBMS. Chyba że ktoś się do tego przyzwyczaił, Lucene i Solr mają bardziej stromą krzywą uczenia się.

  3. Nie ma wielu przykładów użycia Lucene / Solr jako magazynu danych, ale Guardian poczynił pewne postępy i podsumował to w doskonałej zjeżdżalni , ale oni również nie są zobowiązani do całkowitego skakania na wózku Solr i „badania” łączenia Solr z CouchDB.

  4. Na koniec przedstawię nasze doświadczenie, niestety nie mogę wiele powiedzieć na temat uzasadnienia biznesowego. Pracujemy w skali kilku TB danych, aplikacja prawie w czasie rzeczywistym. Po zbadaniu różnych kombinacji postanowiłem trzymać się Solr. Jak dotąd nie żałuję (6 miesięcy i wciąż rośnie) i nie widzę powodu, aby przejść na inne.

Podsumowanie: jeśli nie masz wymogu wyszukiwania, Mongo oferuje proste i skuteczne podejście. Jeśli jednak wyszukiwanie ma kluczowe znaczenie dla Twojej oferty, prawdopodobnie lepiej jest trzymać się jednej technologii (Solr / Lucene) i optymalizować ją - mniej ruchomych części.

Moje 2 centy, mam nadzieję, że to pomogło.

Mikos
źródło
10
Solr nie ma funkcji zmniejszania mapy. Dlatego raportowanie, statystyki, obliczanie wyników itp. Nie są możliwe! Zastosowanie Solr tylko jeśli masz / zagrożenie może dane jako dane tekstowe
Roland Kofler
8
Solr nie ma wbudowanej funkcji zmniejszania mapy, ale można łączyć z Hadoop. architects.dzone.com/articles/solr-hadoop-big-data-love
Mikos
6
Map-redukuj nie, ale ma możliwość równoległego uruchamiania zapytania na wielu serwerach solr i agregowania tych wyników. Więc chociaż nie ma ogólnego ograniczenia map, już napisało to, co piszesz za pomocą map-reduktu, czyli równoległych zapytań wyszukiwania.
chubbsondubs
@Roo: Czy opcją byłoby użycie Lucene jako głównej bazy danych i tworzenie indeksów agregujących w MongoDB? Czy to nie ma sensu? I Mikos: świetna odpowiedź i +1 za wzmiankę o doświadczeniach w świecie rzeczywistym.
Grimace of Despair
2
od solr6 obsługuje funkcję zmniejszania mapy za pomocą wyrażeń równoległych
Divyang Shah,
36

Nie można częściowo zaktualizować dokumentu w solr. Musisz ponownie opublikować wszystkie pola, aby zaktualizować dokument.

A wydajność ma znaczenie. Jeśli tego nie zrobisz, zmiana na solr nie będzie obowiązywać, jeśli dokonujesz tego za każdym razem, wydajność spada.

W solr nie ma transakcji.

Ponieważ solr ma te wady, czasami nosql jest lepszym wyborem.

Peter Long
źródło
13
MongoDB również nie zawiera transakcji.
user183037,
1
Solr lub Lucene przeprowadzają wyszukiwanie w czasie rzeczywistym, więc zatwierdzenie nie stanowi problemu.
mihaicc
1
@ user183037 w MongoDB wszelkie aktualizacje w dokumencie to Atomic. I do twojej wiadomości, Lucene też nie ma transakcji (w twoim znaczeniu)
Aravind Yarram
48
Ta odpowiedź stała się niepoprawna. Solr 4+ obsługuje częściowe aktualizacje, a miękkie zatwierdzenia / prawie w czasie rzeczywistym eliminują większość problemów ze „starymi” zatwierdzeniami Solr.
Mauricio Scheffer,
1
Dodali obsługę transakcji na MongoDB 4.
Jonas
26

Używamy MongoDB i Solr razem i działają one dobrze. Mój post na blogu możesz znaleźć tutaj, w którym opisałem, jak wspólnie korzystamy z tych technologii. Oto fragment:

[...] Obserwujemy jednak, że wydajność zapytania Solr spada wraz ze wzrostem wielkości indeksu. Uświadomiliśmy sobie, że najlepszym rozwiązaniem jest jednoczesne użycie zarówno Solr, jak i Mongo DB. Następnie integrujemy Solr z MongoDB, przechowując zawartość w MongoDB i tworząc indeks za pomocą Solr do wyszukiwania pełnotekstowego. Przechowujemy tylko unikalny identyfikator dla każdego dokumentu w indeksie Solr i pobieramy rzeczywistą zawartość z MongoDB po wyszukiwaniu w Solr. Pobieranie dokumentów z MongoDB jest szybsze niż Solr, ponieważ nie ma analizatorów, oceniania itp. [...]

Parvin Gasimzade
źródło
3
Dobry post na blogu. Tak, dokładnie tak korzystałem w przeszłości z Lucene ze starszymi magazynami danych SQL i MySql (przechowywanie identyfikatorów w Lucene i pobieranie złożonych typów z magazynu danych). Technicznie rzecz biorąc, to pytanie miało na celu zbadanie różnic między nimi - nie do końca jak korzystać z „najlepszych z obu światów”. +1 za używanie go w ten sposób, ponieważ to naprawdę jedyny prawdziwy sposób na użycie ogromnych ilości danych.
eduncan911,
Dzięki za twoją odpowiedź. Wiem, że pytanie dotyczy wyboru Nosqla zamiast Lucene, ale tutaj chcę pokazać, że zamiast wybierać jeden nad drugim, użycie ich w sposób hybrydowy da lepszy wynik.
Parvin Gasimzade,
2
Czy pamiętasz (teraz 1,5 roku później) z grubsza rozmiar bazy danych Solr, kiedy wydajność zapytania spadła tak bardzo, że zacząłeś myśleć o dodaniu MongoDB? (Czy było to 10 000 dokumentów czy 10 000 000 dokumentów?)
KajMagnus,
Bardzo pomocne. Pracuję w GIS, dlatego możliwość łączenia pełnego tekstu z wyszukiwaniem przestrzennym jest bardzo intrygująca. Korzystamy już z MongoDB i Postgres i od jakiegoś czasu zastanawiam się nad Solr.
John Powell,
2
@ParvinGasimzade link do postu na blogu nie działa. Czy możesz podać inny link lub źródło?
zapomnienie
24

Należy również pamiętać, że niektóre osoby zintegrowały Solr / Lucene z Mongo, przechowując wszystkie indeksy w Solr, a także monitorując operacje oplogu i przenosząc odpowiednie aktualizacje do Solr.

Dzięki takiemu podejściu hybrydowemu możesz naprawdę mieć to, co najlepsze z obu światów, dzięki takim funkcjom, jak wyszukiwanie pełnotekstowe i szybkie odczytywanie z niezawodnym magazynem danych, który może mieć także niesamowitą prędkość zapisu.

Konfiguracja jest nieco techniczna, ale istnieje wiele programów dostosowujących oplog, które można zintegrować z solr. Sprawdź, co zrobił rangespan w tym artykule.

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

Prasith Govin
źródło
Jeśli dobrze zrozumiałem, dlaczego używasz MongoDB (oprócz Solr), czy MongoDB ma szybsze wstawianie + szybkość odczytu? Czy wskazałeś również, że MongoDB ma bardziej niezawodny magazyn danych? (A może miałeś na myśli Solr?) - Od czego zacząłeś? Tylko MongoDB, tylko Solr, czy oba Mongo + Solr?
KajMagnus
12

Z mojego doświadczenia z obydwoma, Mongo jest świetny do prostego, prostego użytkowania. Główną wadą Mongo, którą odczuliśmy, jest niska wydajność nieprzewidzianych zapytań (nie można tworzyć indeksów mongo dla wszystkich możliwych kombinacji filtrów / sortowania, po prostu nie można).

A tutaj, gdzie Lucene / Solr panuje przez długi czas, szczególnie w przypadku buforowania FilterQuery, wydajność jest wyjątkowa.

mjalajel
źródło
10

Ponieważ nikt o tym nie wspominał, dodam, że MongoDB nie zawiera schematu, podczas gdy Solr wymusza schemat. Tak więc, jeśli pola twoich dokumentów prawdopodobnie się zmienią, to jeden z powodów, aby wybrać MongoDB zamiast Solr.

Aquarelle
źródło
6
że IMHO nie jest do końca prawdą. Solr ma schemat zdefiniowany w schema.xml, ALE ma również „pola dynamiczne”, tj. Pola, których typy są określane za pomocą symboli wieloznacznych, więc możesz mieć wszystkie pola pasujące, powiedzmy, *_izindeksowane jako pola całkowite. podczas dodawania dokumentów, możesz mieć dokumenty conaining pola, na przykład count_i, foo_i, bar_iktóre są rozumiane jako liczba całkowita bez polach pojawiają się schema.xmldosłownie. powiedziałbym, że całkiem nie zawiera schematu. zobacz więcej youtube.com/watch?v=WYVM6Wz-XTw .
przepływ
Muszę wrócić i podnieść to o +1, ponieważ to prawda - zmiany schematu w Solr zawsze były w PITA, aby zachować synchronizację z innymi magazynami danych.
eduncan911
4
Solr ma funkcję, która obsługuje schemat lub brak schematu!
Krunal
1

Jeśli chcesz tylko przechowywać dane w formacie klucz-wartość, Lucene nie jest zalecana, ponieważ jej odwrócony indeks marnuje zbyt dużo miejsca na dysku. Dzięki oszczędności danych na dysku jego wydajność jest znacznie mniejsza niż w bazach danych NoSQL, takich jak redis, ponieważ redis zapisuje dane w pamięci RAM. Największą zaletą Lucene jest to, że obsługuje wiele zapytań, więc można obsługiwać zapytania rozmyte.

张洪岩
źródło
1

Rozwiązania innych firm, takie jak mongo op-log tail, są atrakcyjne. Pozostaje kilka przemyśleń lub pytań dotyczących tego, czy rozwiązania mogłyby być ściśle zintegrowane, przy założeniu perspektywy rozwoju / architektury. Nie oczekuję, że zobaczę ściśle zintegrowane rozwiązanie dla tych funkcji z kilku powodów (nieco spekulacyjnych i podlegających wyjaśnieniu i nie na bieżąco z pracami rozwojowymi):

  • mongo to c ++, lucene / solr są java
  • Lucene obsługuje różne formaty dokumentów
    • mongo koncentruje się na JSON (BSON)
  • Lucene używa niezmiennych dokumentów
    • aktualizacje pojedynczego pola stanowią problem, jeśli są dostępne
  • indeksy lucenu są niezmienne przy złożonych operacjach scalania
  • zapytania mongo są javascript
  • mongo nie ma analizatorów / tokenizatorów tekstu (AFAIK)
  • rozmiary dokumentów mongo są ograniczone, co może być sprzeczne z ziarnem dla lucenu
  • operacje mongo agregacji mogą nie mieć miejsca w lucenie
    • Lucene ma opcje przechowywania pól między dokumentami, ale to nie to samo
    • solr w jakiś sposób zapewnia agregację / statystyki i zapytania SQL / wykres
Darren Weber
źródło
0

MongoDB Atlas wkrótce będzie miał wyszukiwarkę opartą na lucenie. Duże ogłoszenie zostało ogłoszone na konferencji MongoDB World 2019 w tym tygodniu. Jest to świetny sposób, aby zachęcić do większego wykorzystania ich produktu MongoDB Atlas o wysokich dochodach.

Miałem nadzieję, że zobaczę go w wersji 4.2 MongoDB Enterprise, ale nie było żadnych wieści o wprowadzeniu go do swojej linii produktów przedpremierowych.

Więcej informacji tutaj: https://www.mongodb.com/atlas/full-text-search

Gary Russo
źródło