sql >> Databáze >  >> NoSQL >> MongoDB

elasticsearch v.s. MongoDB pro aplikaci filtrování

Za prvé, je zde důležité rozlišovat:MongoDB je univerzální databáze, Elasticsearch je distribuovaný textový vyhledávač podporovaný Lucene. Lidé mluvili o použití Elasticsearch jako obecné databáze, ale věděli, že to nebyl jeho původní design. Myslím si, že databáze a vyhledávače NoSQL pro obecné účely směřují ke konsolidaci, ale jak to tak je, pocházejí ze dvou velmi odlišných táborů.

V mé společnosti používáme MongoDB i Elasticsearch. Naše data ukládáme v MongoDB a Elasticsearch používáme výhradně pro jeho možnosti fulltextového vyhledávání. Elastu posíláme pouze podmnožinu mongo datových polí, která potřebujeme dotazovat. Náš případ použití se liší od vašeho v tom, že naše data Mongo se neustále mění:záznam nebo podmnožinu polí záznamu lze aktualizovat několikrát denně, což může vyžadovat přeindexování tohoto záznamu na elastický. Už jen z tohoto důvodu pro nás není použití elastického úložiště jako jediného úložiště dat dobrou volbou, protože nemůžeme aktualizovat vybraná pole; museli bychom znovu indexovat dokument jako celek. Toto není elastické omezení, takto funguje Lucene, základní vyhledávač za elastickým. Ve vašem případě skutečnost, že záznamy nebudou po uložení změněny, vás ušetří od takové volby. Když už jsem řekl, že pokud jde o bezpečnost dat, dvakrát bych si rozmyslel použití Elasticsearch jako jediného mechanismu pro ukládání vašich dat. V určitém okamžiku se tam může dostat, ale nejsem si jistý, zda tam ještě je.

Pokud jde o rychlost, nejenže je Elastic/Lucene na stejné úrovni jako rychlost dotazování Mongo, ve vašem případě, kde je „velmi málo konstant, pokud jde o to, která pole se v každém okamžiku používají k filtrování“, by to mohly být řády rychleji, zvláště když se soubory dat zvětšují. Rozdíl spočívá v základních implementacích dotazů:

  • Elastic/Lucene používají vektorový prostorový model a invertované indexy pro získávání informací, což jsou vysoce účinné způsoby porovnání podobnosti záznamů s dotazem. Když se zeptáte Elastic/Lucene, už zná odpověď; většina jeho práce spočívá v seřazení výsledků podle těch, které s největší pravděpodobností odpovídají vašim dotazům. To je důležitý bod:vyhledávače vám na rozdíl od databází nemohou zaručit přesné výsledky; seřadí výsledky podle toho, jak blízko se dostanou k vašemu dotazu. Náhodou se stává, že většinou jsou výsledky blízké přesným.
  • Mongův přístup je založen na obecnějším účelu úložiště dat; porovnává dokumenty JSON mezi sebou. Můžete z toho získat skvělý výkon všemi prostředky, ale musíte pečlivě vytvořit své indexy tak, aby odpovídaly dotazům, které budete spouštět. Konkrétně, pokud máte více polí, pomocí kterých budete dotazovat, musíte pečlivě vytvořit složené klíče tak, aby co nejrychleji zredukovaly datovou sadu, která bude dotazována. Např. váš první klíč by měl odfiltrovat většinu vaší datové sady, druhý by měl dále filtrovat to, co zbylo, a tak dále a tak dále. Pokud se vaše dotazy neshodují s klíči a pořadím těchto klíčů v definovaných indexech, váš výkon docela klesne. Na druhou stranu je Mongo skutečná databáze, takže pokud je přesnost to, co potřebujete, odpovědi, které vám poskytne, budou na místě.

Pro vypršení platnosti starých záznamů má Elastic vestavěnou funkci TTL. Mongo to právě představil od verze 2.2, myslím.

Protože neznám vaše další požadavky, jako je očekávaná velikost dat, transakce, přesnost nebo jak budou vypadat vaše filtry, je těžké dělat nějaká konkrétní doporučení. Doufejme, že je zde dost, abyste mohli začít.




  1. Jak nainstalovat MongoDB Community Edition na Ubuntu

  2. Jak nasadit MongoDB pro vysokou dostupnost

  3. .updateOne na MongoDB nefunguje v Node.js

  4. Mangoose odstranění (vytažení) dokumentu v poli nefunguje s ObjectID