Link Search Menu Expand Document Documentation Menu

分组 Top N 查询

2.17 版本引入

监控前 N 个查询可以帮助您识别在指定时间窗口内基于延迟、CPU 和内存使用量方面资源消耗最大的查询。但是,如果一个计算开销大的查询被多次执行,它可能会占据所有前 N 个查询槽位,从而可能阻止其他开销大的查询出现在列表中。为了解决这个问题,您可以将相似的查询分组,从而深入了解各种高影响力的查询组。

从 OpenSearch 2.17 版开始,前 N 个查询可以按similarity进行分组,未来版本计划提供更多分组选项。

按相似性对查询进行分组

通过similarity对查询进行分组,会根据查询结构对其进行组织,删除核心查询操作之外的所有内容。

例如,以下查询

{
  "query": {
    "bool": {
      "must": [
        { "exists": { "field": "field1" } }
      ],
      "query_string": {
        "query": "search query"
      }
    }
  }
}

具有以下对应的查询结构

bool
  must
    exists
  query_string

当查询共享相同的查询结构时,它们会被分组在一起,确保所有相似的查询都属于同一个组。

配置查询结构

前面的示例查询显示了一个简化的查询结构。默认情况下,查询结构还包括字段名称和字段数据类型。

例如,考虑一个索引index1,其字段映射如下

"mappings": {
  "properties": {
    "field1": {
      "type": "keyword"
    },
    "field2": {
      "type": "text"
    },
    "field3": {
      "type": "text"
    },
    "field4": {
      "type": "long"
    }
  }
}

如果您在此索引上运行以下查询

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "field1": "example_value"
          }
        }
      ],
      "filter": [
        {
          "match": {
            "field2": "search_text"
          }
        },
        {
          "range": {
            "field4": {
              "gte": 1,
              "lte": 100
            }
          }
        }
      ],
      "should": [
        {
          "regexp": {
            "field3": ".*"
          }
        }
      ]
    }
  }
}

那么该查询具有以下对应的查询结构

bool []
  must:
    term [field1, keyword]
  filter:
    match [field2, text]
    range [field4, long]
  should:
    regexp [field3, text]

要将字段名称和字段数据类型从查询结构中排除,请配置以下设置

PUT _cluster/settings
{
  "persistent" : {
    "search.insights.top_queries.grouping.attributes.field_name" : false,
    "search.insights.top_queries.grouping.attributes.field_type" : false
  }
}

按组聚合指标

除了检索单个前 N 个查询的延迟、CPU 和内存指标外,您还可以获取前 N 个查询组的聚合统计信息。对于每个查询组,响应包含以下统计信息

  • 总延迟、CPU 使用量或内存使用量(取决于配置的指标类型)
  • 总查询计数

使用这些统计信息,您可以计算每个查询组的平均延迟、CPU 使用量或内存使用量。响应还包括查询组中的一个示例查询。

配置查询分组

要配置前 N 个查询的分组,请使用以下步骤。

步骤 1:启用前 N 个查询监控

确保为延迟、CPU 或内存至少一个指标启用了前 N 个查询监控。有关更多信息,请参阅配置前 N 个查询监控

例如,要使用默认设置按延迟启用前 N 个查询监控,请发送以下请求

PUT _cluster/settings
{
  "persistent" : {
    "search.insights.top_queries.latency.enabled" : true
  }
}

步骤 2:配置查询分组

通过更新以下集群设置来设置所需的分组方法

PUT _cluster/settings
{
  "persistent" : {
    "search.insights.top_queries.grouping.group_by" : "similarity"
  }
}

group_by设置的默认值为none,表示禁用分组。截至 OpenSearch 2.17,group_by支持的值为similaritynone

步骤 3(可选):限制监控的查询组数量

您可以选择限制监控的查询组数量。已包含在前 N 个查询列表中的查询(资源消耗最大的查询)在确定限制时将不被考虑。本质上,最大值仅适用于其他查询组,而前 N 个查询则单独跟踪。这有助于根据工作负载和查询窗口大小管理查询组的跟踪。

要将跟踪限制为 100 个查询组,请发送以下请求

PUT _cluster/settings
{
  "persistent" : {
    "search.insights.top_queries.grouping.max_groups_excluding_topn" : 100
  }
}

max_groups_excluding_topn的默认值为100,您可以将其设置为010,000(含)之间的任何值。

监控查询组

要查看前 N 个查询组,请发送以下请求

GET /_insights/top_queries

响应包含前 N 个查询组

响应
{
  "top_queries": [
    {
      "timestamp": 1725495127359,
      "source": {
        "query": {
          "match_all": {
            "boost": 1.0
          }
        }
      },
      "phase_latency_map": {
        "expand": 0,
        "query": 55,
        "fetch": 3
      },
      "total_shards": 1,
      "node_id": "ZbINz1KFS1OPeFmN-n5rdg",
      "query_hashcode": "b4c4f69290df756021ca6276be5cbb75",
      "task_resource_usages": [
        {
          "action": "indices:data/read/search[phase/query]",
          "taskId": 30,
          "parentTaskId": 29,
          "nodeId": "ZbINz1KFS1OPeFmN-n5rdg",
          "taskResourceUsage": {
            "cpu_time_in_nanos": 33249000,
            "memory_in_bytes": 2896848
          }
        },
        {
          "action": "indices:data/read/search",
          "taskId": 29,
          "parentTaskId": -1,
          "nodeId": "ZbINz1KFS1OPeFmN-n5rdg",
          "taskResourceUsage": {
            "cpu_time_in_nanos": 3151000,
            "memory_in_bytes": 133936
          }
        }
      ],
      "indices": [
        "my_index"
      ],
      "labels": {},
      "search_type": "query_then_fetch",
      "measurements": {
        "latency": {
          "number": 160,
          "count": 10,
          "aggregationType": "AVERAGE"
        }
      }
    },
    {
      "timestamp": 1725495135160,
      "source": {
        "query": {
          "term": {
            "content": {
              "value": "first",
              "boost": 1.0
            }
          }
        }
      },
      "phase_latency_map": {
        "expand": 0,
        "query": 18,
        "fetch": 0
      },
      "total_shards": 1,
      "node_id": "ZbINz1KFS1OPeFmN-n5rdg",
      "query_hashcode": "c3620cc3d4df30fb3f95aeb2167289a4",
      "task_resource_usages": [
        {
          "action": "indices:data/read/search[phase/query]",
          "taskId": 50,
          "parentTaskId": 49,
          "nodeId": "ZbINz1KFS1OPeFmN-n5rdg",
          "taskResourceUsage": {
            "cpu_time_in_nanos": 10188000,
            "memory_in_bytes": 288136
          }
        },
        {
          "action": "indices:data/read/search",
          "taskId": 49,
          "parentTaskId": -1,
          "nodeId": "ZbINz1KFS1OPeFmN-n5rdg",
          "taskResourceUsage": {
            "cpu_time_in_nanos": 262000,
            "memory_in_bytes": 3216
          }
        }
      ],
      "indices": [
        "my_index"
      ],
      "labels": {},
      "search_type": "query_then_fetch",
      "measurements": {
        "latency": {
          "number": 109,
          "count": 7,
          "aggregationType": "AVERAGE"
        }
      }
    },
    {
      "timestamp": 1725495139766,
      "source": {
        "query": {
          "match": {
            "content": {
              "query": "first",
              "operator": "OR",
              "prefix_length": 0,
              "max_expansions": 50,
              "fuzzy_transpositions": true,
              "lenient": false,
              "zero_terms_query": "NONE",
              "auto_generate_synonyms_phrase_query": true,
              "boost": 1.0
            }
          }
        }
      },
      "phase_latency_map": {
        "expand": 0,
        "query": 15,
        "fetch": 0
      },
      "total_shards": 1,
      "node_id": "ZbINz1KFS1OPeFmN-n5rdg",
      "query_hashcode": "484eaabecd13db65216b9e2ff5eee999",
      "task_resource_usages": [
        {
          "action": "indices:data/read/search[phase/query]",
          "taskId": 64,
          "parentTaskId": 63,
          "nodeId": "ZbINz1KFS1OPeFmN-n5rdg",
          "taskResourceUsage": {
            "cpu_time_in_nanos": 12161000,
            "memory_in_bytes": 473456
          }
        },
        {
          "action": "indices:data/read/search",
          "taskId": 63,
          "parentTaskId": -1,
          "nodeId": "ZbINz1KFS1OPeFmN-n5rdg",
          "taskResourceUsage": {
            "cpu_time_in_nanos": 293000,
            "memory_in_bytes": 3216
          }
        }
      ],
      "indices": [
        "my_index"
      ],
      "labels": {},
      "search_type": "query_then_fetch",
      "measurements": {
        "latency": {
          "number": 43,
          "count": 3,
          "aggregationType": "AVERAGE"
        }
      }
    }
  ]
}

响应正文字段

响应包括以下字段。

字段 数据类型 描述
top_queries 数组 顶级查询组列表。
top_queries.timestamp 整数 查询组中第一个查询的执行时间戳。
top_queries.id 字符串 查询或查询组的唯一标识符。
top_queries.phase_latency_map 对象 查询组中第一个查询的阶段延迟映射。该映射包括查询在expandqueryfetch阶段所花费的时间(以毫秒为单位)。
top_queries.source 对象 查询组中的第一个查询。
top_queries.group_by 字符串 查询执行时应用的group_by设置。
top_queries.total_shards 整数 执行第一个查询的分片数量。
top_queries.node_id 字符串 协调执行查询组中第一个查询的节点的节点 ID。
top_queries.search_type 字符串 搜索请求执行类型(query_then_fetchdfs_query_then_fetch)。有关更多信息,请参阅搜索 API 文档中的search_type参数。
top_queries.indices 数组 查询组中第一个查询所应用的索引。
top_queries.task_resource_usages 对象数组 查询组中第一个查询所属的各种任务的资源使用情况明细。
top_queries.query_hashcode 字符串 唯一标识查询组并从查询结构生成的哈希码。
top_queries.labels 对象 用于标记顶级查询。
top_queries.measurements 对象 查询组的聚合度量。
top_queries.measurements.latency 对象 查询组的聚合延迟度量。
top_queries.measurements.latency.number 整数 查询组的总延迟。
top_queries.measurements.latency.count 整数 查询组中的查询数量。
top_queries.measurements.latency.aggregationType 字符串 当前条目的聚合类型。如果启用了按相似性分组,则aggregationTypeAVERAGE。如果未启用,则aggregationTypeNONE