我们如果发出一个搜索请求的话,会拿到一堆搜索结果
GET /test/_search
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"field1" : "value1",
"field2" : "value2"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {"field1" : "value3"}
}
]
}
}
下面主要分析一下返回结果的各种数据的含义和 timeout 机制
1、_search 查询返回结果数据含义分析
took: 整个搜索请求花费了多少毫秒
timed_out: 表示请求是否超时
hits.total: value 表示返回结果的总数,relation 表示关系 例如一般是 eq 表示相等
hits.max_score: 表示本次搜索的所有结果中,最大的相关度分数是多少,每一条 document 对于 search 的相关度,越相关,_score 分数就越大,排位就越靠前
hits.hits:表示查询出来 document 的结果集合
shards: total 表示打到的所有分片,successful 表示打到的分片中查询成功的分片,skipped 表示打到的分片中跳过的分片,failed 表示打到的分片中查询失败的分片
2、search timeout 机制
因为 ES 默认是没有 timeout 的,所以先描述一下场景假设我们有些搜索应用,对时间是很敏感的,比如电商网站,你不能让用户等个 10 分钟,如果那样的话,人家早就走了,不来买东西了。
于是我们就需要有 timeout 机制,指定每个 shard, 就只能在 timeout 时间范围内,将搜索到的部分数据(也可能全都搜索到了),直接返回给客户端,而不是等到所有数据全都搜索出来以后在返回。
这样就可以确保说,一次搜索请求可以在用户指定的 timeout 时长内完成,为一些时间敏感的搜索应用提供良好的支持。
注意:ES 在默认情况下是没有所谓的 timeout 的,比如说如果你的搜索特别慢,每个 shard 都要花好几分钟才能查询出来所有的数据,那么你的搜索请求也会等待好几分钟之后才会返回。
下面画图简单描述一下 timeout 机制