1、实战问题

在使用 Elasticsearch 过程中,不免还会有 Mysql 等关系型数据库的使用痕迹,以下两个都是实战开发问到的问题:

  • Elasticsearch 新增字段,能在 Mapping 设置默认值吗?

  • Elasticsearch 有什么好的方式维护文档的 create_time (创建时间)和 update_time (更新时间)吗?

本文就从 Elasticsearch 默认值的实现方案说开去。

2、Elasticsearch  Mapping 层面默认值

认知前提:严格讲 Elasticsearch 是不支持 Mapping 层面设置数据类型的时候,设置字段的默认值的。

有人会说,null value 设置算不算?不算。

大家看一下:

PUT my-index-000001
{"mappings": {"properties": {"status_code": {"type":       "keyword","null_value": "NULL" }}}
}

null_value  的本质是将“NULL” 替换 null 值,以使得空值可被索引或者检索。

我们期望设置 Mapping 的时候,可以对各种数据类型添加一个任意指定的缺省值。但是 Elasticsearch Mapping 层面不支持,咋办?

只能去寻找其他的方案。

3、曲线救国实现 Elasticsearch 设置默认值

直接给出答案,共三种设置默认值的。

3.1 方案 一:pipeline 设置默认值

# 创建 append 管道
PUT _ingest/pipeline/add_default_pipeline
{"processors": [{"set": {"field": "sale_count","value": 1}}]
}# 创建索引
PUT customer
{"mappings":{"properties":{"sale_count":{"type":"integer"},"major":{"type":"keyword","null_value": "NULL" }}},"settings": {"index":{"default_pipeline":"add_default_pipeline"}}
}

插入数据,验证一把:

POST customer/_doc/1
{"major":null
}

返回结果:

  "max_score" : 1.0,"hits" : [{"_index" : "customer","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"major" : null,"sale_count" : 1}}]}

以上的方式,实现了sale_count 的默认值为1 的设置。

是借助索引设计层面在 setting 中关联 default_pipeline 实现的。

实现方式相对简单,能保证用户在设置索引的前提下,用户只关注写入数据,其他后台预处理管道帮助实现细节。

引申一下,针对开篇提到的第二个问题:

  • create_time 借助 pipeline 管道预处理 set processor 实现即可。

PUT _ingest/pipeline/create_time_pipeline
{"description": "Adds create_time timestamp to documents","processors": [{"set": {"field": "_source.create_time","value": "{{_ingest.timestamp}}"}}]
}DELETE my_index_0003
PUT my_index_0003
{"settings": {"index.default_pipeline": "create_time_pipeline"}
}POST my_index_0003/_doc/1
{}GET my_index_0003/_search
  • update_time 自己维护更新,业务更新的时刻通过代码或者脚本加上时间戳就可以。

3.2 方案 二:update_by_query 通过更新添加默认值

POST customer/_doc/2
{"major":null
}# 批量更新脚本
POST customer/_update_by_query
{"script": {"lang": "painless","source": "if (ctx._source.major == null) {ctx._source.major = 'student'}"}
}POST customer/_search

结果是:

所有 major 为 null 的,都实现了更新,设置成了:“student"。

该方式属于先写入数据,然后实现数据层面的更新,算作设置默认值甚至都有点勉强。

3.3 方案 三:借助 pipeline script 更新


PUT _ingest/pipeline/update_pipeline
{"processors": [{"script": {"lang": "painless","source": """if (ctx['major'] == null) {ctx['major'] = 'student'}"""}}]
}
POST customer/_doc/4
{"major":null
}POST customer/_update_by_query?pipeline=update_pipeline
{"query": {"match_all": {}}
}

结果是:同方案二,也实现了更新。

该方案是第二种方案的内卷版本,本质实现基本一致。

强调细节不同点,ctx 取值的时候,细节语法不一样:

  • 脚本script 操作,访问方式:ctx._source.major。

  • pipeline 预处理脚本操作:访问方式:ctx['major'] 。

4、小结

本文讲解了 Elasticsearch 实现类关系型数据库默认值的三种方案,只有第一种属于前置设置默认值。

后两种都是先写入后设置默认值的脚本更新实现方案。实战方案选型,推荐方案一。

往期推荐

反996,竟反掉了17%的薪水?!而隔壁的房贷还在涨,怎么就越反越糟糕了呢?

瓜分60万现金大奖,第二届云原生编程挑战赛等你来报名!

以云原生的名义,举办一次技术聚会

Spring中涉及的设计模式总结

假如 IDEA 也加入防沉迷功能...

喜欢本文欢迎转发,关注我订阅更多精彩

关注我回复「加群」,加入Spring技术交流群

Elasticsearch 设置默认值的三种方式相关推荐

  1. keras embeding设置初始值的两种方式

    随机初始化Embedding from keras.models import Sequential from keras.layers import Embedding import numpy a ...

  2. Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  3. Linux中设置服务自启动的三种方式(转)

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  4. LaTeX中设置字体颜色的三种方式

    以下的三种方式都需要导入color包,即\usepackage{color}. 实验环境:window10,TexLive2019. 1.使用系统自定义的颜色 使用语法: \textcolor{red ...

  5. linux 运行apj,Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  6. JS方法参数设置为默认值的几种方式

    绪论 写JS方法会碰到参数不固定的时候,把每个参数都赋值又感觉麻烦,就想有没有办法设置个默认值呢?果然有解决方法.在此记录一下. 正文 <!DOCTYPE html> <div la ...

  7. struts2从form取值的三种方式

    1,使用默认的action的传递方式. 2,自定义一个vo,在action中使用这个vo 3,使用ModelDriven的方式. 下面分别叙述. 1,使用默认的action的传递方式. action文 ...

  8. QT设置背景图片的三种方式

    QPalette的方法 基本步骤: (1). 首先设置QWidget的autoFillBackground属性为真 (2). 然后定义一个QPalette对象,设置QPalette对象的背景属性(颜色 ...

  9. linux 设置开机启动项三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务. 在解问题之前先来看看Linux的启动流程 Linux的启动流程 主要顺序就是: 1. 加载内核 2. 启动初始化进程 3. 确定运 ...

最新文章

  1. CSS3初体验之奇技淫巧
  2. git--分支管理策略
  3. Python 'takes exactly 1 argument (2 given)' Python error
  4. 【Alertmanager】腾讯企业邮箱配置
  5. Swift5.x的UITableView纯代码演练
  6. 如何在使用摩托罗拉上的RSS阅读器应用进行一次订阅
  7. 数据库人员面试:SQL Server常用测试题
  8. springboot aop使用_SpringBoot 使用AOP实现读写分离
  9. 兼容CSS性技巧大全
  10. gaster字体转换器_Galas字体转换器 Galas在线生成器-万字网
  11. dos2unix 目录
  12. MT7628学习笔记(13)——ipk软件包编写与应用
  13. 各类光纤接口类型的区别与图示
  14. 网络前沿技术期末考题盘点
  15. FIR滤波器设计(1)——利用matlab的fdatool工具箱设计FIR滤波器参数
  16. iOS -- masonry的使用
  17. ubuntu上wps字体缺失错误解决
  18. 拟募资超10亿元,索辰科技能否成为科创板CAE软件第一股?
  19. 2013年Google PR不会再更新了
  20. 触摸屏左右屏幕外向内滑动_外向内发展的案例

热门文章

  1. ASP.NET MVC – Nerdinner - notes
  2. mysql锁3.常见问题
  3. curl 忽略证书访问 https
  4. golang编译错误 copying /tmp/go-build069786374/b001/exe/a.out: No such file or directory 解决方法
  5. docker centos7容器 安装ssh服务
  6. 深度包检测 DPI 介绍
  7. golang slice 切片 追加、删除、插入
  8. libpcap实现机制及接口函数
  9. 使用EditPlus打造一个Python IDE
  10. 解决警告inconsistent dll linkage