Elasticsearch 设置默认值的三种方式

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 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"。

image.png

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


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 实现类关系型数据库默认值的三种方案,只有第一种属于前置设置默认值。


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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
Java Spring
spring data elasticsearch: 设置保活策略|长时间不连接es,报错超时连接
java client长时间没有连接es后,再次调用访问接口,报错连接超时
1319 0
|
4月前
|
Java Linux 数据安全/隐私保护
百度搜索:蓝易云【centos7系统安装elasticsearch8.7.0,并设置密码访问教程。】
现在,您已经成功安装并设置密码访问Elasticsearch 8.7.0。您可以使用设置的密码来访问和管理Elasticsearch实例。
163 1
|
4月前
|
安全 Java 大数据
elasticsearch|大数据|elasticsearch低版本集群的部署安装和安全增强---密码设置问题
elasticsearch|大数据|elasticsearch低版本集群的部署安装和安全增强---密码设置问题
42 0
单机elasticsearch设置远程访问
我这里是在虚拟机安装的es,虚拟机系统用的是优麒麟20.04
|
8月前
|
Java Windows
windows设置elasticsearch开机自启
windows设置elasticsearch开机自启
345 0
|
11月前
|
Java Linux
白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置
白话Elasticsearch69-ES生产集群部署重要的 Elasticsearch参数设置
82 1
|
11月前
|
存储 缓存 编解码
白话Elasticsearch68-ES生产集群部署重要的操作系统设置
白话Elasticsearch68-ES生产集群部署重要的操作系统设置
276 0
|
存储 Java API
elasticsearch 如何设置高亮显示 ?
许多应用都倾向于在每个搜索结果中 高亮 显示搜索的关键词,比如字体的加粗,改变字体的颜色等.以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。 为了执行突出显示,需要该字段的实际内容。如果存储了相关字段(已 在映射中store设置true),则将使用_source该字段,否则将加载实际字段并从中提取相关字段。
|
存储 安全 搜索推荐
Elasticsearch究竟要设置多少分片数?
0、引言 本文翻译自Elasticsearch20170918热乎的官方博客,原作者:Christian Dahlqvist。 在构建Elasticsearch集群的初期如果集群分片设置不合理,可能在项目的中后期就会出现性能问题。
918 0
Elasticsearch究竟要设置多少分片数?
|
Web App开发 安全 数据安全/隐私保护
阿里云Elasticsearch 三大IP设置
容易迷糊的阿里云Elasticsearch 三大IP设置
4503 0