如何分析Elasticsearch 7.7的异步搜索原理,相信很多没有经验的人都不知所措。因此,本文总结了问题产生的原因和解决方法,希望大家可以通过这篇文章来解决这个问题。
Elasticsearch版本带来了一项新功能。搜索过程允许异步执行。客户端发送搜索请求后,弹性搜索服务器向客户端返回一个id。稍后,客户端使用该id来获取搜索进度,并支持返回“部分”结果。这对于UI交互相关的查询请求是非常友好的,比如绘图过程可以分步显示。
00-1010异步搜索使用起来非常简单,只需使用新的API,其余与_search请求相同:
POST /_async_search返回的结果中将有几个新字段:
id:根据这个id获取后续查询进度。is_partial:当查询完成时,此字段指示查询是在所有片段上成功执行还是失败。is_running:指示搜索过程是否仍在运行。
如果搜索很快完成,则_async_search的响应将包含完整的搜索结果。默认情况下,它将等待1秒钟,这由参数wait_for_completion_timeout控制。如果超过此时间,将根据id获得搜索进度(或结果):
GET/_ async _ search/fmrlde 8 zreveuza2zvpuegs2 ejffeamkz 5 qtvrstzsavn 3 wlnfvmtlwhjsdzoxmdc=$ ' ' cn=这里考虑得很周到。开启用户认证后,每个人只能得到自己提交的异步搜索结果,别人是看不到的。默认情况下,搜索结果保存5天,并由keep_alive参数控制。
同样,您可以手动删除此异步搜索请求,如果搜索仍在进行中,它将被取消。
delete/_ async _ search/fmrlde 8 zreveuza2zvpuegs2 ejffeamkz 5 qtvrstzsavn 3 wlnfvmtlwhjsdzoxmdc=
基本用法
异步搜索和同步搜索的实现原理没有太大区别,按数据节点搜索的过程是一样的。唯一不同的是,协调节点最初必须等待整个进程被处理后才能返回客户端,但现在它只等待1秒钟(由wait_for_completion_timeout参数控制)。如果整个过程在1秒内完成,最终结果将返回给客户端。超过1秒后,将生成一个id并返回给客户端。
通常情况下,数据节点在执行完一个片段的查询后,会返回一个完整片段级的Response,不会统计一个点,返回一个点,所以Response的单位仍然是片段级。但是,batched_reduce_size默认设置为5,在同步搜索中默认为512。较小的值可以尽快向客户端返回一些结果。
为了将查询结果保存5天,es将设置一个名为。异步搜索,并将查询结果保存到其中。但是,如果搜索过程在wait_for_completion_timeout超时内结束,所有结果集都将在当前请求中返回,并且不会保存到。异步搜索索引。
实现原理
异步搜索返回一个id,然后根据这个id获取进度。如何获取该任务信息?而进度和结果集需要存储在哪里是一个需要考虑的问题。es会把它放在两个地方:
如果搜索过程尚未完成,则从协调节点的taskmanager获取进度信息。
如果搜索完成,进度和结果集将保存在名为的索引中。异步搜索。
第一种情况,相当于进度信息存储在协调节点的内存中,这个信息只存在于整个集群的单个节点中。所以,当你的异步搜索请求发送到node1,获取进度的请求发送到node2(比如负载均衡器转发或者客户端自己轮询)时,如何获取node2中的进度信息?答案是node2会在收到GET请求后将请求转发给node1以获取进度。那么节点2如何知道异步搜索请求被发送到节点1呢?实际上,所有这些信息都存储在异步搜索请求返回的id中,所以现在您知道它为什么这么长了:
id ' : ' fmrlde 8 z rev uza 2 z puebgs 2 EJ jffeamkz 5 qtvrstzsavn 3 wlnfvmtlwhjsdzomdc='贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强!贺南强身份证明(identification)号-什么64号基地{ fnsimheibord 1 sh ad1 pos(200,288)}这是我的错{ fnsimheibord 1 sh ad1 pos(200,288)}我的错{ fnsimheibord 1 sh ad1 pos(200,288)}我的错,范仲淹把范仲淹给范仲淹:
docIdo 40个
搜索结果保存 .async-search 中时,该异步搜索任务结果在 .async-search 中的 docId
nodeId 接收 asyncsearch 搜索请求的节点的 nodeId
id 在 taskManager 中的任务 id
有了这些信息之后,GET 搜索进度的流程就比较清楚了:
协调节点收到 GET /_async_search/id 请求后,根据 id解码出上述三个信息,先判断执行_async_search的节点是否本节点,如果不是本节点就直接根据解码出的nodeId给目标节点发送RPC 请求来获取这个信息;如果是本节点,就根据任务 id从自己的 taskManager 中获取,或者根据docId执行一个普通的 GET doc请求,从 .async-search 索引中获取。
.async-search 索引的过期删除
索引 .async-search中的数据默认保存5天,不过大家都知道 es 里没有 TTL 的概念,那么数据的过期删除如何实现?实际上 es 内部会定期对该索引执行 DeleteByQuery:
DeleteByQueryRequest toDelete = new DeleteByQueryRequest(INDEX)
.setQuery(QueryBuilders.rangeQuery(EXPIRATION_TIME_FIELD).lte(nowInMillis));
当节点收到集群状态时,在 clusterChanged 中驱动周期线程执行清理,默认1小时执行一次,由参数 async_search.index_cleanup_interval 控制,该清理操作由 GENERIC 线程池执行,并且只会在 .async-search 索引的0号主分片所在的节点执行,不会在所有节点都执行清理工作。
看完上述内容,你们掌握怎样进行Elasticsearch 7.7 的异步搜索原理解析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/132973.html