elasticsearch vs . MongoDB用于过滤应用程序

这个问题是关于在深入研究实验和实现的细节之前做出架构选择。这是关于elasticsearch与MongoDB在可伸缩性和性能方面的适用性,用于某种特定的目的。

假设两者都存储有字段和值的数据对象,并允许查询对象体。因此,根据所选择的字段,过滤出对象的子集,这两者都适用。

我的应用程序将围绕着根据标准选择对象。 它会通过多个字段同时过滤来选择对象,换句话说,它的查询过滤条件通常包括1到5个字段,在某些情况下可能更多。而选择作为过滤器的字段将是大量字段的子集。假设存在大约20个字段名,并且每个查询都试图从这20个字段中通过少数几个字段过滤对象(现有的总字段名可以少于20个,也可以多于20个,我只是使用这个数字来演示每个离散查询中用作过滤器的字段与字段的比例)。过滤可以通过所选字段的存在进行,也可以通过字段值进行,例如过滤出具有字段A、字段B在x和y之间、字段C等于w的对象。

我的应用程序将不断地进行这种过滤,而对于在任何时候使用哪些字段进行过滤,将没有任何常数或很少常数。也许在elasticsearch中需要定义索引,但也许即使没有索引,速度也与MongoDB相当。

至于数据进入商店,没有特别的细节。对象在插入后几乎不会改变。也许旧对象需要被删除,我想假设两个数据存储都支持在内部或通过应用程序查询过期删除东西。(更不常见的情况是,适合某个查询的对象也需要被删除)。

你觉得呢? 你在这方面做过实验吗?< / p >

对于这类任务,我感兴趣的是两个数据存储的性能和可伸缩性。这是一种体系结构设计问题,欢迎提供特定于商店的选项或查询基础的细节,以展示经过充分考虑的建议。

谢谢!

63458 次浏览

首先,这里有一个重要的区别:MongoDB是一个通用数据库,Elasticsearch是一个由Lucene支持的分布式文本搜索引擎。人们一直在谈论使用Elasticsearch作为通用数据库,但知道这不是它的最初设计。我认为通用NoSQL数据库和搜索引擎正在走向整合,但就目前情况来看,这两者来自两个截然不同的阵营。

我们公司同时使用MongoDB和Elasticsearch。我们将数据存储在MongoDB中,并专门使用Elasticsearch的全文搜索功能。我们只将需要查询的mongo数据字段的一个子集发送给elastic。我们的用例与您的用例不同,因为我们的Mongo数据随时都在变化:一条记录或一个记录字段的子集可以一天更新几次,这可能需要将该记录重新索引到elastic。仅仅因为这个原因,使用elastic作为唯一的数据存储对我们来说不是一个好的选择,因为我们不能更新选择字段;我们需要重新索引整个文档。这不是弹性限制,这是Lucene的工作方式,它是弹性背后的底层搜索引擎。在您的情况下,记录在存储后不会更改的事实使您不必做出这样的选择。话虽如此,如果数据安全是一个问题,我会重新考虑使用Elasticsearch作为数据的唯一存储机制。它可能会在某个时候到达那里,但我还不确定它是否在那里。

在速度方面,Elastic/Lucene不仅与Mongo的查询速度相当,在你的情况下,“在任何时候用于过滤的字段方面几乎没有常数”,它可能会快几个数量级,特别是当数据集变得更大时。区别在于底层的查询实现:

  • Elastic/Lucene为信息检索使用向量空间模型反向索引,这是比较记录相似度和查询的高效方法。当你查询Elastic/Lucene时,它已经知道答案了;它的大部分工作在于根据最可能匹配查询条件的结果为您排序。这是很重要的一点:搜索引擎,相对于数据库,不能保证你得到准确的结果;它们根据结果与您的查询的接近程度对结果进行排序。大多数时候,结果都很接近准确。
  • Mongo的方法是一个更通用的数据存储;它将JSON文档进行比较。无论如何,您都可以从中获得出色的性能,但是您需要精心设计索引以匹配将要运行的查询。具体来说,如果你有多个要查询的字段,你需要仔细构造你的复合键,以便它们尽可能快地减少要查询的数据集。例如,你的第一个键应该过滤掉你数据集的大部分,你的第二个键应该进一步过滤掉剩下的部分,等等。如果您的查询与已定义索引中的键以及这些键的顺序不匹配,那么您的性能将会下降很多。另一方面,Mongo是一个真正的数据库,所以如果准确性是你所需要的,它将给出的答案将是准确的。

对于过期的旧记录,Elastic有一个内置的TTL特性。我想Mongo刚刚在2.2版引入了它。

由于我不知道您的其他要求,如预期的数据大小、事务、准确性或过滤器的外观,因此很难给出任何具体的建议。希望这里有足够的内容让您开始学习。