搜索的执行过程分为两个阶段:查询后取回
1.查询阶段
查询被向索引中每个分片副本广播,每个分片在本地执行搜索并建立匹配文档的优先队列。
GET /_search
{
"from": 90,
"size": 10
}
这个优先队列的能容纳100个文档
查询分为三步:
如图可视化:
(1)客户端发送一个search搜索请求给请求体node3,node3创建一个长度为from+size的空优先级队列。
(2)node3转发这个搜索请求到搜索中每个分片的原本或副本中。每个分片在本地执行查询并把结果放在一个同样大小的有序本地优先队列中。
(3)每个分片返回document的ID和他优先队列里的所有document的排序值给协调节点node3.然后node3把这些值合并到自己的优先队列产生全局排序结果。
当有更多的副本同时结合更多的硬件时,可以很好的提高搜索的吞吐量。
2.取回阶段
找到那些满足调节的doc,我们要取回它们。
(1)协调节点像相关分片发出get请求
(2)每个分片加载document,并根据需要丰富它们,然后返回协调节点
(3)一旦doc被取回或timeout时间到,协调节点将结果返回客户端
*****强烈不建议使用深分页
*****如果实在需要大量documents,可以设置搜索类型scan为禁用排序
3.搜索选项
Preference:允许你控制使用哪个分片或节点来处理搜索请求
_primary, _primary_first,_local,_only_node:xyz,_prefer_node:xyz和_shards:2,3
结果震荡:排序的不稳定性导致搜索震荡,可以时同一个用户使用固定的分片:使用一个随机字符串来设置preference
Timeout
设置协调节点最多等待多久
rounting 来保证所有相关document被存在一个单独的分片中,搜索就指定这个分片。(大规模搜索系统适用明显)
search_type:
默认query_then_fetch,
其他值:count记数
query_and_fetch(查询并且取回)
dfs_query_then_fetch 和 dfs_query_and_fetch:dfs预查询阶段
scan扫描
4.扫描和滚屏
Scan和scroll滚屏可以高效取回巨大的数据而不需要付出深分页的代价。
GET /_search/scroll?scroll=1m
扫描时size被应用在每个分片上,所以每个批次最多获得size*主分片数。
本文出处:http://blog.csdn.net/shan1369678/article/details/51455254