如何优化elasticsearch过滤器索引内存性能

时间:2015-02-03 07:43:19

标签: elasticsearch elasticsearch-percolate

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

我为我的过滤器创建了一个单独的索引。我有大约1 000 000个用户创建的已保存搜索(用于电子邮件警报)。创建此过滤器索引后,我的堆使用率达到100%,服务器对任何查询都没有响应。我的资源有限,我不能简单地在这个问题上投入更多内存。唯一的解决方案是删除包含我保存的搜索的索引。

据我所知,过滤器索引永久存在于内存中。这完全是必要的吗?有没有办法限制这种行为,但仍保留功能?有没有办法优化我的数据/查询/索引结构,以避免这种行为,同时仍然实现所需的结果?

1 个答案:

答案 0 :(得分:0)

从ElasticSearch的角度来看,这个问题没有解决方案也不可能。我直接和ElasticSearch的人聊过,他们的回答是:"扔掉更多的硬件"。

然而,我已经找到了一种方法来减轻我对此功能的使用方面的问题。当我分析保存的搜索数据时,我发现我的搜索包含大约10万个唯一关键字搜索以及各种过滤排列,创建了超过1 000 000次保存搜索。

如果我查看过滤器,它们就是:

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

提供以下解决方案空间:

  

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

但是,如果我要分解搜索并在过滤器索引中单独索引关键字搜索和过滤器,  我的搜索结果要少得多:

  

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

这些搜索本身比原始搜索更小,更简单。

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

然后我渗透文档,然后进行第二次查询,过滤搜索关键字和过滤器过滤器结果。 我甚至能够保留相关性得分,因为这纯粹来自关键字搜索。

这种方法将显着降低我的过滤器索引内存占用量,同时用于相同目的。

我想邀请有关这种方法的反馈意见(我还没有尝试过,但我会告诉你)。

同样,如果我的方法成功,您认为值得提出功能吗?