ES中模糊查询的实现
业务场景:
一个树形架构,承载了小区的数据,4层结构,如下图所示
XX小区
--- XXX 号楼
--- XXX 单元
---- XXX房间
每个节点都有一个唯一的SpaceId,页面下拉树形结构,选中任何层级(比如选中5号楼),能查询出5号楼下面的所有单元+房间
数据存储在ES中,方案1:
房屋数据冗余一个字段longSpaceId,含义:当前房屋的所有层级spaceId
比如:101房间的spaceId=1234,他的父节点space=222,爷爷节点spaceId=12,顶级节点spaceId=1,那该值=,1,12,222,1234,
很容易理解把,我们根据选中的任意空间ID做个like查询就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | GET face_platform_go_through_record/_search { "size" : 100, "sort" : [ { "recordTime" : { "order" : "desc" } } ], "query" : { "bool" : { "must" : [ { "match" : { "actionType" : "1" } }, { "wildcard" : { "longSpaceId" : { "value" : "*1022*" } } } ] } } } |
java代码实现如下:
1 | qb2.must(QueryBuilders.wildcardQuery( "longSpaceId" , "*" +req.getSpaceId().toString()+ "*" )); |
问题二:该小区有50栋楼,每个楼长负责2栋楼,默认查询它负责的两栋楼的数据
解决方案:新增字段longSpaces:以数组的形式存放每栋楼的所有spaceid,简单说就是把上面的longSpaceId以数组的形式存储到新的字段中
1 2 | @Field (type = FieldType.Keyword) private List<Long> longSpaces; |
一定要注意:该字段定义为keyword类型,否则默认就是text类型了
查询就很简单了,传递一个楼栋spaceId的数据,通过terms过滤一把即可
GET face_platform_go_through_record/_search { "size": 50, "query": { "bool": { "must": [ { "match": { "actionType": "1" } }, { "terms": { "longSpaces": [ "1976", "1022" ] } } ] } }, "sort": [ { "recordTime": { "order": "desc" } } ] }
java代码实现:
qb2.must(QueryBuilders.termsQuery("longSpaces", req.getSpaceIds()));
注意:参数2是个List<Long>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南