这个问题是关于在深入研究实验和实现的细节之前做出架构 Select .这是关于elasticsearch v.s.MongoDB在可扩展性和性能方面是否适合某种特定用途.

假设两者都存储具有字段和值的数据对象,并允许查询该对象体.所以,根据临时 Select 的字段过滤出对象的子集,这两种方法都适用.

我的应用程序将围绕根据标准 Select 对象展开.

我的应用程序将持续进行这种过滤,而在任何时候,过滤所使用的字段都没有或几乎没有常数.也许在Elastic search 索引中需要定义,但甚至没有索引的速度与MangGDB的速度是相同的.

根据进入store 的数据,没有特别的细节..这些对象在被插入后几乎永远不会改变.可能需要删除旧对象,我想假设两个数据存储都支持内部或通过应用程序生成的查询删除内容.(符合特定查询的对象也需要删除的频率较低).

你怎么认为?

我对这两个数据存储的性能和可伸缩性感兴趣,这两个数据存储都适用于这类任务.这是一个类似于架构设计的问题,store 特定选项或查询基石的详细信息应该使其具有良好的架构,这是一个经过深思熟虑的建议的展示.

谢谢

推荐答案

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

我们公司同时使用MongoDB和Elasticsearch.我们将数据存储在MongoDB中,并专门使用Elasticsearch进行全文搜索.我们只向elastic发送需要查询的mongo数据字段的子集.我们的用例与您的不同之处在于,我们的Mongo数据一直在变化:一条记录或记录字段的子集可以一天更新几次,这可能需要将该记录重新索引到elastic.仅出于这个原因,使用elastic作为唯一的数据存储对我们来说不是一个好 Select ,因为我们无法更新 Select 字段;我们需要对一个文档的"整体"重新编制索引.这不是弹性限制,这是Lucene的工作方式,它是弹性背后的底层搜索引擎.在您的情况下,记录一旦存储就不会被更改,这样您就不必做出这样的 Select .话虽如此,如果数据安全是一个问题,我会三思而后行,使用Elasticsearch作为数据的唯一存储机制.它可能会在某个时候到达那里,但我不确定它是否在那里.

在速度方面,不仅弹性/ Lucene与Mongo的查询速度保持一致,在你的情况下,"在哪个时刻用于过滤的字段非常少",它可以是数量级的更快,尤其是随着数据集变得更大.不同之处在于底层的查询实现:

  • Elastic/Lucene使用Vector Space Modelinverted indexes表示Information Retrieval,这是比较记录相似性和查询的高效方法.当你询问Elastic/Lucene时,它已经知道答案;它的大部分工作是根据最可能匹配查询条件的结果为您排序.这是很重要的一点:与数据库相比,搜索引擎不能保证你得到准确的结果;它们根据结果与您的查询的接近程度对结果进行排序.碰巧的是,大多数情况下,结果都接近准确.
  • Mongo的方法是更通用的数据存储;它将JSON文档相互比较.无论如何,你都可以从中获得很好的性能,但是你需要仔细地设计你的索引,以匹配你将要运行的查询.具体来说,如果您有多个字段要查询,那么您需要仔细设计compound keys,以便它们尽可能快地减少将被查询的数据集.例如,第一个键应该过滤掉大部分数据集,第二个键应该进一步过滤掉剩下的数据集,依此类推.如果查询与键以及这些键在已定义索引中的顺序不匹配,那么性能会下降很多.另一方面,Mongo是一个真正的数据库,所以如果准确度是你所需要的,它将给出当场的答案.

对于过期的旧记录,Elastic有一个内置的TTL功能.我想Mongo是从2.2版开始引入的.

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

Mongodb相关问答推荐

MongoDB:子文档中仅存在于父文档中的返回字段?

通过mongoDB中的查找从管道中删除被阻止的用户

如何在MongoDB中正确解析佛年?

如何使用ID数组对一个集合中的金额求和并更新另一个集合中的字段?

如何在Mongodb Mongoose Nodejs中提取不等于一组值的字段

无法通过管理邮箱/密码身份验证注册/登录新用户帐户(类型错误:加载失败)

从MongoDB迁移到PostgreSQL:为PostgreSQL编写聚合管道查询

Mongodb,在一个查询中用正则表达式更新部分字符串

查询有关 Go 项目中对象数组的 MongoDb 集合

如何聚合过滤器嵌套文档并从其他字段中获取值

使用 homebrew 和 Xcode 8.1.1 安装 Mongodb 失败

更新 mongodb 文档中的特定字段

Mongoose.js 通过一个 connect() 调用创建到 MongoDB 的多个连接

使用 MongoDB Java 驱动程序将 DBObject 转换为 POJO

MongoDB 日志(log)文件和 oplog 有何不同?

$orderby 和 Sort 之间的 MongoDB 区别

错误:Could not connect to any servers in your MongoDB Atlas cluster

更新时提示Field name duplication not allowed with modifiers

与 mongoose/node.js 共享数据库连接参数的最佳方式

MissingSchemaError:Schema hasn't been registered for model