当前位置: 首页 > 面试题库 >

elasticsearch vs MongoDB用于过滤应用程序

令狐经武
2023-03-14
问题内容

这个问题是关于在研究实验和实现的细节之前做出架构选择的。它是关于Elasticsearch与MongoDB在某种程度上的特定用途的可扩展性和性能方面的适用性。

假设两者都存储具有字段和值的数据对象,并允许查询该对象主体。因此,大概可以根据选择的特定字段过滤掉对象的子集,这两者都适合。

我的应用程序将围绕根据条件选择对象。它会通过同时过滤多个字段来选择对象,换句话说,它的查询过滤条件通常包含1到5个字段之间的任意位置,在某些情况下可能更多。而被选作过滤器的字段将是大量字段的子集。想象一下现有的20个字段名称,每个查询都试图通过全部20个字段中的几个字段来过滤对象(它可以少于或多于20个,而我只是用这个数字来说明字段到在每个离散查询中用作过滤器的字段)。可以通过选择字段的存在以及字段值来进行过滤,例如过滤出具有字段A且其字段B在x和y之间的对象,

我的应用程序将不断进行这种过滤,而在任何时候都将哪个字段用于过滤没有任何或非常小的常数。也许在Elasticsearch中需要定义索引,但是即使没有索引,速度也可以与MongoDB的速度相提并论。

根据进入存储区的数据,没有关于此的特殊详细信息。对象在插入后几乎不会改变。也许需要删除旧的对象,我想假设这两个数据存储都支持在内部删除或通过应用程序查询删除内容。(通常,也需要删除适合某个查询的对象)。

你怎么看?而且,您是否尝试过这方面?

对于这种任务,我对两个数据存储中的每个数据存储的性能和可伸缩性都很感兴趣。这是一种架构设计问题,欢迎商店特定的选项或应使其架构合理的查询基石的详细信息,以作为经过深思熟虑的建议的演示。

谢谢!


问题答案:

首先,有一个重要的区别:MongoDB是通用数据库,Elasticsearch是Lucene支持的分布式文本搜索引擎。人们一直在谈论将Elasticsearch用作通用数据库,但知道它不是它的原始设计。我认为通用NoSQL数据库和搜索引擎将要进行整合,但就目前而言,两者来自两个截然不同的阵营。

我们在公司中同时使用MongoDB和Elasticsearch。我们将数据存储在MongoDB中,并且将Elasticsearch专门用于其全文搜索功能。我们仅发送需要查询以增强弹性的mongo数据字段的子集。我们的用例与您的用例不同,因为我们的Mongo数据始终在变化:记录或记录字段的子集每天可以更新几次,这可能需要将该记录重新编制索引以使其具有弹性。仅出于这个原因,使用弹性作为唯一的数据存储对我们来说不是一个好选择,因为我们无法更新选择字段。我们将需要对整个文档重新编制索引。这不是弹性限制,而是Lucene的工作方式,这是Elastic背后的基础搜索引擎。就您而言,记录将不会
一旦存储就无需更改,因此不必选择该选项。话虽如此,如果您担心数据html" target="_blank">安全性,那么我将考虑将Elasticsearch用作数据的唯一存储机制。它可能在某个时候到达那里,但我不确定它是否在那里。

在速度方面,Elastic /
Lucene不仅可以与Mongo的查询速度相提并论,在您的情况下,“在任何时候都使用哪个字段进行过滤方面几乎没有常数”,它的数量级可能是数量级更快,尤其是随着数据集变得更大。区别在于基础查询实现:

  • Elastic / Lucene使用向量空间模型和反向索引进行信息检索,这是将记录相似性与查询进行比较的高效方法。当您查询Elastic / Lucene时,它已经知道答案了;它的大部分工作都在于按照最有可能的结果对您进行排名,以匹配您的查询字词。这一点很重要:与数据库相反,搜索引擎无法保证您获得准确的结果;他们根据与查询的接近程度对结果进行排名。碰巧的是,在大多数情况下,结果都接近准确。
  • Mongo的方法是更通用的数据存储。它将JSON文档相互比较。您可以通过各种方式获得出色的性能,但是您需要精心设计索引以匹配将要运行的查询。具体来说,如果您有多个要查询的字段,则需要精心设计复合键以便他们减少将要尽快查询的数据集。例如,您的第一个键应筛选掉大部分数据集,第二个键应进一步筛选剩下的数据,依此类推。如果您的查询与键以及键在已定义索引中的顺序不匹配,则性能会下降很多。另一方面,Mongo是一个真正的数据库,因此,如果您需要准确性,那么它将给出答案。

为了使旧记录过期,Elastic具有内置的TTL功能。我认为Mongo从2.2版开始就引入了它。

由于我不知道您的其他要求,例如预期的数据大小,事务,准确性或过滤器的外观,因此很难提出任何具体建议。希望这里有足够的知识来帮助您入门。



 类似资料:
  • 也就是说,我想要达到的目标可以从以下的角度来看 如何使用管道实现?

  • 我正在开发一个Spring启动应用程序。我想通过请求正文字段“Id”修改请求的响应。 我已经实现了下面的代码,但是在实现的时候输出的仍然只是名字。任何关于实施以下内容的建议都会有所帮助: 下面是请求体: 作为响应,我想将该字段附加到响应id(来自请求正文的字段名)。响应体: MyCustomFilter: 我的请求包装: MultiReadHttpServletRequest.java { } 感

  • 我使用以下rss源从youtube获取视频。工作正常。http://gdata.youtube.com/feeds/api/users/zeetv/uploads?alt=rss 现在我喜欢应用某些过滤器...例如:列出标题为“剧集”的视频。 但它并没有过滤掉与“插曲”匹配的视频,而是列出了所有视频。 我已经检查了这个链接 https://developers.google.com/youtube

  • 问题内容: 是否可以将过滤器应用于 AVLayer* 并将其添加为 addSublayer 以进行 查看 ?我想使用Swift改变颜色并为摄像机的视频添加一些噪点,但我不知道该怎么做。 * 我认为,可以像这样添加 filterLayer 和 PreviewLayer : 这可能可以使用我的自定义滤镜创建视频,但是我认为,可以更有效地使用 AVComposition 所以我需要知道: 将滤镜实时应用

  • 问题内容: 我想让ETag支持。为此,需要做所有工作。我如何在不声明的情况下添加它(实际上不存在,因为到目前为止我已经不知何故了)? PS我使用Spring Boot 1.1.4 PPS这是一个完整的解决方案 问题答案: When using Spring Boot 如参考文档中所述,唯一的步骤是在配置类中将该过滤器声明为Bean,就这样! When using Spring MVC 你可能已经扩

  • 我想要ETag支持。为此,有一个来完成所有工作。我如何添加它而不在我的中声明它(它实际上并不存在,因为我到目前为止不知怎的没有它)?