首页 > 解决方案 > 在弹性搜索上搜索和过滤与在弹性搜索上搜索和在 postgres 上过滤

问题描述

我们在堆栈中同时使用 elasticsearch 和 postgres。我的领导认为最好在 elasticsearch 上执行文本搜索并获取命中的 id。然后,触发“IN”查询并在 postgres 上进行过滤。例如:-

a = es.search({params})//返回一个id列表(pks)
b = Dummy.objects.filter(id__in=a).filter({params})

我相信当我们可以在elasticsearch上做所有事情时,它是不必要的。哪种方法会更快?

编辑:更多细节。

这基本上是一个供用户使用的文件库。我们将文件存储在我们的 S3 存储桶中。我们计划将文件名、s3prefix、格式、元数据等文件详细信息存储在 es 上。还有其他字段,例如 date_modified、date_created、owner、file_size。我们希望用户能够对这些参数进行排序和过滤。由于这是一个新产品,因此只有少数用户。最大 10-20 并且没有条目应该以千计。但是,这些数字可能会增长得非常快。

标签: djangopostgresqlelasticsearch

解决方案


如果您可以在 elasticsearch 中存储与响应相关的所有数据,那么在 postgres 中进行第二跳是多余的,因为 ES 可以保存和检索所有正确的文档,包括所需的所有过滤器。

另一方面,如果 postgres db 包含一些信息,这些信息是 ES 中数据之上的附加层,则需要对 postgres 进行第二次查询。这种设置的原因可能是一些数据在 ES 中是相当“静态”的,而 postgres 数据具有动态特性,有许多变化和更新。

所以,这两种选择都可以。这一切都取决于数据以及数据如何存储在两个数据库中。对 postgres 进行第二次查询会引入额外的延迟,但在良好的设置下这可能非常小,并且不会被用户注意到。


推荐阅读