withQuery 和 withFilter 区别
首先是知道 filter 是会走缓存的,然后发现 NativeSearchQueryBuilder 里有一个 withQuery 和 withFilter 两个方法,就开始考虑这两个方法有什么区别
原来的代码如下
BoolQueryBuilder boolQueryBuilder = buildAllImageCountQueryBuilder(request);
PageRequest pageRequest = PageRequest.of(0, 1);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withPageable(pageRequest)
.withQuery(boolQueryBuilder)
.withAggregations(AggregationBuilders
.terms("categoryResultFolderId")
.field("categoryResultFolderId")
.size(100000))
withQuery 改为 withFilter 后发现,聚合返回的数量变多了,从 90 个 bucket 变成了 3W 多,在网上也没查到正确的说法,然后点进源码里看发现如下:
去看自己记录的笔记发现,query 那一层是没有 filter 的,只有一个 post_filter ,在 kibana 上改为 post_filter 后发现,结果也是 3W 多个 bucket,最终确定 withFilter 其实是 ES 语法的 post_filter
post_filter : 只过滤搜索结果,不过滤聚合结果
优化
filter 和 must
起因是想看下 filter 和 must 速度差多少,找了一个查询语句,进行测试,发现能快个几十毫秒
size = 0
查询 count 或者 聚合操作的时候,使用 size = 0,能走缓存,NativeSearchQueryBuilder 就是修改 withMaxResults ,取消分页,写法如下:
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder
.withMaxResults(0)
.withQuery(boolQueryBuilder)
.withAggregations(AggregationBuilders
.terms("categoryResultFolderId")
.field("categoryResultFolderId")
.size(100000))