query and fetch和then的区别是前者只需要去每个分片去一次size大小的数据,后者是先fetch文档得分id等元数据信息,然后再取topN。
这样看来,前者虽然只有一次rpc,但是一次查询后再coordinate中占用内存很多,分片越大,size增多会有隐患。而后者虽然要走两次rpc,但是第一次获取元数据信息内存占用很少,第二次只需要获取size大小数据即可,感觉还是可以接受的。
而且前者返回的是size的N倍(N是分片数),业务上通常都是去多少用多少的,我设置size=10你给我30我会认为查询语句有错误,不希望要多余的数据。后者至少能保证我取多少就要多少。
所以不明白前者为什么不在返回之前做一次topN。
那么query and fetch在什么场景下会用到呢?
这样看来,前者虽然只有一次rpc,但是一次查询后再coordinate中占用内存很多,分片越大,size增多会有隐患。而后者虽然要走两次rpc,但是第一次获取元数据信息内存占用很少,第二次只需要获取size大小数据即可,感觉还是可以接受的。
而且前者返回的是size的N倍(N是分片数),业务上通常都是去多少用多少的,我设置size=10你给我30我会认为查询语句有错误,不希望要多余的数据。后者至少能保证我取多少就要多少。
所以不明白前者为什么不在返回之前做一次topN。
那么query and fetch在什么场景下会用到呢?
1 个回复
medcl - 今晚打老虎。
赞同来自: code4j
所以 query_and_fetch 从来不是直接给用户来使用的,并且在 5.3 版本之后已经移除了这个选项。
你看最新的文档,query_and_fetch 这个参数在 search_type 里面也是没有的。