yml脚本
A. 如何使用Elasticsearch groovy script脚本更新数据
今天细说一下elasticsearch的update更新功能,以及如何利用script脚本更新数据。
想要使用script脚本功能,需要在配置文件elasticsearch.yml里设置
python
script.disable_dynamic: false
关于elasticsearch script的文章,总是会没完没了的修改
ES支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过
index找到相应的存放记录的节点,然后执行脚本,执行完之后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程中,通过
versioning来控制没有其它的更新操作(这个功能是0.19后可用的)。具体实现的原理应该和elasticsearch
Versioning相关。
B. 创造 | 一个强大的 Android 自动化打包脚本
该脚本是我在独立开发过程中,为了提升 Android 应用打包和运营的效率而开发的脚本。项目地址是,
https://github.com/Shouheng88/autopackage
如项目中的语言构成展示的,该脚本完全使用 Python 语言开发完成。
使用起来非常简单,首先你要准备如下的环境,
然后,通过编辑配置文件 config.yml 对脚本进行配置。比如,
YAML 格式也不算新颖,早在几年之前的 SpringBoot 里面就已经采用了这种格式。相比于使用 json 或者 properties 等格式的配置文件,它更加简洁。
1、使用 gradle 指令自动打包,区分 32 位和 64 位 :因为现在有些应用市场明确要求区分 32 位和 64 位,所以,打包的时候要分开进行打包。
2、打包完成之后将 APK 拷贝到指定的目录 :主要用来做本地的 APK 文件备份,后面也会用这里拷贝的 APK 文件进行自动化加固。
3、使用 diffuse 输出相对于上一个版本的 APK 版本差异报告 :diffuse 是 JakeWharton 开发的 APK, AAB, AAR 和 JAR 的对比工具。这里我用它对比当前版本和上一个版本的 APK 的信息,以实现对 APK 质量的监控。diffuse 项目的地址是 https://github.com/JakeWharton/diffuse
3、拷贝多语言资源到指定的目录,并自动提交到 Github 仓库以便于协助翻译 :对做国际化的应用的开发者而言,我们可以通过应用内的协助翻译功能借助社区的力量实现应用的多语言。这里我尽量将这个过程做得更加自动化。即在应用打包完成之后将应用内的多语言资源按照版本信息拷贝到指定的目录下。然后使用 Git 工具将其推送到 Github 等。具体的效果可以参考 https://github.com/Shouheng88/LeafNote-Community .
4、自动打 tag 并提交到远程仓库 :该功能用来在打包完成之后使用为当前版本添加 Git tag,以便于后续根据版本回滚到指定的 Git 提交记录。
5、根据 Git 提交记录自动生成更新日志 :上面做了为项目自动添加 Git tag 的功能之后,我们可以根据当前版本到上一版本之间的 Git 提交记录的 comment 信息自动生成版本更新日志。虽然,这个这样生成的更新日志并不能直接用作发布时的更新记录,但在至少可以让我们直观得看到这个版本修改了什么。
6、使用 360 加固 对上述 APK 进行加固并输出到指定的目录 :加固操作其实非常简单,只需要一个 command 指令就可以完成了,
不过在使用上述命令之前需要先通过 GUI 的形式修改你在 360 加固中的渠道和签名信息(直接手动改文件也可以)。
7、上传打包 APK 到蓝奏云 :蓝奏云是现在很多开发者用来分享软件的一个云存储平台,100M 以下的文件可以免费存储,类似于网络云。上传蓝奏云之前需要先修改配置文件,
这里需要填入的 ylogin 和 phpdisk_info 可以在登录之后通过 Chrome 的开发工具查看 cookie 信息得到。目前能够做到自动化的一个方案就是使用上述两个信息。
8、通过 Telegram bot 将打包完成的渠道包和更新日志信息发送到 Telegram 群组 :对海外的用户我们可以通过 Telegram 作为一个交流的渠道。Telegram 是一个非常好用的聊天软件。它提供了 bot 功能,即一个可以推送消息的机器人。我们可以通过这个功能来在群组中推送消息、图片和文件。Telegram 的 bot 有非常强大的自定义性。其实我们完全可以基于爬虫和 bot 维护一个社区,然后通过在社区内推送广告来获得一些利益。这也不失为一个赚钱的渠道。使用 Telegram bot 之前需要在配置文件中填入如下信息,
这里的 token 是注册 bot 的时候得到的信息。chat_id 可以通过如下方式获取到:
即将 token 信息填入到上述 <YourBOTToken> 处。在返回的 json 结果中可以获取到 chat id 信息。
向群组推送信息的方式非常简单,一个 http 请求即可完成,
更多的协议可以参考这个文档: https://core.telegram.org/bots/api#senddocument
9、完成上述操作之后使用邮件通知打包结果 :最后就是在完成了最终的打包操作之后通过 Email 发送一封邮件,内部包含了本次打包的 diff 信息等给指定的用户。使用邮件功能需要在配置文件中填写,
这里我们使用的是 QQ 邮箱来发送邮件。这里需要填写的 user 和 password 字段分别是邮箱和开通 smtp 服务时系统提供的密码信息。QQ 邮箱开通 SMTP 服务器其 官方文档 即可。
上述是该打包脚本的主要功能。后续我会添加更多功能。因为时间有限,有些功能需要修改一下才能使用。不过,许多功能我都封装成了独立的 Python 脚本,如果需要的话可以自己做细微的修改。对于这个脚本,如果你有更好的建议和想法,可以跟我交流~
C. .yml是什么文件
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。
D. docker-compose.yml文件如何识别变量
这是一个新颖的想法,在码农的IDE环境中,若是可以很方便地使用Docker,真是一件很有意思的事:对Dockerfile或者Compose YML文件进行语法高亮、自动补全、语法验证,甚至还可以直接在IDE中启动这个Docker容器来进行更深入的测试或者开发。让懒惰的程序员们可以更高效地利用时间,专注于解决应用本身的问题。有兴趣的小伙伴,可以搜搜有没有更好的可以分享分享,或者帮助社区写另一个优秀的工具出来。
这个博客帖子是关于如何集成Docker到我们的IDE中。让我们有机会介绍一个Eclipse插件 doclipser ,可以在IDE中编辑,构建和运行Docker容器。
Docker的开发环境
在深入Docker和IDE细节之前,让我们看看,为什么得把Docker放进必需的开发工具列表中。
构建系统
首先,Docker能够使我们的构建环境便携,可重复以及保持隔离。举个例子:你需要使用5.1版本的gcc工具构建一个C文件。 所有需要做的就是运行以下命令(当然,这里假定你已经安装了Docker):
docker run gcc:5.1 gcc -o helloworld helloword.c
神奇的是,你可以在任何地方运行它,你不必理会依赖的库文件、之前的冲突或者gcc的安装。只要它能在你的笔记本上跑起来,也就可以在集成服务器上运行了。
运行环境
同样适用于运行时环境。如果你只想在tomcat 8上运行Java Web应用程序,可以只使用:
docker run tomcat:8 -v HelloWorld.war:/usr/local/tomcat/webapps/Helloworld.war
同样,你不用担心依赖性,平台配置或Linux发行版的差异,这些Docker都能搞定。
Docker和IDE
好吧,这应该很清楚,为什么现在Docker对开发真的非常有用。就像我们描述的,你可以使用喜欢的shell来执行这些命令。 问题是,开发者都是懒惰的。这意味着,如果我们在最喜欢的IDE中码字,就不希望跑到IDE外面来使用Docker。我们想直接从IDE中运行容器。
不幸的是,现在主要IDE都不支持Docker。
所以,你是不是很想看到IDE中集成了Docker?
你想要在容器中运行IDE?
docker run eclipse
汗,这不是容器的使用方式。在容器里面运行图形化应用程序,太过复杂也缺少可移植性。
你想要从IDE中运行容器?
是哦!我们希望能看到对Dockerfile,Docker Compose YML文件的支持,IDE构建系统和容器内的运行时环境。让我们来看看详细的需求:
Dockerfile的支持
Dockerfile支持应该带有语法高亮显示,自动补全(当按下Ctrl+SPACE键,dockerfile指令会自动弹出来)和语法验证(在执行 docker build 之前,IDE要能指出语法错误)
Docker Compose YML文件的支持
更有意思的是对Docker Compose YML文件的支持。这将允许定义容器间的关系,如Link和Volume,也可以从你的编辑器一次启动多个容器。真的很酷!
IDE构建系统
当然,你需要得到IDE中运行容器的支持。具体地,容器可以构建你的源文件。如果利用Docker多种语言特性,这可能变得更容易。
IDE运行时环境
我们期待IDE的最后一项功能,能够启动容器的运行时环境。
doclipser简介
根据上述四个功能,我们构建了doclipser,一个Eclipse插件来编辑,构建和运行Docker容器。
doclipser支持Dockerfile:语法高亮显示,自动补全和语法验证。虽仍没有支持Docker Compose YML文件,但已经可以执行一些Docker的命令,来构建源文件或启动运行时环境。
doclipser不是唯一的Docker Eclipse插件。这里有一个很优秀的Eclipse Docker工具集(以下简称:EDT),由JBoss维护且和Eclipse的Linux工具包一起分发。 即使它们都能使大家在IDE中使用Docker,doclipser和EDT还是两种不同的方法:
1、doclipser通过对Dockerfiles的支持,专注于编辑和运行容器,在未来的版本中,将提供对Docker Compose YML文件的支持。
2、EDT对Docker镜像和容器拥有更高级的管理方式,但缺乏对Dockerfiles的支持。
E. 如何使用Elasticsearch groovy script脚本更新数据
用groovy脚本自定义ElasticSearch查询,来实现以上功能。
例,数据中包含字段birdtyday,记录游客生日:
"birthday": "1992-02-05 00:00:00",
新建文件getAgeByBirthday.groovy,编辑其内容为:
def b = doc[birthday_field].value
def birthday = new Date(b)
def now = new Date()
long age = (now -birthday)/365
age
并把此文件放在es的config/scripts目录下(如果没有此目录就新建一个)。
然后在config/elasticsearch.yml文件中加一行:
script.groovy.sandbox.enabled: true
最后重启es即可。
接下来,我们就可以用以下DSL进行年龄统计了
GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"aggs": {
"counts_by_age": {
"terms": {
"script_file": "getAgeByBirthday",
"params": {
"birthday_field": "birthday"
},
"size": 100
}
}
}
}
或者:
GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"aggs": {
"histogram_by_age": {
"histogram": {
"script_file": "getAgeByBirdthday",
"params": {
"birdthday_field": "birdthday"
},
"interval": 5
}
}
}
}
不过脚本查询性能不佳,且不能利用es的缓存,所以在大数据量或高性能要求的场景下不适用。。
-------------------------------------
补充一个自定义的年龄range过滤:
range_AgeByBirthday.groovy:
def b = doc[birdthday_field].value
def birdthday = new Date(b)
def now = new Date()
long age = (now -birdthday)/365
gte<=age && age<=lte
DSL:
GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"query": {
"filtered": {
"filter": {
"script": {
"script_file": "range_AgeByBirdthday",
"params": {
"birdthday_field": "birdthday",
"gte": 50,
"lte": 60
}
}
}
}
},
"aggs": {
"histogram_by_age": {
"histogram": {
"script_file": "getAgeByBirdthday",
"params": {
"birdthday_field": "birdthday"
},
"interval": 5
}
}
}
}
F. HttpRunner回放录制的har转yml和json脚本报错
好厉害的样子。感觉受到打击了
G. 如何使用Elasticsearch groovy script脚本更新数据
想要使用script脚本功能,需要在配置文件elasticsearch.yml里设置
Python
script.disable_dynamic: false
关于elasticsearch script的文章,总是会没完没了的修改
ES支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过
index找到相应的存放记录的节点,然后执行脚本,执行完之后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程中,通过
versioning来控制没有其它的更新操作(这个功能是0.19后可用的)。具体实现的原理应该和elasticsearch
Versioning相关。
get,reindex的含义是,ES先取出这条记录,然后根据新数据生成新记录,然后在把新记录放回到ES中(并不会覆盖老的记录)。
现在没有数据,首先我们需要创建一条记录
Python
$ curl -XPUT localhost:9200/xiaorui.cc/blog/1 -d '{
"counter" : 1,
"tags" : ["red"]
}'
$ curl -XPUT localhost:9200/xiaorui.cc/blog/1 -d '{
"counter" : 1,
"tags" : ["red"]
}'
直接修改数据,一定要注意,直接update的化,会覆盖以前的数据,另外update的时候,需要/index/type/id ,一定要带着id。 elasticsearch 应该不支持搜索query方式update修改数据。
Python
curl -XPUT 'localhost:9200/xiaorui.cc/blog/1?pretty' -d '
{
"name": "xiaorui.cc"
}'
curl -XPUT 'localhost:9200/xiaorui.cc/blog/1?pretty' -d '
{
"name": "xiaorui.cc"
}'
elasticsearch提供了doc这个局部更新参数,他可以局部修改,而不会直接覆盖以前的数据,这会针对特定的k v,字段修改。
Python
curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update?pretty' -d '
{
"doc": { "name": "ruifengyun" }
}'
curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update?pretty' -d '
{
"doc": { "name": "ruifengyun" }
}'
当Elasticsearch API不能满足要求时,Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API,例如搜索、排序、聚合和文档更新。脚本可以通过请求的一部分、检索特殊的.scripts索引或者从磁盘加载方式执行。
下面是es script的用法,这些脚本是groovy开发的。 下面的语句的意思是说,将counter的值加4
Python
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
}
}'
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
}
}'
通过上面的例子,我们知道tags是个列表,如果用doc局部更新的语法,他是无法做到append的,还是会覆盖tags这个字段。 那么怎么实现列表扩展? 请使用elasticsearch script实现。
Python
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.tags += tag",
"params" : {
"tag" : "white"
}
}'
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.tags += tag",
"params" : {
"tag" : "white"
}
}'
_update也支持upsert功能,没有这个字段或者key,也会添加这个记录。下面是一个例子,如果没有counter字段,则插入该字段:
Python
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
},
"upsert" : {
"counter" : 1
}
}'
$ curl -XPOST 'localhost:9200/xiaorui.cc/blog/1/_update' -d '{
"script" : "ctx._source.counter += count",
"params" : {
"count" : 4
},
"upsert" : {
"counter" : 1
}
}'
下面我们来复杂点的groovy script脚本用法. 当你的source没有china这个key,那么我会增加一个kv
Python
curl -XPOST "http://localhost:9200/xiaorui.cc/blog/80/_update" -d'
{
"script": "if (!ctx._source.containsKey(\"china\")) { ctx._source.attending = newField }",
"params" : {"newField" : "blue" },
"myfield": "data"
}'
curl -XPOST "http://localhost:9200/xiaorui.cc/blog/80/_update" -d'
{
"script": "if (!ctx._source.containsKey(\"china\")) { ctx._source.attending = newField }",
"params" : {"newField" : "blue" },
"myfield": "data"
}'
下面的script语法相对复杂的,会遍历一组字典,然后进行判断赋值。
{
“55555″: 22,
“name”: “lisi”,
“distr_pan”: [
{
“k”: 15,
“v”: 15
},
{
“k”: 20,
“v”: 20
}
]
}
Python
$ curl -XPUT 'localhost:9200/xiaorui.cc/blog/9123/_update' -d '
{
"script" : "def x = false;ctx._source.distr_pan.each({if(it.get('k')==target){x=true}});if(x){ctx._source.distr_pan +=v}",
"params":{
"v":{"k":nlp, "v":35},
"target":15
}
}
$ curl -XPUT 'localhost:9200/xiaorui.cc/blog/9123/_update' -d '
{
"script" : "def x = false;ctx._source.distr_pan.each({if(it.get('k')==target){x=true}});if(x){ctx._source.distr_pan +=v}",
"params":{
"v":{"k":nlp, "v":35},
"target":15
}
}
elasticsearch script就讲解到这里了,很多例子已经简单明了…
script貌似不是很安全,最少远程代码执行的漏洞暴露过几次了. 下次把python版的script走一遍试试
望采纳
H. 如何使用Elasticsearch groovy script脚本更新数据
Python
script.disable_dynamic: false
关于elasticsearch script的文章,总是会没完没了的修改
ES支持更新,但是更新的方式是通过一个提供的脚本进行的。ES的做法是,通过
index找到相应的存放记录的节点,然后执行脚本,执行完之后,返回新的索引。实际上执行的是一个get和reindex的过程,在这个过程中,通过
versioning来控制没有其它的更新操作(这个功能是0.19后可用的)。具体实现的原理应该和elasticsearch
Versioning相关。
I. 如何使用Elasticsearch groovy script脚本更新数据
用groovy脚本自定义ElasticSearch查询,来实现以上功能。
例,数据中包含字段birdtyday,记录游客生日:
"birthday": "1992-02-05 00:00:00",
新建文件getAgeByBirthday.groovy,编辑其内容为:
def b = doc[birthday_field].value
def birthday = new Date(b)
def now = new Date()
long age = (now -birthday)/365
age
并把此文件放在es的config/scripts目录下(如果没有此目录就新建一个)。
然后在config/elasticsearch.yml文件中加一行:
script.groovy.sandbox.enabled: true
最后重启es即可。
接下来,我们就可以用以下DSL进行年龄统计了
GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"aggs": {
"counts_by_age": {
"terms": {
"script_file": "getAgeByBirthday",
"params": {
"birthday_field": "birthday"
},
"size": 100
}
}
}
}
或者:
GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"aggs": {
"histogram_by_age": {
"histogram": {
"script_file": "getAgeByBirdthday",
"params": {
"birdthday_field": "birdthday"
},
"interval": 5
}
}
}
}
不过脚本查询性能不佳,且不能利用es的缓存,所以在大数据量或高性能要求的场景下不适用。。
-------------------------------------
补充一个自定义的年龄range过滤:
range_AgeByBirthday.groovy:
def b = doc[birdthday_field].value
def birdthday = new Date(b)
def now = new Date()
long age = (now -birdthday)/365
gte<=age && age<=lte
DSL:
GET /lovingtrip-report/hotelcustomer/_search?search_type=count
{
"query": {
"filtered": {
"filter": {
"script": {
"script_file": "range_AgeByBirdthday",
"params": {
"birdthday_field": "birdthday",
"gte": 50,
"lte": 60
}
}
}
}
},
"aggs": {
"histogram_by_age": {
"histogram": {
"script_file": "getAgeByBirdthday",
"params": {
"birdthday_field": "birdthday"
},
"interval": 5
}
}
}
}