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

ES查询原理和timeout讲解

通俗的来讲这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的数据