ElasticsearchRestTemplate 使用以及优化记录

161 阅读1分钟

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))