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.



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.


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.


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. [...]


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


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.


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.


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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.