ES中的分布式搜索

一.查询阶段
查询会广播到索引的每个分片(主分片或者副本分片),每个分片搜索并构建一个匹配结果的优先队列(存储top-n文档有序列表)
步骤:
1.发送请求到协调节点,协调节点创建一个from+size的空优先队列
2.协调节点广播到索引每个分片中,每个分片查询并存储from+size的优先队列
3.每个分片返回优先队列当中的ID和排序值给协调节点,协调节点合并到自己的优先队列产生结果列表

二、取回阶段
1.协调节点分辨需要取回的结果并提交给对应分片取回
2.分片丰富文档(比如指定查询字段、高亮等信息)
3.协调节点取回所有文档则返回给客户端

备注:由于协调节点需要分片数量*(from+size)大小的队列来取结果。所以尽量不要使用深分页(传递较大的from和size)

三、影响搜索
1.可使用preference控制分片或节点处理请求
参考:https://www.elastic.co/guide/en/elasticsearch/reference/master/search-request-preference.html
2.可使用time_out设定每个分片允许处理数据的最大时间
备注:达到time_out时间则会把已知结果返回
3.可以使用routing参数指定搜索相关的分片
4.可以使用search_type(强烈建议不要在生产环境使用!!!!)

四、游标查询
原理:游标查询先做查询初始化,然后批量拉取结果
用途:解决深分页问题

1.查询初始化
GET /megacorp/employee/_search?scroll=1m
{
  “query”:{ 
    “match”: { 
      “about”:”build”
    }
  },
  “sort” : [“_doc”],
  “size” : 2
}
备注:使用_doc是最有效的排序方式

2.根据返回的_scroll_id做下一批的查询
GET _search/scroll
{
  “scroll”:”1m”,
  “scroll_id”: “DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAA0XFjEweWo3eTR4VHBDclgyWnRSY2lGbXcAAAAAAAANGRYxMHlqN3k0eFRwQ3JYMlp0UmNpRm13AAAAAAAADSIWcFNUX2pjYmdUVE9XcHhRNzd3ZkNSQQAAAAAAAA0aFjEweWo3eTR4VHBDclgyWnRSY2lGbXcAAAAAAAANGBYxMHlqN3k0eFRwQ3JYMlp0UmNpRm13”
}



Tagged , , , , . Bookmark the permalink.

Comments are closed.