使用Elasticsearch渗滤器索引时,有没有办法改善内存性能?
我为渗滤器创建了一个单独的索引。我大约有1000000个用户创建了保存的搜索(用于电子邮件警报)。创建此过滤器索引后,我的堆使用率飙升至100%,服务器对任何查询均无响应。我的资源有限,无法简单地在此问题上投入更多的RAM。唯一的解决方案是删除包含我已保存的搜索的索引。
根据我的阅读,渗滤器索引永久地驻留在内存中。这完全必要吗?有没有办法限制这种行为但仍保留功能?有没有一种方法可以优化我的数据/查询/索引结构来规避这种行为,同时仍能达到预期的结果?
从ElasticSearch的角度来看,没有解决此问题的方法,也不可能。我已经直接与ElasticSearch的家伙聊天,他们的回答是:“向它扔更多的硬件”。
但是,我已经找到了解决此问题的方法,以减轻我对该功能的使用。当我分析保存的搜索数据时,我发现我的搜索由大约100 000个唯一关键字搜索以及各种过滤器排列组成,这些搜索创建了超过1000000个保存的搜索。
如果我看一下过滤器,它们就是:
提供以下解决方案空间:
100 000 > 300 > 50 * …〜=> 1500万
但是,如果我要分解搜索并在渗滤器索引中分别为关键词搜索和过滤器建立索引,那么最终的搜索量会少得多:
100000 +> 300 +> 50 + …〜=> 100350
而且这些搜索本身比原始搜索要小且不那么复杂。
现在,我创建第二个(非过滤器)索引,列出所有已保存的1000000次搜索,并包括过滤器索引中搜索组件的ID。
然后,我对文档进行渗滤,然后执行第二个查询,以针对关键字过滤搜索并过滤渗滤器结果。我什至能够保留相关性分数,因为它仅从关键字搜索中返回。
这种方法将大大减少我的过滤器索引的内存占用,同时达到相同的目的。
我想邀请您就此方法提供反馈(我尚未尝试过,但会及时通知您)。
同样,如果我的方法成功了,您认为值得提出功能要求吗?