Elasticsearch 搜索结果解析
中文内容来自 B 站中华石杉 Elasticsearch 高手进阶课程,英文内容来自 Elastic 官方文档
搜索元数据
在 Elasticsearch 发出一个搜索请求的话,会拿到一堆搜索结果,我们来看一下这个搜索结果里的各种元数据,都代表了什么含义
<target>
(Optional, string) Comma-separated list of data streams, indices, and index aliases to search. Wildcard (*) expressions are supported.
To search all data streams and indices in a cluster, omit this parameter or use _all or *.
为什么会有 POST 方法?在阿里云上执行了一下,结果似乎和 GET 没有什么不同。
took:整个搜索请求花费了多少毫秒
hits.total:本次搜索,返回了几条结果
hits.max_score:本次搜索的所有结果中,最大的相关度分数是多少,每一条 document 对于 search 的相关度,越相关,_score 分数越大,排位越靠前
hits.hits:默认查询前 10 条数据,完整数据,_score 降序排序
shards:shards fail 的条件(primary 和 replica 全部挂掉),不影响其他 shard。默认情况下来说,一个搜索请求,会打到一个 index 的所有 primary shard 上去,当然了,每个 primary shard 都可能会有一个或多个 replic shard,所以请求也可以到 primary shard 的其中一个 replica shard 上去。
timeout:默认无 timeout,latency 平衡 completeness,手动指定 timeout,timeout 查询执行机制
Response body
took
(integer) Milliseconds it took Elasticsearch to execute the request.
This value is calculated by measuring the time elapsed between receipt of a request on the coordinating node and the time at which the coordinating node is ready to send the response.
Took time includes:
Communication time between the coordinating node and data nodes
Time the request spends in the search thread pool, queued for execution
Actual execution time
Took time does not include:
Time needed to send the request to Elasticsearch
Time needed to serialize the JSON response
Time needed to send the response to a client
timed_out
(Boolean) If true, the request timed out before completion; returned results may be partial or empty.
搜索的 timeout 机制
Request body
timeout
(Optional, time units) Specifies the period of time to wait for a response. If no response is received before the timeout expires, the request fails and returns an error. Defaults to no timeout.
一般情况下,默认是没有 timeout 设置的,如果搜索很慢,每个 Shard 都需要运行好几分钟才能查询出所有的结果,那么搜索请求也会等待好几分钟之后才会返回。
有些搜索应用,对于响应时间是比较敏感的,比如电商网站,如果让用户等 10 分钟,那么用户就会流失掉,不来买东西了。
Elasticsearch 的 timeout 机制,指定每个 Shard 只能在 timeout 设定的时间范围内,将搜索到的全部或部分数据,直接返回给 client 程序,而不是等所有的数据全部都搜索出来之后再返回。
这样可以确保一次搜索请求可以在用户指定的 timeout 时长内完成,在用户的容忍范围之内,为那些对时间敏感的搜索应用提供良好的支持。
timeout=10ms,timeout=1s,timeout=1m
我在阿里云上执行了一下,发现似乎对于结果没有什么影响,当然也可能是因为数据量不够大,查询不是很复杂的缘故。
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/e4a1ff84a6b53bc0f9c4e5532】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论