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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

painless语法入门[通俗易懂]

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

大家好,又見面了,我是你們的朋友風(fēng)君子。

painless語法

painless基礎(chǔ)結(jié)構(gòu)


  "script": { 
   
    "lang":   "...",
    "source" | "id": "...",
    "params": { 
    ... }
  }
  1. lang: 定義腳本使用的語言, 默認(rèn)painless
  2. source, id: 腳本的主體, source后面跟著內(nèi)聯(lián)的腳本代碼, id后面跟著腳本的id, 具體代碼存在于腳本id對應(yīng)的代碼中
  3. params: 定義一些變量的值, 使用params可以減少腳本的編譯次數(shù). 因為如果變量的值硬編碼到代碼中, 每次進(jìn)行變量值得更改都會對腳本進(jìn)行重新編譯. 使用params則不會重新編譯腳本.

script.context.field.max_compilations_rate=75/5m 腳本的默認(rèn)編譯頻率, 定義腳本的編譯頻率為5分鐘75個, 當(dāng)超過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
}
}
}
}
}

使用腳本對文檔進(jìn)行更新


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.

腳本優(yōu)化

  1. 使用腳本緩存, 預(yù)先緩存可以節(jié)省第一次的查詢時間
  2. 使用ingest pipeline進(jìn)行預(yù)先計算
  3. 相比于_source.field_name使用doc[‘field_name’]語法速度更快, doc語法使用doc value , 列存儲

// 根據(jù)分?jǐn)?shù)相加結(jié)果進(jìn)行排序
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"
}
}
]
}
// 在索引中新加一個字段存儲計算結(jié)果
PUT /my_test_scores/_mapping
{ 

"properties": { 

"total_score": { 

"type": "long"
}
}
}
// 使用ingest pipeline先將計算結(jié)果作為值存儲起來
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

總結(jié)

以上是生活随笔為你收集整理的painless语法入门[通俗易懂]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。