ES每日tip往期回顾(第二期)

2022-01-18 10:21:35 浏览数 (1)

  • 在假设正常情况下并发更新概率很小的前提下,为了性能考虑,es通过乐观锁解决文档并发更新问题,创建文档时如果不设置version,默认初始version=1,之后每次update时version自增;如果要重置version,只能通过index操作并设置force=true,来强制重置文档version
  • es原生不支持在update时设置version(理论上是可以实现的,我甚至给开发组提了个issue:https://github.com/elastic/elasticsearch/issues/25996),craft一定程度上模拟了带version更新操作
  • es1版本默认date类型处理会在format parse失败后尝试用long.valueOf来转换,假设字段配置为date类型,format为YYYY-MM-dd HH:mm:ss,那么传入一个"12345"的string类型,es1版本是不会报错的,会把"12345"转成long再转成UTC时间;es5版本已经修复这个问题
  • es的source是单独作为一个字段存储的,而且是保持传入的样式原样保存,假设字段A类型为long,如果传入的doc={A: "12345"},即使A为string类型也是可以正确录入的,但是返回的source中字段A还是保持string形式"12345",不会转换成配置的long类型
  • es的source是一个json字符串,无法保存类型信息,会在请求返回时反序列化为Map<String, Object>,其中字段类型是自动推测的,假设字段B为long,但是其值为1,反序列化时(es内置jackson做json转换),值 <= max_int就把A反序列化为int类型,值 > max_int才会返回long类型
  • es版本执行写请求时,如果源文档设置的version与已存在的文档冲突(默认策略provided version > stored version算成功),会报version conflict异常,即使是在index或者create操作时显式设置version,也有可能会抛出版本冲突异常

0 人点赞