Elasticsearch Query

ES的搜索请求路由流程

REST API 搜索请求被发送到所连接的节点,该节点根据要查询的索引,将这个请求依次发送到所有的相关分片(主分片或者副分片)。从所有分片收集到足够的排序和排名信息之后,只有包含所需文档的分片才被要求返回相关内容

索引行为 搜索应用程序将索引构建请求至es客户端后,系统首先根据文档ID的散列值选择一个主分片,并将文档发送到该主分片,如果请求的节点中没有改主分片,该节点会自动帮我们转发至对应节点,然后文档被发送到该主分片的所有副本分片进行索引,使得主副分片数据保持同步。同时副分片还有升级成主分片的功能。

es的查询类型SearchType
这种过程称为默认搜索路由,这种搜索路由的行为是可以配置的通常与es索引插入时的路由一致,默认为查询后获取(QUERY_THEN_FETCH)
1.主节点将请求分发给所有分片,各个分片打分排序后将数据的id和分值返回给主节点
2.主节点收到后按照各分片返回的分数进行重新排序和排名,取前size个文档
3.主节点到对应的节点读取对应的数据再返回给客户端
此种方式需要和es交互两次

查询并获取(QUERY_AND_FETCH)
1.主节点将查询请求分发到所有的分片中,各个分片按照自己节点的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点
2.主节点对所有数据进行汇总排序然后再返回给客户端
此种方式只需要和es交互一次

DFS QUERY_AND_FETCH 这种方式比QUERY_AND_FETCH多了一个初始化散发(initial scatter)计算全局词频(term frequencies)步骤
1.先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作。
2.主节点将查询请求分发到所有的分片中,各个分片按照initial scatter之后的打分规则
3.然后将数据集结果以及返回给主节点
优点是排名准确,但返回的数据量不准确,可能返回(N分片数量)的数据*

DFS QUERY_THEN_FETCH
1.先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作。
2.主节点将查询请求分发到所有的分片中,各个分片按照initial scatter之后的打分规则,然后将数据id以及打分情况以及返回给主节点
3.主节点收到后按照各分片返回的分数进行重新排序和排名,取前size个文档
4.主节点到对应的节点读取对应的数据再返回给客户端
优点很明显,数据量是准确并且排名也准确,但性能是最差的。

查询的请求方式 进行查询搜索时,需要通过Rsutful风格的post或者get方式,同时并指定关键字_search,搜索索引才会生效

查询的关键参数

你可能感兴趣的:(Elasticsearch Query)