对elasticsearch的实际应用

文章讲述了如何设计一个支持多维度筛选的搜索接口,涉及千万级数据的处理。关键点包括设置学段、学科等筛选项,处理旧模块与新模块标签映射,以及在Elasticsearch中利用BoolQuery进行复杂查询逻辑,如should和must的关系处理,避免空should条件的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有业务需求,要做一个搜索接口,从千万的数据中根据筛选项查到需要的数据
筛选项有
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”);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值