whats new in v2.0.0-betaX
# v2.0.0-beta1
2.0.0-beta1是Easy-Es2023年的第一个版本,很抱歉2.0版本姗姗来迟.
本次带来的是一个里程碑版本,并非小版本,因此旷日持久,其中四大嵌套查询类型的算法零零总总花了近一年碎片时间探索.
2.0.0-beta1提供了10余项新特性,10余项增强,1个Bug修复,以及官网文档进一步完善和提供完整的项目介绍PPT.
# v2.0.0-beta2
- 新增全新的一种混合查询模式,本版本最大特性,王炸级,参考 拓展功能 -> 混合查询 -> 混合查询的几种正确使用姿势 姿势"0"
- 新增通过自定义注解快速指定查询字段大小写忽略功能,参考 快速入门 -> 注解 -> @IndexField注解 ignoreCase 属性
- 优化banner显示,k针对所有长度的版本号,做了更友好的展示效果
- 增加了自动挡创建或更新时的日志,让用户更好地感知自动挡开启时框架究竟对索引干了啥?
- 修复multiMatch中minShouldMatch参数没有自动添加百分号的缺陷
- 修复四大嵌套类型算法在一些特殊复杂场景下不能正确还原lambda表达式的缺陷
- 修复距离字段在指定多个排序器且首个排序器不是按距离排时不能正确返回距离的缺陷
# v2.0.0-beta3
- 新增设置minScore方法,可便捷过滤得分低于指定得分阈值的文档
- 新增设置trackScores方法,可设置查询计算得分
- 新增设置preference的方法,可设置查询偏好
- 将bigDecimal默认类型由keyword调整为SCALED_FLOAT
- queryString 不再对用户参数进行预处理驼峰及下划线互转等,以用户传入原始数据为准 可杜绝对查询字符串中非字段的误转
- groupBy不再指定默认的聚合桶大小,解决部分用户es版本不同时聚合报错问题
- 调整索引默认托管类型为手动挡,避免新人用户对平滑模式使用和理解不到位出现各种十万个为什么,并同步调整文档指引
- 修复ISSUE https://gitee.com/dromara/easy-es/issues/I7JYHH
- 修复ISSUE https://gitee.com/dromara/easy-es/issues/I7JYJR
# v2.0.0-beta4
- 新增@MultiIndexField注解及@InnerIndexField注解,可用于单字段指定多种分词器等场景
- @IndexName注解新增refreshPolicy属性,可以更细粒度的控制索引刷新策略的功能
- @HighLight高亮注解新增numberOfFragments属性, 用户可自定义搜索返回的高亮片段数量
- @IndexField新增ignoreAbove属性,用户可以自定义索引内容长度限制,默认值保持256
- @IndexField新增scalingFactor属性,用户可以自定义浮点数字段的缩放因子
- 修复#I7RE3Z @IndexName索引缺陷
- 修复#I7P65Z BigDecimal创建索引失败问题
- 修复#I7SE3K maxResultWindow设置小于1W时,平滑模式迁移数据失败问题
- 新特性相关使用文档同步更新
# v2.0.0-beta5
- 提供嵌套类型高亮查询功能(重大特性),仍采用原@HighLight注解,用户使用无感
- 提供多数据源功能(重大特性),此功能由社区Liyy贡献,老汉合并并优化
- 提供https连接ES方式,可免SSL验证,此功能由社区开发者"杨忠成"贡献并验证,老汉合并并优化
- @IndexField新增dense_vector和dims指定,并兼容各种索引模式自动创建,以此支撑向量类型数据检索 由社区zhangsan@alona贡献,老汉合并并优化
- 提供小黑子模式,提升编码趣味性,默认关闭,可通过配置开启,仅供娱乐,切勿用于其它用途,后果自负...
- 修复#I7T1A6 bete4引入的实体类不加@IndexName注解时出现NPE问题
- 修复#I8XZGP @MultiField标记的场景下,高亮注解未生效问题 由社区lym贡献,老汉合并并优化
- 修复#I8XZID 调整批量刷新api接口返回类型为成功刷新的分片数,解决部分场景下,有分片刷新失败时刷新状态返回有误的问题
- 避坑文档增加对es中_id使用的规范,可避坑可能出现OOM及性能问题,es小白必读
- 优化GEO相关文档中,经纬度"倒反天罡"问题,调整为纬度在前,经度在后
- 新特性相关使用文档同步更新
# v2.0.0-beta6
- 新增父子类型对一父多子以及一父多子多孙场景的索引自动化支持(重大特性)
- 增加对父子类型所有查询功能支持(重大特性)
- 提供全新自定义注解@Settings,支持便捷预设与灵活自定义功能,可支持ES索引中所有Settings的便捷处理(重大特性)
- 所有CRUD方法支持方法粒度的自定义路由功能
- DSL语句打印中新增对路由的打印
- Javadoc及注释和部分代码细节优化
# v2.0.0-beta7
- 新增对LocalDate,LocalDateTime,Date日期类型字段的无注解支持及默认格式化格式支持
- 新增RequestOptions自定义API,可拓展性进一步提升
- 修复#I7HNQZ 多排序距离不生效问题
- 修复#I9BIPO Springboot3.1.7不兼容问题
- 修复#I9BIPV 自动挡模式下,若未指定父子类型关系注解,无法托管索引问题(beta6引入)
# v2.0.0-beta8
- 新增高亮字段支持设置requireFieldMatch,可指定高亮是否与查询字段匹配(社区pr合并)
- 新增mapper自定义default方法功能(社区pr合并)
- 父子类型@Join注解增加eagerGlobalOrdinals属性,可用于指定是否创建全局序数,以此提升查询性能
- 修复beat6引入的父子类型-平滑模式下,由eagerGlobalOrdinals默认值导致的重启项目误判索引发生变动而自动更新索引的问题
- 修复高亮指定多个字段且分别使用不同高亮标签时的标签覆盖问题
# 何时发布2.0.0正式版?
计划在今年(2023年度)完成2.0正式版发布,因为本次2.0版本改动确实非常大,核心代码几乎改了一遍, 且2.x相较1.x带来了海量的新特性, 可以谓之曰脱胎换骨,为了保证2.0.0正式版稳性和可靠性,为EE赢得口碑,我们将以多个beta版本进行推送,由于本人非全职开源,还要为了五斗米打工, 所以具体发布日期以实际完成时间为准,我会尽最大努力迭代,感谢理解!
- v2.0.0-beta1
- v2.0.0-beta2
- v2.0.0-beta...
- v2.0.0-beta8
- v2.0.0 推送正式版
我们正在奋力前行,不断完善,也随时欢迎每位有志之士加入...
# 2.0.0-beta x 可以用于生产吗?
我的答案是可以,但前提是你会自己修改源码,或者贵公司使用ES的场景不核心,比如就基本的文档检索或者一些非2C的业务,尽管我们版本名叫beta, 但是上线前都是做了严格测试的,有大量自动化测试用例覆盖,确保核心功能稳定可靠,用户在使用过程中针对开发好的功能还可以再次测试,如此基本上可以完成生产 所需要求,万不得已有既知缺陷时,您可以通过混合及原生查询来解决,或是修改源码等途径,并且我们也会在beta的下个版本及时修复上个版本中出现的已知问题.
# 2.0.0-beta1 四大嵌套查询支持
关于这块其实一共有进行过2次算法调整,加上这次一共是第三次,其中前面两次由于走在了错误的路上,所以绞尽脑汁也未能实现最佳的效果, 所以2.X之前的版本在超过2层嵌套的复杂查询是不能通过开箱即用的方式来实现的.经过长达一年的探索,终于解决了4种嵌套查询,并且支持无级嵌套, 无论查询条件多么复杂,层级多么深,都可以轻松拿捏.
MySQL | Mybatis-Plus | ES | Easy-Es |
---|---|---|---|
and 拼接 | 默认 | must | 默认 |
or 拼接 | or() | should | or() |
无 | 无 | filter | filter() |
无 | 无 | must_not | not() |
直观对比
// MySQL语法
where business_type = 1
and (state = 9 or (state = 8 and bidding_sign = 1))
or (business_type = 2 and state in (2,3));
// Easy-Es及Mybatis-Plus语法
wrapper.eq("business_type", 1)
.and(a -> a.eq("state", 9).or(b -> b.eq("state", 8).eq("bidding_sign", 1)))
.or(i -> i.eq("business_type", 2).in("state", 2, 3));
// ES原生的RestHighLevel语法
List<Integer> values = Arrays.asList(2, 3);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termQuery("business_type", 1));
boolQueryBuilder.must(QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("state", 9))
.should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("state", 8))
.must(QueryBuilders.termQuery("bidding_sign", 1))));
boolQueryBuilder.should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("business_type", 2))
.must(QueryBuilders.termsQuery("state", values)));
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上面的例子树的最大深度仅为2,如果深度超过2以后ES原生语法就很难看得懂了,更别说正确编码,就算您是ES老手也容易栽坑里,但现在你可以通过EE 1:1轻松又简单还原复杂SQL.
# 2.0.0-beta1 对嵌套类型的全部查询支持
在1.X的版本中,嵌套类型的开箱即用查询API仅支持了match一种查询,在2.x版本中则可以支持es全部的嵌套类型查询,以Consumer传入即可,社区开发者@lym贡献
- API
nested(String path, Consumer<Param> consumer);
- 使用demo
@Test
public void testNestedMatch() {
// 嵌套查询 查询年龄等于18或8,且密码等于123的数据
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.nested(FieldUtils.val(Document::getUsers), w ->
w.in(FieldUtils.val(User::getAge), 18, 8)
.eq(FieldUtils.val(User::getPassword), "123"));
List<Document> documents = documentMapper.selectList(wrapper);
System.out.println(documents);
}
2
3
4
5
6
7
8
9
10
# 2.0.0-beta1 根据上下文自动拼接.keyword后缀
索引创建时默认的字段类型由keyword调整为text_keyword双类型,并且在查询时会根据查询类型和注解配置的类型自动智能拼接.keyword后缀, 且可以通过配置开启/关闭自动拼接,可增强字段的查询功能支持范围,减少用户工作量,并显著减少小白踩ES坑的可能.
# 2.0.0-beta1 所有条件构造器支持链式
所有条件构造器都支持链式调用(含索引),和MP一样的链式编程
@Test
public void testOne() {
// 链式调用
Document document = EsWrappers.lambdaChainQuery(documentMapper).eq(Document::getTitle, "测试文档3").one();
}
2
3
4
5
# 2.0.0-beta1 距离获取更简单了
@Distance获取距离注解,新增支持多字段,多排序器功能,并且不再需要用户手动指定排序迭代器位置,由框架全自动处理,使用更简单.
# 2.0.0-beta1 其它新特性
- 新增字段类型 wildcard类型 手自动挡均适用
- 提供索引手动刷新接口,触发由用户自由控制,之前索引刷新策略配置仍保留 自动+手动配齐
- 提供支持直接执行静态DSL语句的功能
- 提供直接执行SQL API
- 提供通过自定义注解设置路由功能
# 2.0.0-beta1 其它优化
- 移除原有not打头API,以及表示取反的API(历史原因,设计不合理,决定彻底废弃),比如notIn,notBetween,NE等,如今所有表示取反的都可以直接通过四大嵌套类型中提供的not解决
- 将geo地理位置查询并入Bool查询条件,也可以享受must/should/filter/mustNot, 原功能不受影响,可以理解为功能更强更灵活
- 废弃了配置项enableMust2Filter,可以直接用filter嵌套 更简单,更规范,粒度更细
- 重构了WrapperProcess核心逻辑以及AbstractWrapper核心逻辑 代码结构更清晰,核心逻辑比原来更简单易读,基本上傻瓜级了,易维护性维护更上一层楼
- 标记过时FieldType中的array类型和object类型,并通过注释说明应当使用的正确类型 防止es小白踩坑
- 调整重建索引超时时间默认值为72H,以及socketTimeOut等多个参数的默认数值,进一步防止小白踩坑索引迁移超时失败
- 增加默认最大连接超时时间,心跳时间,并且给予了一个合适的值,尽量帮助不懂ES的小白白少踩坑
- @Distance获取距离注解,新增支持多字段,多排序器功能,并且不再需要用户手动指定排序迭代器位置,由框架全自动处理,使用更简单.
- 进一步丰富了官网文档,使用更加傻瓜级,并且源码中每个重载方法都加了注释,使用起来编辑器提示更加友好.
# 2.0.0-beta1 缺陷修复
修复部分场景下@Distance距离注解保留距离小数位不准确缺陷