日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

painless语法入门[通俗易懂]

發布時間:2023/12/15 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 painless语法入门[通俗易懂] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大家好,又見面了,我是你們的朋友風君子。

painless語法

painless基礎結構


  "script": { 
   
    "lang":   "...",
    "source" | "id": "...",
    "params": { 
    ... }
  }
  1. lang: 定義腳本使用的語言, 默認painless
  2. source, id: 腳本的主體, source后面跟著內聯的腳本代碼, id后面跟著腳本的id, 具體代碼存在于腳本id對應的代碼中
  3. 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

腳本緩存

  1. You can change this behavior by using the script.cache.expire setting. Use the script.cache.max_size setting to configure the size of the cache.The size of scripts is limited to 65,535 bytes. Set the value of script.max_size_in_bytes to increase that soft limit.
  2. Cache sizing is important. Your script cache should be large enough to hold all of the scripts that users need to be accessed concurrently.

腳本優化

  1. 使用腳本緩存, 預先緩存可以節省第一次的查詢時間
  2. 使用ingest pipeline進行預先計算
  3. 相比于_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语法入门[通俗易懂]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。