ElasticSearch Script操作数据

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: ElasticSearch Script操作数据

ElasticSearch Script基础介绍

语法

"script": {
   
   
    "lang":   "...",  
    "source" | "id": "...", 
    "params": {
   
    ... } 
  }

参数说明:

字段 说明
lang 脚本使用的语言,默认是painless
source 脚本的核心部分,id应用于:stored script
params 传递给脚本使用的变量参数

Script有许多场景使用,比如update、update-by-query、reindex等,结合scripts语法说,lang会有painless、expression、mustache等选择;source中有ctx、doc['field_name']、_source等方式取值。

img

基础用法

List类型数据新增、删除

添加数据到List

PUT test/_doc/1
    {
   
   
        "counter" : 1,
        "tags" : ["red"]
    }

使用Script添加数据到List

 POST test/_update/1
    {
   
   
        "script" : {
   
   
            "source": "ctx._source.tags.add(params.tag)",
            "lang": "painless",
            "params" : {
   
   
                "tag" : "blue"
            }
        }
    }

使用Script删除List数据

    POST test/_update/1
    {
   
   
      "script": {
   
   
        "source": "if (ctx._source.tags.contains(params.tag)) { ctx._source.tags.remove(ctx._source.tags.indexOf(params.tag)) }",
        "lang": "painless",
        "params": {
   
   
          "tag": "blue"
        }
      }
    }

nested数据新增、删除

新增nested类型数据

POST group/_update/50Bh5H8BmwYplCYFGcvg
{
   
   
    "script" : {
   
   
        "source": "ctx._source.user.add(params.user)",
        "lang": "painless",
        "params": {
   
   
          "user":     {
   
   
                  "userId":"3005",
                  "userName":"小卡",
                  "content":"不返回具体数据。"
            }
      }
    }
}

删除nested类型数据

POST group/_update_by_query
{
   
   
    "script" : {
   
   
        "source": "ctx._source.user.removeIf(item -> item.userId == params.userId)",
    "lang": "painless",
    "params": {
   
   
      "userId": "3003"
    }
    },
 "query": {
   
   
    "term": {
   
   
      "user.content.keyword": {
   
   
        "value": "不返回具体数据。"
      }
    }
  }
}

根据指定条件修改数据

SQL含义:

update operator_ip_segment_index set owned_network = '广电网' where owned_network.keyword = '新疆伊犁哈萨克自治州';

DSL语法:

curl -XPOST http://8.9.60.9:9200/operator_ip_segment_index/_update_by_query -H 'Content-Type: application/json' -d'
{
   
   
    "script":{
   
   
        "source":"ctx._source.owned_network = params.owned_network",
        "params":{
   
   
            "owned_network":"广电网"
        },
        "lang":"painless"
    },
    "query":{
   
   
        "term":{
   
   
            "owned_network.keyword":"新疆伊犁哈萨克自治州"
        }
    }
}
'

根据指定条件修改多个字段数据-查询条件也使用脚本

POST operator_ip_segment_index/_update_by_query
{
   
   
    "script":{
   
   
        "source":"""
        ctx._source['ip_type_code']=null;
        ctx._source['start_ipv4_num']=null;
        """
    },
    "query": {
   
   
    "bool": {
   
   
      "should": {
   
   
        "script": {
   
   
          "script": {
   
   
            "source": """
            long times = System.currentTimeMillis()/1000 - 60 * 60 * 24;
            doc['update_time_seconds'].value <= times
            """
            , "lang": "painless"
          }
        }
      }
    }
  }
}

根据指定条件删除nested中子数据

数据

{
   
   
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
   
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
   
   
    "total" : {
   
   
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8025915,
    "hits" : [
      {
   
   
        "_index" : "group",
        "_type" : "_doc",
        "_id" : "ri8VboYBHSuebtDIpIft",
        "_score" : 0.8025915,
        "_source" : {
   
   
          "groupName" : "聊天2群",
          "groupId" : "1002",
          "user" : [
            {
   
   
              "userName" : "小王2",
              "userId" : "3002",
              "content" : "2作为一级筛选条件单独使用表示,表示只返回聚合结果,不返回具体数据。"
            },
            {
   
   
              "userName" : "小张2",
              "userId" : "3003",
              "content" : "2作为一级筛选条件单独使用表示,表示只返回聚合结果,不返回具体数据。"
            },
            {
   
   
              "userName" : "小卡",
              "userId" : "说啥呢",
              "content" : "不返回具体数据。"
            }
          ]
        }
      }
    ]
  }
}

根据条件删除数据

查询user.content.keyword = 不返回具体数据。的数据,并删除,nesteduserId=3003的子数据


POST group/_update_by_query
{
   
   
    "script" : {
   
   
        "source": "ctx._source.user.removeIf(item -> item.userId == params.userId)",
    "lang": "painless",
    "params": {
   
   
      "userId": "3003"
    }
    },
 "query": {
   
   
    "term": {
   
   
      "user.content.keyword": {
   
   
        "value": "不返回具体数据。"
      }
    }
  }
}

删除之后结果

{
   
   
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
   
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
   
   
    "total" : {
   
   
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.8025915,
    "hits" : [
      {
   
   
        "_index" : "group",
        "_type" : "_doc",
        "_id" : "ri8VboYBHSuebtDIpIft",
        "_score" : 0.8025915,
        "_source" : {
   
   
          "groupName" : "聊天2群",
          "groupId" : "1002",
          "user" : [
            {
   
   
              "userName" : "小王2",
              "userId" : "3002",
              "content" : "2作为一级筛选条件单独使用表示,表示只返回聚合结果,不返回具体数据。"
            },
            {
   
   
              "userName" : "小卡",
              "userId" : "说啥呢",
              "content" : "不返回具体数据。"
            }
          ]
        }
      }
    ]
  }
}

创建脚本,通过脚本调用

根据条件查询出数据,删除nested子对象数据

创建删除脚本,id为delete-nested-test

POST _scripts/delete-nested-test
{
   
   
    "script":{
   
   
        "lang":"painless",
        "source":"ctx._source.user.removeIf(item -> item.userId == params.userId)"
    }
}

使用delete-nested-test脚本,删除nested,user.userId等于888的子对象数据

POST group/_update_by_query
{
   
   
  "script": {
   
   
    "id":"delete-nested-test",
    "params":{
   
   
      "userId":"888"
    }
  },
  "query": {
   
   
    "term": {
   
   
      "user.content.keyword": {
   
   
        "value": "不返回具体数据。"
      }
    }
  }
}

根据条件修改数据-异步执行,并根据任务id查询进度

curl -u elastic:Asdfghjk8888888@ -H 'Content-Type:application/json'  -XPOST  "http://10.86.50.206:9200/ads_user_profile/_update_by_query?wait_for_completion=false&conflicts=proceed" -d '
{
    "script":{
        "source":"ctx._source[\u0027is_delete\u0027]=null;"
    },
    "query": {
    "term": {
      "is_delete": {
        "value": "3"
      }
    }
  }
}
'

参数说明:

  1. conflicts=proceed

在 Elasticsearch 中,conflicts=proceed 是一种写操作的参数配置,用于处理文档版本冲突的情况。当多个客户端同时对同一文档进行写操作时,可能会发生版本冲突的情况。此时,Elasticsearch 会返回一个版本冲突的错误,提示客户端需要在冲突的情况下重新尝试更新该文档。而如果设置 conflicts=proceed 参数,Elasticsearch 会在发生冲突时自动扩展新版本号,而不是返回错误。

使用 conflicts=proceed 参数可以帮助客户端减少处理冲突的时间和工作量。但是,需要注意的是,当设置该参数时,如果出现冲突的文档在后续更新时需要依赖先前的版本,在冲突处理时可能会导致数据不一致。如果对数据一致性有较高的要求,则建议使用默认的冲突处理方式,即返回版本冲突错误,由客户端处理后再次提交操作。

  1. wait_for_completion=false

在 Elasticsearch 中,wait_for_completion=false 是一种参数设置,用于异步执行一些操作时防止线程被阻塞,从而提高性能。具体来说,该参数主要用于异步执行一些 long-running 的任务,例如 restore 操作、reindex 操作等,如果不使用该参数,则这些操作会在执行期间一直阻塞客户端的线程,从而会影响其他操作的响应时间。而通过设置 wait_for_completion=false,Elasticsearch 会在后台异步执行这些操作,从而避免了这种线程阻塞的情况,提高了性能。

需要注意的是,当设置 wait_for_completion=false 时,Elasticsearch 会在任务开始执行后立即返回一个任务 ID,然后客户端可以根据该 ID 在后续的操作中查询任务的状态和结果。因此,如果需要获取任务执行过程中的详细信息和结果数据,则需要使用异步方式。

总的来说,wait_for_completion=false 参数在一些需要异步执行的任务中非常有用,可以避免线程阻塞和性能影响问题,但需要注意合理使用,以免影响数据一致性或增加操作的复杂度。

返回

{"task":"ggZOAkegTH29aUCAj_eKVg:1963952216"}

查看任务状态

取消任务

POST /_tasks/{task_id}/_cancel

curl -u elastic:Asdfghjk8888888@ -H 'Content-Type:application/json'  -XGET "http://10.86.50.206:9200/_tasks/ggZOAkegTH29aUCAj_eKVg:1963952216"
{
   
   
    "completed":false,
    "task":{
   
   
        "node":"ggZOAkegTH29aUCAj_eKVg",
        "id":1963952216,
        "type":"transport",
        "action":"indices:data/write/update/byquery",
        "status":{
   
   
            "total":49037601,
            "updated":164730,
            "created":0,
            "deleted":0,
            "batches":166,
            "version_conflicts":270,
            "noops":0,
            "retries":{
   
   
                "bulk":0,
                "search":0
            },
            "throttled_millis":0,
            "requests_per_second":-1,
            "throttled_until_millis":0
        },
        "description":"update-by-query [ads_user_profile_audi] updated with Script{type=inline, lang='painless', idOrCode='ctx._source['is_delete']=null;', options={}, params={}}",
        "start_time_in_millis":1683732140856,
        "running_time_in_nanos":32754573141,
        "cancellable":true,
        "cancelled":false,
        "headers":{
   
   

        }
    }
}
{
   
   
    "completed":false,
    "task":{
   
   
        "node":"ggZOAkegTH29aUCAj_eKVg",
        "id":1963952216,
        "type":"transport",
        "action":"indices:data/write/update/byquery",
        "status":{
   
   
            "total":49037601,
            "updated":433481,
            "created":0,
            "deleted":0,
            "batches":436,
            "version_conflicts":1519,
            "noops":0,
            "retries":{
   
   
                "bulk":0,
                "search":0
            },
            "throttled_millis":0,
            "requests_per_second":-1,
            "throttled_until_millis":0
        },
        "description":"update-by-query [ads_user_profile_audi] updated with Script{type=inline, lang='painless', idOrCode='ctx._source['is_delete']=null;', options={}, params={}}",
        "start_time_in_millis":1683732140856,
        "running_time_in_nanos":133641317970,
        "cancellable":true,
        "cancelled":false,
        "headers":{
   
   

        }
    }
}

根据条件查询,直接删除某个字段

POST index/_update_by_query
{
   
   
    "script":{
   
   
        "source":"ctx._source.remove('owner_pinyin')"
    },
    "query": {
   
   
    "term": {
   
   
      "zip_code": {
   
   
        "value": "133700"
      }
    }
  }
}
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
1月前
|
关系型数据库 MySQL
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
elasticsearch对比mysql以及使用工具同步mysql数据全量增量
21 0
|
1月前
|
消息中间件 存储 关系型数据库
【微服务】mysql + elasticsearch数据双写设计与实现
【微服务】mysql + elasticsearch数据双写设计与实现
68 2
|
1月前
|
监控 安全 Linux
【Elasticsearch专栏 14】深入探索:Elasticsearch使用Logstash的日期过滤器删除旧数据
使用Logstash的日期过滤器可以有效删除Elasticsearch中的旧数据,释放存储空间并提高集群性能。通过配置Logstash,可以指定索引模式、筛选时间戳早于特定阈值的文档,并在输出阶段删除这些旧数据。执行配置时,需确保Logstash与Elasticsearch连接正常,并监控日志以确保操作安全。定期执行此操作可确保旧数据不会过多积累。总之,Logstash的日期过滤器提供了一种简单而高效的方法,帮助管理和优化Elasticsearch中的数据。
|
1月前
|
存储 搜索推荐 Java
|
3月前
|
存储 缓存 数据库
PB数据毫秒级搜索之Elasticsearch(二)基础了解
PB数据毫秒级搜索之Elasticsearch(二)基础了解
91 0
|
4月前
|
JSON 自然语言处理 Java
Java原生操作Elasticsearch
Java原生操作Elasticsearch
36 0
|
1月前
|
监控 Java 测试技术
【Elasticsearch专栏 13】深入探索:Elasticsearch使用Curator工具删除Elasticsearch中的历史数据
使用Curator工具可以有效管理Elasticsearch中的旧数据,通过编写YAML配置文件定义删除操作。配置中指定了基于索引名称前缀和年龄的过滤器,确保仅删除符合条件的旧索引。执行删除操作时,Curator会应用过滤器识别目标索引,并向Elasticsearch发送删除请求。通过设置选项,如忽略空列表和超时时间,可以确保操作的灵活性和稳定性。使用Curator不仅释放了存储空间,还提高了查询性能,是维护Elasticsearch健康的重要工具
|
1月前
|
JSON 监控 数据管理
【Elasticsearch专栏 12】深入探索:Elasticsearch使用索引生命周期管理(ILM)自动化删除旧数据
Elasticsearch的ILM功能允许用户定义策略,自动管理索引从创建到删除的生命周期。用户可以设置策略,根据索引年龄或大小自动删除旧数据,节省存储空间。通过应用ILM策略于索引模板,新索引将遵循预定义的生命周期。用户还可以监控ILM状态,确保策略按预期执行。使用ILM,用户可以高效地管理数据,确保旧数据及时删除,同时保持数据完整性和安全性。
|
4月前
|
安全 大数据 API
elasticsearch|大数据|elasticsearch的api部分实战操作以及用户和密码的管理
elasticsearch|大数据|elasticsearch的api部分实战操作以及用户和密码的管理
64 0
|
2月前
|
存储 缓存 自然语言处理
【Elasticsearch专栏 05】深入探索:Elasticsearch在处理非结构化数据时,倒排索引有何优势
在处理非结构化数据时,倒排索引的优势在于其高效的查询性能,能够迅速匹配文本中的关键词,实现全文搜索。此外,倒排索引支持复杂的查询操作,可扩展性强,且通过压缩技术优化存储空间。这些特点使倒排索引成为处理非结构化数据的理想选择。

相关产品

  • 检索分析服务 Elasticsearch版