功能简介
天翼云云搜索服务中的OpenSearch和Elasticsearch都支持异步搜索功能(Asynchronous Search),这一功能极大地提升了在处理长时间运行查询时的用户体验和系统效率。通过异步搜索,用户可以在后台执行耗时较长的查询任务,而无需等待查询结果的即时返回。
这一功能对于大数据集、复杂查询以及需要持续获取查询状态的场景特别有用。
核心原理
在传统的同步搜索模式中,用户发出查询请求后,必须等待查询结果返回才能继续其他操作。如果查询涉及大规模数据处理或复杂的计算,这可能会导致用户界面的阻塞和等待时间过长。异步搜索通过将查询任务分离到后台执行,解决了这一问题。
当用户发起异步搜索请求时,搜索引擎会立即返回一个查询任务 ID,而查询本身在后台继续运行。用户可以通过这个任务 ID 随时查询任务的进展情况、获取部分结果或在任务完成后检索最终的完整结果。这种模式下,用户可以在查询结果生成的过程中继续执行其他操作,显著提高了系统的响应性和用户的工作效率。
应用场景与优势
处理复杂查询
对于涉及大量数据处理或复杂计算的查询,异步搜索允许这些任务在后台执行,避免了用户界面因长时间等待而被冻结的情况。这尤其适用于分析海量数据、执行深度聚合或跨多索引的查询任务。
提高系统性能与效率
异步搜索将长时间运行的任务移至后台执行,减少了同步操作对系统资源的占用,优化了集群的整体性能。同时,用户能够并行处理其他任务,提升了操作效率。
断点续查与容错处理
异步搜索支持断点续查,用户可以在查询任务中断或超时时重新查询任务状态或继续执行未完成的任务。这种容错机制增强了查询的可靠性,特别是在网络波动或系统故障情况下。
查询任务管理
用户可以通过任务 ID 管理和监控查询任务,包括取消正在运行的查询、检查任务进度、或者在任务完成后获取结果。这种灵活的任务管理方式为用户提供了更好的控制能力。
技术实现与应用
使用异步搜索功能非常简单,用户可以通过搜索引擎的 REST API 发起异步查询请求。系统会返回一个任务 ID,用户可以使用该 ID 查询任务状态、获取中间结果或最终结果。搜索引擎还提供了管理接口,允许用户查看当前的异步任务列表、取消任务或调整任务的超时时间。
在高并发或复杂查询场景下,异步搜索减少了前端的等待时间,使得用户可以在任务后台执行时继续其他工作,从而提高了工作流的效率和用户体验。
操作示例
我们以Elasticsearch为例。
创建索引:
PUT city-data
{
"settings": {
"number_of_replicas": 0
},
"mappings": {
"properties": {
"city": {
"type": "keyword"
}
}
}
}
插入数据:
POST city-data/_doc
{
"city": "Shanghai"
}
POST city-data/_doc
{
"city": "Beijing"
}
POST city-data/_doc
{
"city": "Guangzhou"
}
提交异步搜索请求:
POST _opendistro/_asynchronous_search/?pretty&size=10&wait_for_completion_timeout=1ms&keep_on_completion=true&request_cache=false
{
"aggs": {
"city": {
"terms": {
"field": "city",
"size": 10
}
}
}
}
这个命令会返回一个id:
"id" : "FnJRN1FZek04UTFldERyWThfZUtMaFEDOTMyFEhuZkZFbzRCbERJd09IVC0zTG9IATY="
获取异步搜索结果:
GET _opendistro/_asynchronous_search/FnJRN1FZek04UTFldERyWThfZUtMaFEDOTMyFEhuZkZFbzRCbERJd09IVC0zTG9IATY=?pretty
返回:
{
"id" : "FnJRN1FZek04UTFldERyWThfZUtMaFEDOTMyFEhuZkZFbzRCbERJd09IVC0zTG9IATY=",
"state" : "STORE_RESIDENT",
"start_time_in_millis" : 1709711940616,
"expiration_time_in_millis" : 1709798340616,
"response" : {
"took" : 90,
"timed_out" : false,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "city-data",
"_type" : "_doc",
"_id" : "G3fFEo4BlDIwOHT-froB",
"_score" : 1.0,
"_source" : {
"city" : "Shanghai"
}
},
{
"_index" : "city-data",
"_type" : "_doc",
"_id" : "HHfFEo4BlDIwOHT-frrH",
"_score" : 1.0,
"_source" : {
"city" : "Beijing"
}
},
{
"_index" : "city-data",
"_type" : "_doc",
"_id" : "HXfFEo4BlDIwOHT-f7oM",
"_score" : 1.0,
"_source" : {
"city" : "Guangzhou"
}
}
]
},
"aggregations" : {
"city" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "Beijing",
"doc_count" : 1
},
{
"key" : "Guangzhou",
"doc_count" : 1
},
{
"key" : "Shanghai",
"doc_count" : 1
}
]
}
}
}
}
搜索引擎的异步搜索功能为处理复杂和长时间运行的查询提供了极大的灵活性和效率。通过将查询任务移至后台执行,异步搜索不仅提升了系统的性能,还改善了用户的操作体验。
无论是在处理大数据集、优化系统资源利用,还是在实现查询任务的灵活管理方面,异步搜索都为用户提供了一个强大而高效的解决方案。