painless语法入门[通俗易懂]
生活随笔
收集整理的這篇文章主要介紹了
painless语法入门[通俗易懂]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大家好,又見面了,我是你們的朋友風君子。
painless語法
painless基礎結構
"script": {
"lang": "...",
"source" | "id": "...",
"params": {
... }
}
- lang: 定義腳本使用的語言, 默認painless
- source, id: 腳本的主體, source后面跟著內聯的腳本代碼, id后面跟著腳本的id, 具體代碼存在于腳本id對應的代碼中
- params: 定義一些變量的值, 使用params可以減少腳本的編譯次數. 因為如果變量的值硬編碼到代碼中, 每次進行變量值得更改都會對腳本進行重新編譯. 使用params則不會重新編譯腳本.
script.context.field.max_compilations_rate=75/5m 腳本的默認編譯頻率, 定義腳本的編譯頻率為5分鐘75個, 當超過75個時會拋出circuit_breaking_exception異常.
腳本代碼的存儲
// POST _scripts/{id}
POST _scripts/calculate-score
{
"script": {
"lang": "painless",
"source": "Math.log(_score * 2) + params['my_modifier']"
}
}
// 腳本使用
GET my-index-000001/_search
{
"query": {
"script_score": {
"query": {
"match": {
"message": "some message"
}
},
"script": {
"id": "calculate-score",
"params": {
"my_modifier": 2
}
}
}
}
}
使用腳本對文檔進行更新
PUT my-index-000001/_doc/1
{
"counter" : 1,
"tags" : ["red"]
}
// 將count加上4
POST my-index-000001/_update/1
{
"script" : {
"source": "ctx._source.counter += params.count",
"lang": "painless",
"params" : {
"count" : 4
}
}
}
// 增加tags的元素
POST my-index-000001/_update/1
{
"script": {
"source": "ctx._source.tags.add(params['tag'])",
"lang": "painless",
"params": {
"tag": "blue"
}
}
}
// If the list contains duplicates of the tag, this script just removes one occurrence.
// 如果集合中有多個相同的值, 只刪除第一個
POST my-index-000001/_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"
}
}
}
// 增加新的字段
POST my-index-000001/_update/1
{
"script" : "ctx._source.new_field = 'value_of_new_field'"
}
// 刪除字段
POST my-index-000001/_update/1
{
"script" : "ctx._source.remove('new_field')"
}
// 如果tags字段中包含green, 則刪除該文檔, 否則不做操作
POST my-index-000001/_update/1
{
"script": {
"source": "if (ctx._source.tags.contains(params['tag'])) { ctx.op = 'delete' } else { ctx.op = 'none' }",
"lang": "painless",
"params": {
"tag": "green"
}
}
}
// doc.containsKey('field')
腳本變量
- ctx._source.field: add, contains, remove, indexOf, length
- ctx.op: The operation that should be applied to the document: index or delete
- ctx._index: Access to document metadata fields
- _score 只在script_score中有效
- doc[‘field’], doc[‘field’].value: add, contains, remove, indexOf, length
腳本緩存
- You can change this behavior by using the
script.cache.expiresetting. Use thescript.cache.max_sizesetting to configure the size of the cache.The size of scripts is limited to 65,535 bytes. Set the value ofscript.max_size_in_bytesto increase that soft limit. - Cache sizing is important. Your script cache should be large enough to hold all of the scripts that users need to be accessed concurrently.
腳本優化
- 使用腳本緩存, 預先緩存可以節省第一次的查詢時間
- 使用ingest pipeline進行預先計算
- 相比于_source.field_name使用doc[‘field_name’]語法速度更快, doc語法使用doc value , 列存儲
// 根據分數相加結果進行排序
GET /my_test_scores/_search
{
"query": {
"term": {
"grad_year": "2099"
}
},
"sort": [
{
"_script": {
"type": "number",
"script": {
"source": "doc['math_score'].value + doc['verbal_score'].value"
},
"order": "desc"
}
}
]
}
// 在索引中新加一個字段存儲計算結果
PUT /my_test_scores/_mapping
{
"properties": {
"total_score": {
"type": "long"
}
}
}
// 使用ingest pipeline先將計算結果作為值存儲起來
PUT _ingest/pipeline/my_test_scores_pipeline
{
"description": "Calculates the total test score",
"processors": [
{
"script": {
"source": "ctx.total_score = (ctx.math_score + ctx.verbal_score)"
}
}
]
}
// 重新索引時使用ingest pipeline
POST /_reindex
{
"source": {
"index": "my_test_scores"
},
"dest": {
"index": "my_test_scores_2",
"pipeline": "my_test_scores_pipeline"
}
}
// 索引新文檔時使用ingest pipeline
POST /my_test_scores_2/_doc/?pipeline=my_test_scores_pipeline
{
"student": "kimchy",
"grad_year": "2099",
"math_score": 1200,
"verbal_score": 800
}
// 查詢
GET /my_test_scores_2/_search
{
"query": {
"term": {
"grad_year": "2099"
}
},
"sort": [
{
"total_score": {
"order": "desc"
}
}
]
}
// stored field 用法
PUT my-index-000001
{
"mappings": {
"properties": {
"full_name": {
"type": "text",
"store": true
},
"title": {
"type": "text",
"store": true
}
}
}
}
PUT my-index-000001/_doc/1?refresh
{
"full_name": "Alice Ball",
"title": "Professor"
}
GET my-index-000001/_search
{
"script_fields": {
"name_with_title": {
"script": {
"lang": "painless",
"source": "params._fields['title'].value + ' ' + params._fields['full_name'].value"
}
}
}
}
用到腳本的命令
- function_score
- script_score
- aggregation
- rescore
總結
以上是生活随笔為你收集整理的painless语法入门[通俗易懂]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Marvell 88E1111 linu
- 下一篇: Teleport Ultra/Pro 1