MongoDB + Elasticsearch 还是只有 Elasticsearch?

MongoDB + Elasticsearch or only Elasticsearch?

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

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

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

非常感谢

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

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

我可以让您的任务更轻松,请看一下我使用 MongoDB、ES、Redis 和 RabbitMQ 的开源作品,所有这些都集成在一个地方,here on github

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

谈论参数 使用 Mongo 而不是 of/together 与 ES:

  1. User/role管理。

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

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

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

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

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

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

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

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

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

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

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

现在开始真正的问题:

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

我认为当您同时使用关系型数据库和事务型数据库 + NoSQL 搜索引擎时,这是值得的,但是拥有两个大致服务于相同目的的系统有点过分了