首先,这里有一个重要的区别: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 Model和inverted indexes表示Information Retrieval,这是比较记录相似性和查询的高效方法.当你询问Elastic/Lucene时,它已经知道答案;它的大部分工作是根据最可能匹配查询条件的结果为您排序.这是很重要的一点:与数据库相比,搜索引擎不能保证你得到准确的结果;它们根据结果与您的查询的接近程度对结果进行排序.碰巧的是,大多数情况下,结果都接近准确.
- Mongo的方法是更通用的数据存储;它将JSON文档相互比较.无论如何,你都可以从中获得很好的性能,但是你需要仔细地设计你的索引,以匹配你将要运行的查询.具体来说,如果您有多个字段要查询,那么您需要仔细设计compound keys,以便它们尽可能快地减少将被查询的数据集.例如,第一个键应该过滤掉大部分数据集,第二个键应该进一步过滤掉剩下的数据集,依此类推.如果查询与键以及这些键在已定义索引中的顺序不匹配,那么性能会下降很多.另一方面,Mongo是一个真正的数据库,所以如果准确度是你所需要的,它将给出当场的答案.
对于过期的旧记录,Elastic有一个内置的TTL功能.我想Mongo是从2.2版开始引入的.
由于我不知道您的其他要求,例如预期的数据大小、事务、准确性或过滤器的外观,因此很难提出任何具体建议.希望这里有足够的东西让你开始.