MST
星途 面试题库

面试题:ElasticSearch任务管理API之中等难度题

在ElasticSearch中,如何使用任务管理API来取消一个长时间运行的搜索任务?请描述具体的API调用步骤及相关参数含义。
21.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试
  1. 获取任务ID
    • 首先,在执行搜索请求时,需要开启track_total_hits参数(这不是获取任务ID的直接方式,但确保搜索请求正常执行以便后续获取任务相关信息)。例如,一个搜索请求可以如下:
    {
        "query": {
            "match_all": {}
        },
        "track_total_hits": true
    }
    
    • 然后,要获取任务ID,在搜索请求的header中添加preference=_local,Elasticsearch会将该搜索任务分配到本地节点,并且在响应的_shards字段中会包含任务ID信息。示例请求(以curl为例):
    curl -X GET "localhost:9200/index_name/_search?preference=_local" -H 'Content-Type: application/json' -d'
    {
        "query": {
            "match_all": {}
        }
    }'
    
    • 响应中的_shards字段会类似如下:
    {
        "_shards": {
            "total": 1,
            "successful": 1,
            "skipped": 0,
            "failed": 0,
            "tasks": [
                "D877552826790330369:12345"
            ]
        },
        "hits": {
            "total": {
                "value": 10,
                "relation": "eq"
            },
            "max_score": 1.0,
            "hits": []
        }
    }
    
    这里的D877552826790330369:12345就是任务ID。
  2. 取消任务
    • 使用_tasks/cancel API来取消任务。
    • API调用格式POST /_tasks/<task_id>/_cancel,其中<task_id>就是上面获取到的任务ID。例如,使用curl
    curl -X POST "localhost:9200/_tasks/D877552826790330369:12345/_cancel"
    
    • 相关参数含义
      • 这里主要就是任务ID,任务ID唯一标识了要取消的任务。它由两部分组成,冒号前的部分是节点ID,冒号后的部分是任务在该节点上的本地ID。Elasticsearch通过这个组合ID可以定位到具体要取消的长时间运行的搜索任务。取消任务成功后,Elasticsearch会停止与该任务相关的资源占用,如查询执行的线程等。