如何通过后端基于过滤器获取计数

Posted

技术标签:

【中文标题】如何通过后端基于过滤器获取计数【英文标题】:How to Fetch Count Based on Filter through Back-end 【发布时间】:2020-10-11 03:50:45 【问题描述】:

假设我们有一个相当大的产品数据库,例如50 K 手机。我们将这些数据存储在 Elastic Search 中。现在我有一个手机产品列表页面,我使用分页功能一次列出所有手机 10 及其基本详细信息。该页面还有一个过滤器部分,如品牌、价格范围、RAM、平均。评级、发布日期和更多规格。

现在,当我获取三星公司的移动设备和 6 GB 内存时,我触发了一个弹性查询并获得了结果及其总数。所以这里带来了count查询变得复杂,Total count依赖于filter,这种查询增加了系统的负载。

我想要一个系统,它会计算一次过滤器的计数并将其保存在某处,因此我不需要再次计算同一过滤器的计数,从而一次又一次地减少相同过滤器的复杂性开销。让我知道您的知识如何解决这个问题或我应该如何维护我的系统?

任何参考或文章也将不胜感激。

【问题讨论】:

【参考方案1】:

我们能否添加一个缓存层并缓存最常用的过滤器计数。并在库存更新时增加和减少计数。这样我们就可以避免计算。这在弹性搜索的情况下是不可能的,因为它会在更新库存时使缓存失效。这样我们就可以避免对 elasticsearch 的过多点击。

【讨论】:

【参考方案2】:

弹性搜索提供自己的缓存技术,您可以使用这些设置来缓存特定查询

GET /my_index/_search?request_cache=true

  "size": 0,
  "aggs": 
    "popular_colors": 
      "terms": 
        "field": "colors"
      
    
  

这里是更多详细信息的链接。 请注意,您有这么多用于缓存弹性搜索的硬件配置。 https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-request-cache.html#_enabling_and_disabling_caching_per_request.

另外,如果你有多个数据节点,并且查询和聚合频繁的索引很少,并且不同节点的硬件配置不同,那么你应该研究一下elasticsearch冷热节点的概念,并将您的 imp 索引放在热节点中,而不是缓存所有内容

https://www.elastic.co/blog/hot-warm-architecture-in-elasticsearch-5-x

https://www.elastic.co/blog/implementing-hot-warm-cold-in-elasticsearch-with-index-lifecycle-management

【讨论】:

【参考方案3】:

您能否用您正在使用的复杂计数查询示例更新上面的帖子?确定您面临的问题会很有帮助。 谢谢!

【讨论】:

想像一个简单的计数查询,但它在大型数据库(如 50 K 手机数据集)上运行。因此,我想为众多过滤器组合缓存或预先计算这些计数查询数据。 elasticsearch 中的 50K 文档是一个平均大小但不是很大的数据集。您是否在单个索引上运行查询? 假设我已经将数据分片到multiplse索引中,此刻我的应用程序遇到10K请求,现在计算每个10K请求的计数非常昂贵,我的CPU消耗迅速增加,我该如何减少这种计算具有可扩展解决方案的过滤器的复杂性。 在实施第 3 方缓存机制之前获得最佳性能。请看一下 Elasticsearch 缓存功能,因为它既经济又能提高您的性能。尽量在应用程序和弹性搜索之间保持最少数量的组件。此外,elasticsearch 本身现在也有了很大的改进,许多大型组织正在使用它来进行实时查询搜索。您可以查看这些帖子和文档:字段数据缓存:elastic.co/guide/en/elasticsearch/reference/current/… 分片请求缓存:elastic.co/guide/en/elasticsearch/reference/current/… 节点查询缓存:elastic.co/guide/en/elasticsearch/reference/6.8/… 此外,您需要使用 jmeter 或类似工具运行性能测试,以确定这些机制中的任何一个是否正在提高性能。您还可以阅读 Ebay 遵循的做法:tech.ebayinc.com/engineering/…

以上是关于如何通过后端基于过滤器获取计数的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQLAlchemy 过滤 sql 计数(*)

如何使用 bloc 未来获取流从后端过滤数据?

基于唯一值计数的 JS 对象过滤器

在基于 Web 的前端中在哪里实现后端过滤器逻辑

Django 查询 - 在带注释的计数过滤器中获取父对象

5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统