有业务需求,要做一个搜索接口,从千万的数据中根据筛选项查到需要的数据
筛选项有
1.学段。高中,初中等
2.学科。数学,语文等
3.专区。同步专区,高考专区等
4.试卷类型。月考卷,期中考试卷等
5.年级。高一,高二等
6.年份。
7.地区。
8.文档类型。doc,zip,pdf等
9.范围。
10.是否解析。
做的模块是新模块,叫试卷大全,旧模块叫优选卷库和名校试卷。试卷大全中需要包含这两个旧模块的数据。因此,需要做旧模块的标签和新模块的标签映射关系。
映射关系中,包括年级、旧标签、关键字(根据关键字去名称中查询),排除关键字(名称中有排除关键字的就去除掉)。根据这四个去查询老数据。
规则是:旧标签和关键字的查询是一个或的关系,排除关键字在整个查询老数据的逻辑里生效(即包含排除关键字的资源均去除)。
下面是搜索老数据的逻辑
两个tips
1.用should去查询的时候,should里面一定不能包含一个空should条件,否则这个should查询会一直生效
比如BoolQueryBuilder shouldQueryBuilder = QueryBuilders.boolQuery();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
如果shouldQueryBuilder.should(queryBuilder);但是queryBuilder里面没有任何查询条件,那shouldQueryBuilder会一直生效。
2.想should查询1和should查询2是一个must查询的关系(或者说一个must查询中包两个should查询),需要先弄一个BoolQueryBuilder mustQueryBuilder = QueryBuilders.boolQuery();然后mustQueryBuilder.must(“should查询1”);mustQueryBuilder.must(“should查询2”);