query and fetch 在什么情况下会用到呢

作者 code4j | 发布于2018年07月07日 | 阅读数:345

query and fetch和then的区别是前者只需要去每个分片去一次size大小的数据,后者是先fetch文档得分id等元数据信息,然后再取topN。
 
这样看来,前者虽然只有一次rpc,但是一次查询后再coordinate中占用内存很多,分片越大,size增多会有隐患。而后者虽然要走两次rpc,但是第一次获取元数据信息内存占用很少,第二次只需要获取size大小数据即可,感觉还是可以接受的。
 
而且前者返回的是size的N倍(N是分片数),业务上通常都是去多少用多少的,我设置size=10你给我30我会认为查询语句有错误,不希望要多余的数据。后者至少能保证我取多少就要多少。
 
所以不明白前者为什么不在返回之前做一次topN。
 
那么query and fetch在什么场景下会用到呢?
已邀请:

medcl - Elastic 🇨🇳 !

赞同来自: code4j

query_and_fetch 主要是用来进行内部优化的,如果你只有一个分片,你完全不需要分两个阶段(记住,你只有一个分片,不用管其他分片的情况),先拿一次分片下的得分信息再拿具体的文档,不如一次性拿回来就好了。
 
所以 query_and_fetch 从来不是直接给用户来使用的,并且在 5.3 版本之后已经移除了这个选项。
你看最新的文档,query_and_fetch 这个参数在 search_type 里面也是没有的。

要回复问题请先登录注册