Elasticsearch 參考指南(如何使用腳本)

如何使用腳本

不管Elasticsearch API支持何種腳本,語法都遵循相同的模式:express

"script": {
    "lang":   "...",  
    "source" | "id": "...", 
    "params": { ... } 
  }
  • 腳本編寫的語言,默認爲painless
  • 腳本自己能夠指定爲內聯腳本的source或存儲腳本的id
  • 應傳遞給腳本的任何命名參數。

例如,在搜索請求中使用如下腳原本返回腳本字段:segmentfault

PUT my_index/_doc/1
{
  "my_field": 5
}

GET my_index/_search
{
  "script_fields": {
    "my_doubled_field": {
      "script": {
        "lang":   "expression",
        "source": "doc['my_field'] * multiplier",
        "params": {
          "multiplier": 2
        }
      }
    }
  }
}

腳本參數

lang緩存

  • 指定編寫腳本的語言,默認爲painless

sourceidless

  • 指定腳本的來源,inline腳本是指定source,如上例所示,存儲的腳本是指定的id,並從羣集狀態中檢索(請參閱存儲的腳本)。

paramsui

  • 指定做爲變量傳遞到腳本的任何命名參數。

首選參數

Elasticsearch第一次看到一個新腳本,它會編譯它並將編譯後的版本存儲在緩存中,編譯多是一個繁重的過程。

若是須要將變量傳遞給腳本,則應將它們做爲命名參數傳遞給腳本自己而不是硬編碼值,例如,若是你但願可以將字段值乘以不一樣的乘數,請不要將乘數硬編碼到腳本中:編碼

"source": "doc['my_field'] * 2"

相反,將其做爲命名參數傳遞:code

"source": "doc['my_field'] * multiplier",
  "params": {
    "multiplier": 2
  }

第一個版本每次乘數改變時都必須從新編譯,第二個版本只編譯一次。對象

若是你在很短的時間內編譯了太多獨特的腳本,Elasticsearch將使用circuit_breaking_exception錯誤拒絕新的動態腳本。默認狀況下,每分鐘將編譯最多15個內聯腳本,你能夠經過設置script.max_compilations_rate動態更改此設置。ip

簡短腳本形式

可使用簡短腳本形式來簡化,在簡短形式中,script由字符串而不是對象表示,該字符串包含腳本的源。ci

簡寫:

"script": "ctx._source.likes++"

正常形式的相同腳本:

"script": {
    "source": "ctx._source.likes++"
  }

存儲的腳本

可使用_scripts端點將腳本存儲在集羣狀態中並從集羣狀態中檢索腳本。

請求示例

如下是使用位於/_scripts/{id}的存儲腳本的示例。

首先,在集羣狀態下建立名爲calculate-score的腳本:

POST _scripts/calculate-score
{
  "script": {
    "lang": "painless",
    "source": "Math.log(_score * 2) + params.my_modifier"
  }
}

可使用如下命令檢索相同的腳本:

GET _scripts/calculate-score

能夠經過指定id參數來使用存儲的腳本,以下所示:

GET _search
{
  "query": {
    "script": {
      "script": {
        "id": "calculate-score",
        "params": {
          "my_modifier": 2
        }
      }
    }
  }
}

刪除:

DELETE _scripts/calculate-score

腳本緩存

默認狀況下,全部腳本都被緩存,所以只有在更新發生時才須要從新編譯它們,默認狀況下,腳本沒有基於時間的過時,但你可使用script.cache.expire設置更改此行爲,你可使用script.cache.max_size設置配置此緩存的大小,默認狀況下,緩存大小爲100

存儲腳本的大小限制爲65,535字節,這能夠經過設置 script.max_size_in_bytes設置來增長軟限制來更改,但若是腳本很是大,則應考慮原生腳本引擎。

上一篇:腳本

相關文章
相關標籤/搜索