elasticsearch与springboot整合 查询
在业务开发中,我们只要定义好我们的数据结构,然后入库。即可完成。
这里使用了ik分词器,类型定义为ik_max_word的都是会自动分词的。
重点是在查询,我们查询数据库的sql语句可以写的很复杂,在es这里,也可以写的很复杂,但是有没有那个必要就是另一回事了。
多条件查询:复杂查询
条件 boolQueryBuilder.must 类似于 sql中的and
如果是不等就是用boolQueryBuilder.mustNot 排除条件。
多个条件包含,查询索引外层属性,索引对象属性参数,年龄区间,数组内属性 只要符合条件的,会返回整条索引的数据。
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
定义好查询对象queryBuilder ,再加上查询条件、分页条件、排序
/** * @desc 复合查询 * @date 2020年5月9日 下午3:05:17 */ @Test public void boolQueryBuilderTest() { NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); { // 条件1 查询当前对象外层title-- TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "陈说美食 - 知乎"); boolQueryBuilder.must(termQueryBuilder); } { // 条件2 查询当前对象外层用户对象中的姓名 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("user.name", "李有才"); boolQueryBuilder.must(termQueryBuilder); } { // 条件3 相片数组对象属性名称 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("photos.title", "相片01"); NestedQueryBuilder nestedQueryBuilder = QueryBuilders.nestedQuery("photos", termQueryBuilder, ScoreMode.None); boolQueryBuilder.must(nestedQueryBuilder); } // 条件4 { // 条件4 年龄在30到40之间---区间查询 RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("user.age").from(30).to(40); boolQueryBuilder.must(rangeQueryBuilder); // boolQueryBuilder.mustNot() // 排除 } queryBuilder.withQuery(boolQueryBuilder); Page<HouseVo> page = repository.search(queryBuilder.build()); System.out.println(JSON.toJSON(page)); }
上面这段代码产生的kql就是如下语句:
POST house_vo/_search { "query": { "bool": { "must": [ { "term": { "title": { "value": "陈说美食 - 知乎", "boost": 1 } } }, { "term": { "user.name": { "value": "李有才", "boost": 1 } } }, { "nested": { "query": { "term": { "photos.title": { "value": "相片01", "boost": 1 } } }, "path": "photos", "ignore_unmapped": false, "score_mode": "none", "boost": 1 } }, { "range": { "user.age": { "from": 30, "to": 40, "include_lower": true, "include_upper": true, "boost": 1 } } } ], "adjust_pure_negative": true, "boost": 1 } } }
分页:
// 加载分页信息
Pageable pageable = PageRequest.of(pageNo, pageSize);
queryBuilder.withPageable(pageable);
这里产生语句
排序:
// 价格倒序、年龄升序 SortBuilder<?> sortBuilder1 = SortBuilders.fieldSort("price").order( SortOrder.DESC); queryBuilder.withSort(sortBuilder1); SortBuilder<?> sortBuilder2 = SortBuilders.fieldSort("user.birthday").order( SortOrder.ASC); queryBuilder.withSort(sortBuilder2);
[{ "price" : { "order" : "desc" } }, { "user.birthday" : { "order" : "asc" } }]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器