原创

ES Scripting&document写入原理

1、ES Scripts:
    (1)Groovy:1.4.X-5.0
    (2)其他支持脚本:
        ①expression:每个文档的开销较低:表达式的作用更多,可以非常快速地执行,甚至比编写native脚本还要快,支持javascript语法的子集:单个表达式。缺点:只能访问数字,布尔值,日期和geo_point字段,存储的字段不可用
        ②mustache:提供模板参数化查询
        ③java:
    (3)Painless:Painless是一种专门用于Elasticsearch的简单,用于内联和存储脚本,类似于Java,也有注释、关键字、类型、变量、函数等,安全的脚本语言。它是Elasticsearch的默认脚本语言,可以安全地用于内联和存储脚本。
        ①语法:

POST index/_update/id
{
  "script": "ctx._source.price -=1"
}

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

GET index/_search
{
  "script_fields": {
    "test_field": {
      "script": {
        "lang":   "painless",
        "source": "doc['price'].value
      }
    }
  }
}

        ②支持操作:delete、upsert、noop
        ③参数化查询:

"source": "doc['price'].value * params.discount",
        "params": {
          "discount": 0.8
        }

        ④Stored scripts:可以理解为script模板 缓存在集群的cache中
            1) /_scripts/{id}
            2)作用域为整个集群。默认缓存大小是100MB 没有过期时间 可以手工设置过期时间script.cache.expire 通过script.cache.max_size设置缓存大小 脚本最大64MB 通过   script.max_size_in_bytes配置 只有发生变更时重新编译。
            3)例如:打折模板

POST _scripts/calculate-discount
{
  "script": {
    "lang": "painless",
    "source": "doc['price'].value * params.discount"
  }
}
GET _scripts/calculate-discount
DELETE _scripts/calculate-discount
使用:
GET product2/_search
{
  "script_fields": {
    "discount_price": {
      "script": {
        "id":"calculate-discount",
        "params": {
          "discount": 0.8
        }
      }
    }
  }
}

        ⑤Dates:ZonedDateTime类型,因此它们支持诸如之类的方法getYear,getDayOfWeek 或例如从历元开始到毫秒getMillis。要在脚本中使用它们,请省略get前缀并继续使用小写的方法名其余部分。例如,以下代码返回每个冰球运动员的出生年份getYear()

GET index/_search
{
  "script_fields": {
    "test_year": {
      "script": {
        "source": "doc.createtime.value.year"
      }
    }
  }
}

⑥doc['field'].value和params['_source']['field']:理解之间的区别是很重要的,doc['field'].value和params['_source']['field']。首先,使用doc关键字,将导致该字段的条件被加载到内存(缓存),这将导致更快的执行,但更多的内存消耗。此外,doc[...]符号只允许简单类型(不能返回一个复杂类型(JSON对象或者nested类型)),只有在非分析或单个词条的基础上有意义。但是,doc如果可能,使用仍然是从文档访问值的推荐方式,因为_source每次使用时都必须加载并解析。使用_source非常缓慢
2、ES写入原理:


本文链接地址:http://www.ysxbohui.com/article/259

正文到此结束