繁体   English   中英

索引更新如何适用于 Solr 和 Elasticsearch?

[英]How the index updates works for Solr and Elasticsearch?

我有一个使用事件溯源和命令查询责任隔离模式的应用程序。 命令部分的开发已经完成,我必须决定如何实现查询部分。

我的系统处理客户订单,因此当订单事件到达时,该订单会使用 orderId 和订单有效负载进行处理。 问题是,在这种形式下,查询订单的唯一方式是通过 orderId,所以我不能问一个问题,比如给我系统中状态为 OPEN 的所有订单。

对于这部分,我必须使用查询部分,我对查询部分的潜在技术实现,一个像 PostGre DB 这样的经典解决方案,或者在我看来 Solr/Elasticsearch 更优雅的方式。

我对 Solr/Elasticsearch 有基本的了解/经验,我想利用这个机会学习更多,但我的困境来了。 我们公司的一些其他部门已经在与 Elasticsearch 合作,那个 deperatment 的同事告诉我,更新 elasticsearch 不是一个好主意,我不太理解他的论点,所以我想在这里问我打算做什么所以你可以告诉我,这是个坏主意,或者 Solr 更适合它。

我计划将我的订单的每个状态更改作为 Elasticsearch 的更新发送,因此它看起来如下所示。

ID 地位 顾客 项目
orderId1 -> 提交订单 订单.客户 订单.项目
orderId1 -> 订单已更改 订单.Customer1 订单.项目
orderId1 -> 订单处理 订单.Customer1 订单.项目
orderId1 -> 订单.ON_DELIVERY 订单.Customer1 订单.项目
orderId1 -> 订单完成 订单.Customer1 订单.项目

如您所见,我必须将 orderId 的多个更新发送到 Elasticsearch/Solr。

所以我的同事告诉我,Elasticsearch 中的 Indexed Documents 是不可变的,当我发送 order.SUBMITTED 事件被索引时,它会创建文档但 order.CHANGED 事件不会更新文档而是创建另一个文档。 现在我不能完全判断这个结果,对于我的业务案例(我将询问我的 Customer1 的订单,我将看到状态 SUBMITTED 和 CHANGED,2 条记录作为查询响应)或操作(额外的负载和存储)。

我是否正确理解了 Eleasticsearch 的行为? 如果是,Solr 会有什么不同吗?

如果理解正确,两者将表现相同,我可以设计任何不同的东西来帮助实现我的目标。

最后,我对这个解决方案使用 PostGre 没有问题,我只是认为 Elasticsearch 或 Solr 是解决这个问题的更自然的选择。 你怎么认为?

谢谢你的答案。

您的同事部分正确,关于 Elasticsearch(ES) 中昂贵的更新和更新是不可变的,但这并不意味着 ES 不适合频繁更新的系统,事实上由于其可扩展性和分布式特性,它是首选和被用于高吞吐量和低延迟系统(包括搜索系统)。 你有一些误解,我会尽力解释它们。

  1. ES和Solr都是基于Lucene的,而昂贵的更新或不可变更新是Lucene的属性,所以无论你选择ES还是Solr,你都将底层使用Lucene,并具有相同的更新机制。
  2. 更新是不可变的,这并不意味着您的旧订单状态将始终在索引中,例如,最初您的订单状态是SUBMITTED ,后来您将其更新为CHANGED ,所以即使它是不可变的,但是当您查询订单状态时,您将获得最新状态(如果刷新发生在索引上,在 ES 中默认为 1 秒),除了永久删除旧文档(在合并过程中发生,在#3 中解释),ES 将旧文档标记为已删除(软通过更新 boolean 标志删除,在文档更新时删除),因此在您搜索期间不会返回这些软删除的文档。
  3. ES 会定期删除旧文档,因此在您的情况下order状态SUBMITTED将在合并过程中从索引中删除,以便旧文档被删除,并且您的索引大小不会增加。

同样重要的是要理解,这种不可变更新为提高搜索/读取性能提供了巨大的好处,因为现在这些段(包含 ES 中的文档)可以在多线程环境中使用,并且可以缓存由于不变性原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM