一.查询阶段 查询会广播到索引的每个分片(主分片或者副本分片),每个分片搜索并构建一个匹配结果的优先队列(存储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” }