1、我们如果发出一个搜索请求的话,会拿到一堆搜索结果,这个搜索结果里的各种数据,都代表了什么含义。
GET /_search
----------------------------------结果----------------------------------
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 6,
"successful": 6,
"failed": 0
},
"hits": {
"total": 10,
"max_score": 1,
"hits": [
{
"_index": ".kibana",
"_type": "config",
"_id": "5.2.0",
"_score": 1,
"_source": {
"buildNum": 14695
}
}
]
}
}
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上去。
2、搜索的timeout机制,底层的原理
timeout:默认无timeout,latency平衡completeness,手动指定timeout,timeout查询执行机制。
在查询时,可以手动加上timeout,如:GET /_search?timeout=10ms
,timeout=10ms(毫秒),timeout=1s(秒),timeout=1m(分)。
为什么设置timeout?
(1)如果不设置timeout,我们在查询数据时,加入要查询的数据很多,花费时间很长,甚至几分钟,我们就要等待几分钟之后才能收到返回的结果,对于一些响应速度很敏感的应用,比如电商网站,如果让客户等待这么长时间,那么客户可能就走了,用户体验不好。
(2)timeout机制可以指定每个shard只能在timeout指定的时间范围内,将搜索到的部分数据(也可能全部搜索到了),直接返回给客户端程序,而不是等待数据全部查询出来之后再返回给客户端。
(3)确切的说一次搜索请求可以在用户指定的timeout时长内完成,为一些时间敏感的搜索应用提供良好的支持。
举例:
假设一个es集群内有2个shard,每个shard搜索出来1000条数据需要耗时一分钟,当客户端发送搜索请求并指定timeout为10ms时,假如每个shard在10ms内可以搜索到10条数据,那么当timeout请求时间到达10ms是,这个es集群会返回10*2=20条数据给客户端。

网友评论