sql >> Database >  >> NoSQL >> MongoDB

elasticsearch vs. MongoDB voor filtertoepassing

Allereerst moet hier een belangrijk onderscheid worden gemaakt:MongoDB is een database voor algemene doeleinden, Elasticsearch is een gedistribueerde tekstzoekmachine die wordt ondersteund door Lucene. Mensen hebben het gehad over het gebruik van Elasticsearch als een database voor algemene doeleinden, maar weten dat dit niet het oorspronkelijke ontwerp was. Ik denk dat NoSQL-databases en zoekmachines voor algemene doeleinden op weg zijn naar consolidatie, maar zoals het er nu uitziet, komen de twee uit twee heel verschillende kampen.

We gebruiken zowel MongoDB als Elasticsearch in mijn bedrijf. We slaan onze gegevens op in MongoDB en gebruiken Elasticsearch uitsluitend voor de full-text zoekmogelijkheden. We sturen alleen een subset van de mongo-gegevensvelden die we moeten doorzoeken naar Elastic. Ons gebruiksscenario verschilt van het uwe doordat onze Mongo-gegevens voortdurend veranderen:een record, of een subset van de velden van een record, kan meerdere keren per dag worden bijgewerkt en dit kan ertoe leiden dat die record opnieuw moet worden geïndexeerd naar elastisch. Alleen al om die reden is het gebruik van Elastic als de enige gegevensopslag geen goede optie voor ons, omdat we geselecteerde velden niet kunnen bijwerken; we zouden een document in zijn geheel opnieuw moeten indexeren. Dit is geen elastische beperking, zo werkt Lucene, de onderliggende zoekmachine achter elastic. In uw geval zorgt het feit dat records niet worden gewijzigd nadat ze zijn opgeslagen, ervoor dat u die keuze niet hoeft te maken. Dat gezegd hebbende, als gegevensveiligheid een punt van zorg is, zou ik twee keer nadenken over het gebruik van Elasticsearch als het enige opslagmechanisme voor uw gegevens. Het kan er ooit komen, maar ik weet niet zeker of het er al is.

In termen van snelheid is Elastic/Lucene niet alleen vergelijkbaar met de bevragingssnelheid van Mongo, in uw geval waar er "heel weinig constant is in termen van welke velden op elk moment voor het filteren worden gebruikt", kunnen het bestellingen van magnitude sneller, vooral naarmate de datasets groter worden. Het verschil zit in de onderliggende query-implementaties:

  • Elastic/Lucene gebruiken het vectorruimtemodel en geïnverteerde indexen voor het ophalen van informatie, wat zeer efficiënte manieren zijn om recordovereenkomst te vergelijken met een query. Als je Elastic/Lucene opvraagt, weet hij het antwoord al; het grootste deel van zijn werk ligt in het rangschikken van de resultaten voor u op basis van de meest waarschijnlijke resultaten die overeenkomen met uw zoektermen. Dit is een belangrijk punt:zoekmachines kunnen u, in tegenstelling tot databases, geen exacte resultaten garanderen; ze rangschikken de resultaten op basis van hoe dicht ze bij uw zoekopdracht komen. Het gebeurt gewoon zo dat de resultaten meestal bijna exact zijn.
  • Mongo's benadering is die van een meer algemene gegevensopslag; het vergelijkt JSON-documenten met elkaar. Je kunt er met alle middelen geweldige prestaties uit halen, maar je moet je indexen zorgvuldig maken om overeen te komen met de query's die je gaat uitvoeren. In het bijzonder, als u meerdere velden heeft waarmee u query's wilt uitvoeren, moet u uw samengestelde sleutels zorgvuldig maken, zodat ze de gegevensset die wordt opgevraagd zo snel mogelijk verkleinen. bijv. uw eerste sleutel zou het grootste deel van uw dataset moeten filteren, uw tweede zou verder moeten filteren op wat er nog over is, enzovoort, enzovoort. Als uw zoekopdrachten niet overeenkomen met de sleutels en de volgorde van die sleutels in de gedefinieerde indexen, zullen uw prestaties behoorlijk dalen. Aan de andere kant is Mongo een echte database, dus als nauwkeurigheid is wat je nodig hebt, zullen de antwoorden die het zal geven perfect zijn.

Voor het verlopen van oude records heeft Elastic een ingebouwde TTL-functie. Mongo heeft het net geïntroduceerd vanaf versie 2.2, denk ik.

Aangezien ik uw andere vereisten niet ken, zoals de verwachte gegevensomvang, transacties, nauwkeurigheid of hoe uw filters eruit zullen zien, is het moeilijk om specifieke aanbevelingen te doen. Hopelijk is er hier genoeg om u op weg te helpen.




  1. MongoDB $ronde

  2. Hoe geneste entiteiten in mangoest te vullen?

  3. MongoDB versus DynamoDB:wat u moet weten

  4. Voorwaarden voor meerdere deelname met behulp van de $lookup-operator