分组 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
支持的值为similarity
和none
。
步骤 3(可选):限制监控的查询组数量
您可以选择限制监控的查询组数量。已包含在前 N 个查询列表中的查询(资源消耗最大的查询)在确定限制时将不被考虑。本质上,最大值仅适用于其他查询组,而前 N 个查询则单独跟踪。这有助于根据工作负载和查询窗口大小管理查询组的跟踪。
要将跟踪限制为 100 个查询组,请发送以下请求
PUT _cluster/settings
{
"persistent" : {
"search.insights.top_queries.grouping.max_groups_excluding_topn" : 100
}
}
max_groups_excluding_topn
的默认值为100
,您可以将其设置为0
到10,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 | 对象 | 查询组中第一个查询的阶段延迟映射。该映射包括查询在expand 、query 和fetch 阶段所花费的时间(以毫秒为单位)。 |
top_queries.source | 对象 | 查询组中的第一个查询。 |
top_queries.group_by | 字符串 | 查询执行时应用的group_by 设置。 |
top_queries.total_shards | 整数 | 执行第一个查询的分片数量。 |
top_queries.node_id | 字符串 | 协调执行查询组中第一个查询的节点的节点 ID。 |
top_queries.search_type | 字符串 | 搜索请求执行类型(query_then_fetch 或 dfs_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 | 字符串 | 当前条目的聚合类型。如果启用了按相似性分组,则aggregationType 为AVERAGE 。如果未启用,则aggregationType 为NONE 。 |