Elasticsearch学习--script

一、概念

 es1.4-5.0,默认脚本语言是Grovvy

es5.0+,默认脚本语言是painless

 二、简单使用

将price减一

# 将id=1的price减一
POST goods/_update/1
{
  "script": {
    "source": "ctx._source.price -= 1"
  }
}

# 简写
POST goods/_update/1
{
  "script": "ctx._source.price -= 1"
}

其中,ctx是一个上下文对象 ,用在对数据的修改上

三、CRUD

1、数据备份

(数据来源可以查看:CSDN

#将goods中的数据备份到goods2中
POST _reindex
{
  "source": {
    "index": "goods"
  },
  "dest": {
    "index": "goods2"
  }
}

2. 新增数组中的值

# 将id=1的tags新增一个值
POST goods/_update/1
{
  "script": "ctx._source.tags.add('无线充电')"
}

3. 根据id删除

# 删除id=11的数据
POST goods/_update/11
{
  "script": "ctx.op='delete'"
}

 4. upsert

如果数据存在执行script中的updated,如果数据不存在,执行upsert中created

POST goods/_update/15
{
  "script": {
    "source": "ctx._source.price += 100"
  },
  "upsert": {
    "name":"香蕉",
    "price": 599
  }
}

第一次执行结果

 第二次执行结果

 5. 查询

使用expression和painless两种语言进行查询,查询结果相同

GET goods/_search
{
  "script_fields": {
    "new_price": {
      "script": {
        "lang": "expression",
        "source": "doc['price'].value * 0.9"
      }
    }
  }
}

GET goods/_search
{
  "script_fields": {
    "new_price": {
      "script": {
        "lang": "painless",
        "source": "doc['price'] * 0.9"
      }
    }
  }
}

painless,doc['age'].value和doc['age']都能正确输出,但是doc['age'] * 0.9报错
expression,doc['age'].value和doc['age']都能正确输出,doc['age'] * 0.9和doc['age'].value * 0.9也都不报错

但是,painless,如果字段为空,*0.9会报错

expression:只能访问数字、布尔值、日期等,存储的字段不可用

es源数据是map类型的,在取值的时候,要根据doc['x xx']取值

update用ctx,查询的时候用doc

6. 参数化查询

给interest加一个值aaa

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.interest.add('aaa')"
  }
}

es在首次执行脚本的时候,会对执行的脚本进行编译,并且把编译的结果放在缓冲区内。es的缓冲区默认只有100M,编译操作很消耗性能,es每分钟支持的编译次数是15次
解决方案是:

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.interest.add(params.inserest_name)",
    "params": {
      "inserest_name":"bbb"
    }
  }
}

这样,参数是动态传递的,没有硬编码,下次参数内容发生改变,但是脚本没有发生改变,不需要重新编译,节省性能

同理,也可以这样                                                                                                      

GET indexname/_search
{
  "script_fields": {
    "new_age": {
      "script": {
        "lang": "painless",
        "source":"doc['age'].value * params.num",
        "params": {
          "num": 0.9
        }
      }
    }
  }
}

如果是expression,就要把params.num改成num

GET indexname/_search
{
  "script_fields": {
    "new_age": {
      "script": {
        "lang": "expression",
        "source":"doc['age'].value * num",
        "params": {
          "num": 0.9
        }
      }
    }
  }
}

结果数组

GET indexname/_search
{
  "script_fields": {
    "age": {
      "script": {
        "lang": "painless",
        "source":"doc['age'].value"
      }
    },
    "new_age": {
      "script": {
        "lang": "painless",
        "source":"[doc['age'].value - params.num_1,doc['age'].value - params.num_2,doc['age'].value - params.num_3]",
        "params": {
          "num_1": 1,
          "num_2": 2,
          "num_3": 3
        }
      }
    }
  }
}

四、stored scripts:scripts模板

1. 操作脚本

因为脚本编译比较消耗性能,可以把脚本保存在集群的缓存中

语法

/_scripts/{script_id}

创建脚本

POST _scripts/age_num
{
  "script":{
     "lang": "painless",
     "source":"doc['age'].value - params.num"
  }
}

查看脚本

GET _scripts/age_num

使用脚本

GET indexname/_search
{
  "script_fields": {
    "age": {
      "script": {
        "lang": "painless",
        "source":"doc['age'].value"
      }
    },
    "new_age": {
      "script": {
        "id": "age_num",
        "params": {
          "num": 0.9
        }
      }
    }
  }
}

2. scripting的函数式编程

在source中加""",三个双引号

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": """
       ctx._source.interest.add(params.inserest_name);
       ctx._source.age-=1;
    """,
    "params": {
      "inserest_name": "bbb"
    }
  }
}

如果name中包含aa:name+bb;否则,不操作。==~是匹配的意思

POST indexname/_update/2
{
  "script": {
    "lang": "painless",
    "source": """
      if(ctx._source.name ==~ /[\s\S]*aa[\s\S]*/){
        ctx._source.name+="bb"
      }else{
        ctx.op="noop"
      }
    """
  }
}

for循环取insterst的总数

GET indexname/_search
{
  "aggs": {
    "agg_insterst": {
      "sum": {
        "script": {
          "lang": "painless",
          "source": """
            int total=0;
            for(int i=0; i<doc['interest.keyword'].length;i++){
              total++;
            }
            return total;
          """
        }
      }
    }
  }
}

doc['filed']:会被加载到内存中,效率更高,更消耗内存,只允许简单类型,object和nested属于复杂类型。推荐
params['_source']['field']:每次都要重新加载,重新解析,可以用于复杂类型
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch X-Pack 是一个强大的插件,它为 Elasticsearch 提供了一系列的扩展功能,包括安全、监控、报告、机器学习等。下面简单介绍一下如何安装 Elasticsearch X-Pack。 1. 下载 Elasticsearch X-Pack 插件 你可以从 Elastic 官网下载对应版本的 X-Pack 插件,链接为:https://www.elastic.co/cn/downloads/x-pack。 2. 安装 Elasticsearch X-Pack 插件 安装 Elasticsearch X-Pack 插件需要使用 Elasticsearch 的插件安装命令。将下载好的 X-Pack 插件解压到 Elasticsearch 的 plugins 目录下,然后使用以下命令安装插件: ``` bin/elasticsearch-plugin install file:///path/to/x-pack-xxx.zip ``` 其中,`/path/to/x-pack-xxx.zip` 是 X-Pack 插件的压缩包路径。 3. 配置 Elasticsearch X-Pack 插件 安装 Elasticsearch X-Pack 插件后,你需要在 Elasticsearch 的配置文件中进行相应的配置。具体配置方法可以参考官方文档。 4. 启动 Elasticsearch X-Pack 插件 启动 Elasticsearch X-Pack 插件需要先启动 Elasticsearch,然后在 Elasticsearch 的命令行界面输入以下命令: ``` bin/elasticsearch ``` 如果一切顺利,你应该可以看到 Elasticsearch 启动成功的日志信息。 5. 验证 Elasticsearch X-Pack 插件是否安装成功 你可以通过访问 Elasticsearch 的 API 或者使用 Kibana 来验证 Elasticsearch X-Pack 插件是否安装成功。如果安装成功,你应该可以看到 X-Pack 相关的 API 和功能。 总之,在安装 Elasticsearch X-Pack 插件之前,你需要先了解自己的 Elasticsearch 版本,然后下载对应版本的 X-Pack 插件。安装插件需要使用 Elasticsearch 的插件安装命令,并且需要在 Elasticsearch 的配置文件中进行相应的配置。启动插件后,你可以通过访问 Elasticsearch 的 API 或者使用 Kibana 来验证插件是否安装成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值