ElasticSearch(九)-分布式搜索

搜索的执行过程分为两个阶段:查询后取回
1.查询阶段
    查询被向索引中每个分片副本广播,每个分片在本地执行搜索并建立匹配文档的优先队列。

GET /_search
{
    "from": 90,
    "size": 10
}

这个优先队列的能容纳100个文档
查询分为三步:
如图可视化:
ElasticSearch(九)-分布式搜索_第1张图片
1)客户端发送一个search搜索请求给请求体node3node3创建一个长度为from+size的空优先级队列。
2node3转发这个搜索请求到搜索中每个分片的原本或副本中。每个分片在本地执行查询并把结果放在一个同样大小的有序本地优先队列中。
3)每个分片返回documentID和他优先队列里的所有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_fetchdfs预查询阶段
        scan扫描
 
4.扫描和滚屏
  Scanscroll滚屏可以高效取回巨大的数据而不需要付出深分页的代价。
  GET /_search/scroll?scroll=1m
扫描时size被应用在每个分片上,所以每个批次最多获得size*主分片数。

本文出处:http://blog.csdn.net/shan1369678/article/details/51455254

你可能感兴趣的