【问题标题】:MongoDB + Elasticsearch or only Elasticsearch?MongoDB + Elasticsearch 还是只有 Elasticsearch?
【发布时间】:2015-06-14 19:41:36
【问题描述】:

我们在那里有一个新项目,用于索引大量数据并提供实时数据。我还使用方面、全文、地理空间进行了复杂的搜索...

第一个原型是在 MongoDB 中建立索引,然后在 Elasticsearch 中建立索引,因为我读过 Elasticsearch 不会对存储的文件应用校验和,并且不能完全信任索引。 但是自从上一个版本(在 1.5 版中)以来,现在有一个校验和,我猜我们是否可以使用 Elasticsearch 作为主要数据存储?除了 Elasticsearch 之外,使用 MongoDB 有什么好处?

我在 Elasticsearch 中找不到关于这些功能的最新答案

非常感谢

【问题讨论】:

  • 这在很大程度上取决于您的用例和整体应用程序设计。这个问题太笼统了,无法在这里以明智的方式回答。
  • 好的,但是有禁忌只使用 Elasticsearch 吗? MongoDB 提供了一个 fonctiannality 但 Elasticsearch 没有?
  • 存储任意数据,例如?
  • ElasticSearch 旨在索引各种数据源。 MongoDB 是一个 NoSQL 数据库。虽然您可以将后者用于索引内容,但您将很难将数据实体存储在前者中。
  • SO 在这些类型的问题中似乎不一致。这个问题需要意见或观点,因此无法验证,只能辩论。由于人们有不同的背景和偏见,答案会有所不同。当我问这种类型的问题时,我会收到一个减分和一封警告电子邮件。如果 SO 要成为 FB、Mongo 的论坛,那么它需要更公平、更一致。

标签: mongodb elasticsearch nosql


【解决方案1】:

谈论参数使用 Mongo 代替/与 ES 一起使用:

  1. 用户/角色管理。

    • 内置于 MongoDB。可能无法满足您的所有需求,可能在某处有些笨拙,但它确实存在,并且在很久以前就已实施。
    • ES 中唯一的安全性是shield。但它仅提供用于生产用途的 Gold/Platinum 订阅。
  2. 架构

    • ES 是无模式的,但它建立在Lucene 之上并用Java 编写。这个工具的核心思想——索引和搜索文档,并且以这种方式工作需要索引的一致性。在后端,所有文档都应该安装在平面 lucene 索引中,这需要了解 ES 应该如何处理您的嵌套文档和值,以及您应该如何组织索引以保持速度和数据完整性/一致性之间的平衡。使用 ES 需要您始终牢记有关模式的一些事情。即:因为您可以在不预先放置相应映射的情况下将几乎任何东西索引到 ES,ES 可以动态“猜测”映射但有时会做错,有时隐式映射是邪恶的,因为一旦放置,它就无法更改 w /o 重新索引整个索引。因此,最好不要将 ES 视为无模式存储,因为您可以在一段时间内踩到耙子(这将是 pain :)),而是将其视为模式密集型,至少在您使用的文档可以被分割成具体的字段。
    • 另一方面,Mongo 几乎可以从您放入其中的任何东西中“咀嚼并且不留下任何碎屑”。并且大多数查询都可以正常工作,直到您记得 Mongo 将如何从 JavaScript 角度处理您的数据。由于 JS 是弱类型的,您可以使用真正无模式的工作流程(当然,如果您需要的话)
  3. 处理非表格数据。

    • ES 仅限于处理数据而不将其放入搜索索引。当您需要存储和检索一些额外数据(与您要搜索的数据相比)时,此解决方案已经足够好了。
    • MongoDB 支持gridFS。这使您能够在同一接口后面处理大量数据。即,您可以在 Mongo 中存储二进制数据,并从代码的角度在同一界面中检索它。

【讨论】:

  • 感谢您的回复 Slam :)
  • 只是对此进行了一点更新,ES 现在有一个社区插件来处理您的集群的安全性。配置起来比盾牌难,但它存在;)
【解决方案2】:

好吧,为正确的工作选择正确的工具。如果您需要全文搜索、分面等搜索功能,那么没有什么能比得上成熟的搜索引擎了。 ElasticSearch(ES) 或 Solr 只是一个选择问题。

您实际上可以将文档输入(索引)到 ES 中进行搜索,然后从 MongoDB 或任何其他数据库中获取特定条目的完整详细信息。

我可以让你的任务更轻松,看看我使用 MongoDB、ES、Redis 和 RabbitMQ 的开源工作,它们都集成在一个地方,here on github

请注意,该应用程序是在 .Net C# 中构建的。

【讨论】:

  • 可以进行全文搜索,但我的问题是保留 MongoDB AND Elasticsearch 并且不只使用 Elasticsearch 的论点是什么?顺便说一句,谢谢你的回答
【解决方案3】:

在生产环境中使用 Elasticsearch 之后,我可以在这个线程中添加一些注释:

  • 我们通过反向代理来保护我们的 Elasticsearch 集群,该代理会在请求时检查客户端证书的真实性,然后再让查询进入:这证明无论如何都有多种方法可以添加身份验证。 (如果您需要更准确的安全性,例如使用角色,可以添加几个插件来管理权限)
  • Elasticsearch 映射和设置(调整)是非常重要的概念,在使用它进行生产之前需要充分理解,要让所有东西快速运行并不容易。
  • 群集和水平缩放非常灵活且易于设置
  • 套件工具(Kibana、beats 等)是一种非常方便的方式来收集日志、公开关键数据等...
  • 搜索功能非常先进,如果您掌握了全文搜索的工作原理(模糊、增强、评分、词干提取、分词器、分析器等......),您真的可以做出惊人的事情。
  • API 有点分散,没有独特的方法来实现某些东西。并且某些 API 使用起来真的很 WTF,例如批量插入 API:您需要传递二进制数据,采用 JSON 格式(ofc 不要忘记行尾字符)并多次重复某些字段。这非常冗长,我想这是我们项目中的遗留代码;)。
  • 最后一件事:如果您开发 Java 项目,请不要使用 Hibernate Search 将数据从数据源复制到您的 ES 集群,Hibernate Search 有很多问题,如果我们不得不再次这样做,我们会这样做手动的。

现在关于真正的问题:

在我看来,仅使用 Elasticsearch 就足够了,并且可以降低拥有多个 NoSQL 存储系统的复杂性。

我认为当你在做一个二元关系和事务数据库 + NoSQL 搜索引擎时是值得的,但是拥有两个大致服务于相同目的的系统有点矫枉过正

【讨论】:

    【解决方案4】:

    我最近在我的公司开发了一项功能,

    我们想要执行一些搜索,并根据其在多个因素和条件下的相关性对结果进行排名。

    所以在我的应用程序中,我们已经使用 MongoDB 作为 Db,

    所以在 ElasticSearch 索引上,我从 MongoDB 中导出了一些我想对其执行搜索和过滤的字段。 因此,根据要求的条件,我还准备了我的 mongo 查询和 elasticsearch 查询并执行了搜索。然后我根据需要对结果进行过滤和排序。 整个流程的设计方式是, 即使 ES 出现错误,mongo 也会获取记录。 如果我从 ES 得到结果,那么 mongo 结果将取决于 ES 结果。 这就是我结合使用 mongo 和 ES 的方式。

    另外,不要忘记正确处理所有更新、删除和新记录插入。

    要知道,结果对我来说真的很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-12
      • 2021-04-20
      • 2018-06-14
      • 2015-11-11
      • 2012-11-19
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多