GET /_search { "from": 90, "size": 10 }
4.查询阶段包含以下三步
1. 客户端发送一个search(搜索)请求给Node 3,Node 3创建了一个长度为from+size的空优先级队列。
2. Node 3 转发这个搜索请求到索引中每个分片的原本或副本。每个分片在本地执行这个查询并且结果将结果到一个大小为from+size的有序本地优先队列里去。
3. 每个分片返回document的ID和它优先队列里的所有document的排序值给协调节点Node 3。Node 3把这些值合并到自己的优先队列里产生全局排序结果。
... "timed_out": true, //搜索请求超时 "_shards": { "total": 5, "successful": 4, "failed": 1 //五个分片中有一个没在超时时间内答复 }, ...
GET /_search?routing=user_1,user2
- 这个技术在设计非常大的搜索系统时就会派上用场了。search_type(搜索类型) 虽然query_then_fetch是默认的搜索类型,但也可以根据特定目的指定其它的搜索类型,例如:
GET /_search?search_type=count
- count(计数)
- count(计数)搜索类型只有一个query(查询)的阶段。当不需要搜索结果只需要知道满足查询的document的数量时,可以使用这个查询类型。
- query\_and\_fetch(查询并且取回)
- query\_and\_fetch(查询并且取回)搜索类型将查询和取回阶段合并成一个步骤。这是一个内部优化选项,当搜索请求的目标只是一个分片时可以使用,例如指定了routing(路由选择)值时。虽然你可以手动选择使用这个搜索类型,但是这么做基本上不会有什么效果。
- dfs\_query\_then\_fetch 和 dfs\_query\_and\_fetch
- dfs搜索类型有一个预查询的阶段,它会从全部相关的分片里取回项目频数来计算全局的项目频数。
- scan(扫描)
- scan(扫描)搜索类型是和scroll(滚屏)API连在一起使用的,可以高效地取回巨大数量的结果。它是通过禁用排序来实现的。
GET /old_index/_search?search_type=scan&scroll=1m (1) { "query": { "match_all": {}}, "size": 1000 }