ES查询原理和timeout讲解
ES的查询过程
1、客户端发送请求到任意一个node,成为coordinate node
2、coordinate node对document进行路由,将请求转发到对应的node(primary或者replicanode上)上,此时使用round-robin随机轮询算法,在primary shard以及其所有的replica中随机选择一个,让读请求负载均衡
3、接收请求的node返回document给coordinate node
4、coordinate node返回document给客户端
5、特殊情况:document如果还在建议索引过程中,可能只有primary shard有,任何一个replica shard都没有,此时可能导致无法获取到document。但是document完成索引建立之后,primary shard和replica shard就都有了
1、搜索出来的一大堆参数,每个参数具体是什么意思
took:表示整个搜索请求花费了多少毫秒
hits.total:本次搜索,返回了几条结果
hits.max_score:本次搜索的所有结果中,最大的相关度分数是多少。每一条document对于search的相关度,越相关,_score分数越大,排位越靠前
hits.hits:默认查询出前10条数据,完整数据,_score降序排序
shards:shard fail的条件,不影响其他shard。默认情况下来说,一个搜索请求,会打到一个index的所有primary shard上去,当然了,每个primary shard都可能会有一个或多个replic shard,所以请求也可以到primary shard的其中一个replica shard上去。
timeout:默认无timeout,latency平衡completeness,手动指定timeout,timeout查询执行机制
GET /_search
{
"took": 19,
"timed_out": false,
"_shards": {
"total": 21,
"successful": 21,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 32538,
"max_score": 1,
"hits": [
{
"_index": ".kibana",
"_type": "doc",
"_id": "config:6.4.0",
"_score": 1,
"_source": {
"type": "config",
"updated_at": "2018-09-12T16:02:30.105Z",
"config": {
"buildNum": 17929,
"telemetry:optIn": true
}
}
}
.......
2、从上面日志我们可以看出整个查询话了19毫秒,我们将timeout设置短点看是否可以查询出来
下面我们设置成10毫秒就查询不到数据了
GET /_search?timeout=10
通俗的来讲这timeout就是将在设置了指定查询时间内的数据返回给客户端,不等待其他数据。
例如,一个请求同时需要查询2个shard的数据,整个请求可能需要10毫秒1000条数据,如果我们将timeout设置成5毫秒,那么会将5毫秒查询的可能是500条数据返回给客户端
3、multi-index和multi-type搜索模式
/_search:所有索引,所有type下的所有数据都搜索出来
/index1/_search:指定一个index,搜索其下所有type的数据
/index1,index2/_search:同时搜索两个index下的数据
/*1,*2/_search:按照通配符去匹配多个索引
/index1/type1/_search:搜索一个index下指定的type的数据
/index1/type1,type2/_search:可以搜索一个index下多个type的数据
/index1,index2/type1,type2/_search:搜索多个index下的多个type的数据
/_all/type1,type2/_search:_all,可以代表搜索所有index下的指定type的数据