Scripting查询

一、Painless

1、Painless是一种专门用于Elasticsearch的简单,用于内联和存储脚本,类似于Java,也有注释、关键字、类型、变量、函数等,安全的脚本语言。它是Elasticsearch的默认脚本语言,可以安全地用于内联和存储脚本。

2、语法

POST /product2/_update/4
{
  "script": {
    "source": "ctx._source.price-=1"
  }
}

  举个例子 比如小米10出新款了 新增一个tag叫 无线充电
  POST product2/_update/3
  {
    "script": {
    "lang": "painless",
    "source": "ctx._source.tags.add('无线充电')"
    }
  }

①支持操作:delete、upsert、noop

POST product2/_update/15
{
  "script": {
    "lang": "painless",
    "source": "ctx.op='delete'"
  }
}
#upsert   smartison  update insert
#如果数据存在,执行partial update操作,如果数据不存在,那么执行create操作
GET /product2/_doc/15
POST product2/_update/15
{
  "script": {
    "source": "ctx._source.price += params.param1",
    "lang": "painless",
    "params": {
      "param1": 100
    }
  },
  "upsert": {
    "name": "小米10",
    "price": 1999
  }
}

②Stored scripts:可以理解为script模板  缓存在集群的cache中

格式:/_scripts/{id} 

POST _scripts/is
{
  "script":{
    "lang": "painless",
    "source": "doc['price'].value*params.discount"
  }
}
GET _scripts/is

GET /product/_search
{
  "script_fields": {
    "test_field": {
      "script": {
        "id": "is",
        "params": {
          "discount": 0.5
        }
      }
    }
  }
}

二、ES写入原理

第一步:写入请求会进入内存,写入Buffer文件中

第二步:Buffer文件每1s就会创建一个index segment,瞬间将数据同步到OS Cache中

第三步:OS Cache会将index segment的状态修改为open,这时客户端就可以进行数据查询

第四步:当OS Cache存储一定数值或一定时间时,会将Buffer中的请求执行commit操作,写入OS Cache

    OS Cache会执行fsync将内存中的数据写入磁盘OS Disk

  为实现容灾:每次写入Buffer时都会同时将数据写入translog文件中,当触发fsync操作时会清空translog文件

原文地址:https://www.cnblogs.com/lyc-code/p/13680620.html