• 大数据管道聚合并分页 有什么调优方案


    多个字段groupby 查询terms的字段和求和,目前采用的是管道聚合符合要求,但数据量大(几千万条数据)之后反而很慢,求解决思路

    GET xxx-20240929/_search
    {
      "size": 0,
      "timeout": "5m",
      "query": {
        "bool": {
          "should": [
            {
              "bool": {
                "must_not": [
                  {
                    "term": {
                      "a.country": {
                        "value": "中国"
                      }
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must_not": [
                  {
                    "term": {
                      "b.country": {
                        "value": "中国"
                      }
                    }
                  }
                ]
              }
            }
          ],
          "must": [
            {
              "range": {
                "ts": {
                  "gte": 1726290562000,
                  "lte": 1726549762000
                }
              }
            }
          ]
        }
      },
      "sort": [
        {
          "ts": {
            "order": "desc"
          }
        }
      ],
      "track_total_hits": true,
      "aggregations": {
        "totalCount": {
          "cardinality": {
            "script": {
              "source": "doc['hg'].value+'__##__'+doc['kp'].value",
              "lang": "painless"
            }
          }
        },
        "NAME": {
          "terms": {
            "script": {
              "source": "doc['hg'].value+'__##__'+doc['kp'].value",
              "lang": "painless"
            },
            "size": 50,
            "min_doc_count": 1,
            "shard_min_doc_count": 0,
            "show_term_doc_count_error": false,
            "order": [
              {
                "glowEnd": "desc"
              },
              {
                "_key": "asc"
              }
            ]
          },
          "aggregations": {
            "bytesToClient": {
              "sum": {
                "field": "glow.bytes_toclient"
              }
            },
            "bytesToServer": {
              "sum": {
                "field": "glow.bytes_toserver"
              }
            },
            "glowAge": {
              "sum": {
                "field": "glow.age"
              }
            },
            "hgpt": {
              "terms": {
                "field": "hgpt",
                "size": 100,
                "min_doc_count": 1,
                "shard_min_doc_count": 0,
                "show_term_doc_count_error": false,
                "order": [
                  {
                    "_count": "desc"
                  },
                  {
                    "_key": "asc"
                  }
                ]
              }
            },
            "kppt": {
              "terms": {
                "field": "kppt",
                "size": 100,
                "min_doc_count": 1,
                "shard_min_doc_count": 0,
                "show_term_doc_count_error": false,
                "order": [
                  {
                    "_count": "desc"
                  },
                  {
                    "_key": "asc"
                  }
                ]
              }
            },
            "glowEnd": {
              "max": {
                "field": "glow.end"
              }
            },
            "glowStart": {
              "min": {
                "field": "glow.start"
              }
            },
            "topHits": {
              "top_hits": {
                "from": 0,
                "size": 1,
                "version": false,
                "seq_no_primary_term": false,
                "explain": false,
                "sort": [
                  {
                    "ts": {
                      "order": "desc"
                    }
                  }
                ]
              }
            },
            "pages": {
              "bucket_sort": {
                "sort": [],
                "from": 1,
                "size": 50,
                "gap_policy": "SKIP"
              }
            }
          }
        }
      }
    }
    
    

    展开全部

    • 香格里辣 2024-10-11 17:15
      关注

      以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

      针对大数据量的管道聚合和分页查询,优化Elasticsearch查询性能是一个复杂的过程,涉及到多个方面。根据你提供的查询,以下是一些优化建议:

      1. 索引优化:

        • 确保你的字段有合适的映射和数据类型。例如,日期字段使用合适的日期格式。
        • 使用适当的分片策略。根据你的查询和数据量,可能需要调整分片的数量。
        • 使用更新API来优化索引数据的写入性能。
      2. 查询优化:

        • 使用更精确的查询条件来减少返回的数据量。例如,使用term查询代替match查询可以提高性能。
        • 减少不必要的字段投影。在聚合查询中,只选择你真正需要的字段,避免不必要的计算。
        • 优化聚合逻辑。根据具体情况调整聚合的深度和复杂度。在可能的情况下,考虑合并或简化聚合逻辑。
      3. 脚本和计算字段:

        • 使用脚本计算字段时,尽量避免在聚合中进行复杂的计算,这会增加CPU负载并降低查询性能。如果可能的话,预先计算这些值并将其存储为单独的字段。
        • 考虑使用预聚合技术,如使用Elasticsearch的预聚合功能或外部工具进行预处理。
      4. 分页优化:

        • 使用fromsize参数进行分页时,请注意随着页数的增加,性能会下降。考虑使用其他策略,如基于游标或时间范围的检索来替代纯分页。对于大数据量的场景,可以考虑使用搜索后滚动(search_after)功能替代传统的分页方式。
      5. 硬件和集群优化:

        • 确保Elasticsearch集群有足够的资源(CPU、内存、磁盘IO)。根据需要进行扩容或优化硬件配置。
        • 使用多节点和分片来提高分布式查询的并行处理能力。合理设置副本数量可以提高查询的可靠性并分散负载。
      6. 监控和调试:

        • 使用Elasticsearch的监控工具(如Elasticsearch Head、Kibana等)来监控查询的性能和资源使用情况。找出瓶颈并进行相应的优化。
        • 开启慢查询日志以识别性能瓶颈和慢查询。针对这些慢查询进行优化。
      7. 其他技巧:

        • 考虑使用缓存机制来缓存常见查询的结果,以减少实时计算的需求。
        • 定期重新索引或优化索引以清理旧数据或碎片化的数据。
        • 考虑使用Elasticsearch的滚动升级来平滑升级过程,避免一次性升级带来的性能波动。每个优化策略都有其特定的应用场景和局限性,因此需要根据实际情况进行测试和调整,找到最适合的解决方案。此外,持续监控和优化是保证Elasticsearch性能的关键,尤其是在处理大量数据时。

      展开全部

    • 相关阅读:
      leetcode 22.8.5 只出现一次的数字
      前端学习开发之【Vue】-中
      eub:SpringSecurity的使用(三)
      第3章 处理机调度与死锁
      区服分析丨更透彻的游戏营运数据解读,助力高效增长
      sql:SQL优化知识点记录(十二)
      SPI_OLED模块操作方法
      职场进阶指南:大厂人必看书籍推荐
      IO流框架,缓冲流
      搭建内网穿透工具-ngrok
    • 原文地址:https://ask.csdn.net/questions/8150908