ElasticSearch频繁更新

Jos*_*shD 3 elasticsearch

我们对搜索引擎的更换有一系列相当困难的要求,它们如下。

  • 每个实例都有一个独特的模式,我们有多个我们无法控制的客户端安装,它们具有不同的数据结构
  • 频繁更新,每条记录在单个操作中更新一个字段的情况并不罕见。有些字段经常更新,其他字段从不更改
  • 我们的一些字段可能非常大(50mb+),尽管这些字段从未改变并且在数据集中很少见。
  • 如果可能的话,我们希望进行近乎实时的搜索

我们正在考虑将半频繁/频繁更新的字段放入子文档中。问题在于,我们有一组标签在我们想要近实时搜索的记录上经常更改。我们的应用程序强烈期望当这些数据被修改时,搜索会立即反映出来。我们尝试过子文档,但它们在大型数据集上的更新速度似乎没有我们希望的那么快。

所以问题如下:

  • 是否有我不知道的快速更新子文档的策略?也许是一个插件?目前我们只使用 RESTFUL 接口
  • 将不经常更改的数据存储在ES中,但将标签保留在数据库中会更好吗?可能在 ES 中创建一个插件将两者映射在一起?这个插件会很难吗?理想情况下,我们能够以布尔方式将搜索(标签+常规 ES 查询)混合在一起,包括存储在表中的标签。

Jos*_*shD 6

希望这对其他人在这种情况下有所帮助,这是我想出的解决方案。

  • 使用儿童/家长文件
  • 有一个父项包含很少/从不更改的记录的静态信息(索引的大量数据)
  • 为我想要索引的其他数据创建子文档,以便可以独立于主文档对它们进行索引

由于我已将要索引的记录数据拆分为静态和非静态文档,然后将该非静态数据分解为更多子文档,因此我能够创建高吞吐量索引器。要索引的记录总数被拆分为子块,然后进一步拆分为其子文档类型。我会将这些块拆分为各种索引器实例,然后这些实例将仅受数据源或 ES 集群的吞吐量限制,以确定每秒可以对多少文档建立索引。

这一切都是通过批量 API 完成的。使静态数据远离频繁变化的数据使得经常变化的数据能够相当快地更新,并且该速度仅受可用硬件的限制。使用子文档子句和聚合来编写查询有点困难,但一切似乎都有效。

笔记

  • 使用父/子文档会带来性能损失,考虑到 ES 相对于之前的解决方案给我们带来的好处,这对我们来说不是问题,但它可能会给其他实现带来问题。