如何优化 elasticsearch percolator 索引内存性能

How to Optimize elasticsearch percolator index Memory Performance

有没有办法在使用 elasticsearch 过滤器索引时提高内存性能?

我已经为我的过滤器创建了一个单独的索引。我有大约 1 000 000 个用户创建的已保存搜索(用于电子邮件提醒)。创建此过滤器索引后,我的堆使用率飙升至 100%,服务器对任何查询都没有响应。我的资源有限,无法简单地投入更多 RAM 来解决这个问题。唯一的解决办法是删除包含我保存的搜索的索引。

据我所知,过滤器索引永久驻留在内存中。这是完全必要的吗?有没有办法限制这种行为但仍然保留功能?有没有办法优化我的 data/queries/index 结构来规避这种行为,同时仍然达到预期的结果?

从 ElasticSearch 的角度来看,这个问题没有解决方案,也不太可能。我直接和 ElasticSearch 的人聊天,他们的回答是:"throw more hardware at it".

但是我找到了一种方法来解决这个问题,减少我对这个功能的使用。当我分析保存的搜索数据时,我发现我的搜索包含大约 100,000 个唯一关键字搜索以及各种过滤器排列,创建了超过 1,000,000 个保存的搜索。

如果我查看过滤器,它们是这样的:

  • 位置 - 300+
  • 工业 - 50+
  • 等...

给出 space 的解决方案:

100 000 * >300 * >50 * ... ~= > 1 500 000 000

但是,如果我要分解搜索并在过滤器索引中分别为关键字搜索和过滤器编制索引, 我最终的搜索量要少得多:

100 000 + >300 + >50 + ... ~= > 100 350

而且这些搜索本身比原来的搜索更小、更简单。

现在我创建第二个(非过滤器)索引,列出所有 1 000 000 个已保存的搜索并包括来自 滤器指数。

然后我对文档进行过滤,然后执行第二个查询,根据关键字过滤搜索并过滤过滤器结果。 我什至能够保留相关性得分,因为这纯粹是从关键字搜索中返回的。

这种方法将显着减少我的过滤器索引内存占用,同时达到相同的目的。

我想就此方法征求反馈意见(我还没有尝试过,但我会及时通知您)。

同样,如果我的方法成功,您认为它值得一个功能请求吗?