Po pierwsze, należy tutaj dokonać ważnego rozróżnienia:MongoDB to baza danych ogólnego przeznaczenia, Elasticsearch to rozproszona wyszukiwarka tekstowa wspierana przez Lucene. Ludzie mówili o używaniu Elasticsearch jako bazy danych ogólnego przeznaczenia, ale wiedzą, że nie był to jej oryginalny projekt. Myślę, że bazy danych i wyszukiwarki ogólnego przeznaczenia NoSQL zmierzają do konsolidacji, ale w obecnej sytuacji te dwie pochodzą z dwóch bardzo różnych obozów.
W mojej firmie używamy zarówno MongoDB, jak i Elasticsearch. Przechowujemy nasze dane w MongoDB i używamy Elasticsearch wyłącznie do funkcji wyszukiwania pełnotekstowego. Wysyłamy tylko podzbiór pól danych mongo, które musimy wysłać do Elastic. Nasz przypadek użycia różni się od Twojego tym, że nasze dane Mongo zmieniają się cały czas:rekord lub podzbiór pól rekordu może być aktualizowany kilka razy dziennie, a to może wymagać ponownego indeksowania tego rekordu do elastycznego. Już z tego powodu używanie Elastic jako jedynego magazynu danych nie jest dla nas dobrą opcją, ponieważ nie możemy aktualizować wybranych pól; musielibyśmy ponownie zindeksować dokument w całości. To nie jest elastyczne ograniczenie, tak działa Lucene, podstawowa wyszukiwarka elastyczna. W twoim przypadku fakt, że zapisy nie zostaną zmienione po zapisaniu, pozwala uniknąć konieczności dokonywania tego wyboru. To powiedziawszy, jeśli chodzi o bezpieczeństwo danych, dwa razy zastanowiłbym się nad użyciem Elasticsearch jako jedynego mechanizmu przechowywania danych. W pewnym momencie może się tam dostać, ale nie jestem pewien, czy jeszcze tam jest.
Jeśli chodzi o szybkość, Elastic/Lucene nie tylko jest na równi z szybkością zapytań Mongo, ale w twoim przypadku, gdy istnieje „bardzo mała stała, jeśli chodzi o to, które pola są używane do filtrowania w dowolnym momencie”, może to być rzędów wielkość szybciej, zwłaszcza gdy zbiory danych stają się większe. Różnica polega na podstawowych implementacjach zapytań:
- Elastic/Lucene używają modelu przestrzeni wektorowej i indeksów odwróconych do wyszukiwania informacji, które są bardzo wydajnymi sposobami porównywania podobieństwa rekordów z zapytaniem. Kiedy pytasz Elastic/Lucene, już zna odpowiedź; większość jego pracy polega na uszeregowaniu wyników według tych, które najbardziej pasują do wyszukiwanych haseł. To ważna kwestia:wyszukiwarki, w przeciwieństwie do baz danych, nie mogą zagwarantować dokładnych wyników; rankingują wyniki według tego, jak blisko są do Twojego zapytania. Tak się składa, że w większości przypadków wyniki są zbliżone do dokładnych.
- Podejście Mongo polega na przechowywaniu danych o bardziej ogólnym przeznaczeniu; porównuje dokumenty JSON ze sobą. Możesz uzyskać dzięki temu znakomitą wydajność wszelkimi sposobami, ale musisz starannie dopracować swoje indeksy, aby dopasować je do zapytań, które będziesz uruchamiać. W szczególności, jeśli masz wiele pól, według których będziesz wykonywać zapytania, musisz starannie przygotować klucze złożone, aby jak najszybciej redukować zestaw danych, do których będą wysyłane zapytania. Np. Twój pierwszy klucz powinien odfiltrować większość zbioru danych, drugi powinien dalej filtrować to, co zostało, i tak dalej i tak dalej. Jeśli twoje zapytania nie pasują do kluczy i kolejności tych kluczy w zdefiniowanych indeksach, twoja wydajność znacznie spadnie. Z drugiej strony Mongo to prawdziwa baza danych, więc jeśli dokładność jest tym, czego potrzebujesz, odpowiedzi, które udzieli, będą na miejscu.
W przypadku wygasania starych rekordów Elastic ma wbudowaną funkcję TTL. Mongo właśnie wprowadził go w wersji 2.2, jak sądzę.
Ponieważ nie znam Twoich innych wymagań, takich jak oczekiwany rozmiar danych, transakcje, dokładność lub wygląd filtrów, trudno jest podać konkretne zalecenia. Mamy nadzieję, że jest tu wystarczająco dużo, aby zacząć.