轉(zhuǎn)自:http://www.dcharm.com/?p=469
本文討論ES的自定義排序的兩種實(shí)現(xiàn)形式:基于groovy腳本的自定義排序和基于native script的自定義排序。
1. 基于Groovy腳本的自定義排序
ES的排序腳本必須放在config/scripts下面,ES能夠自動(dòng)發(fā)現(xiàn)這些腳本并提供對(duì)外使用奖蔓, 例如編寫腳本calculate-score.groovy
log(_score*2)+my_modifier
腳本中my_modifier是搜索請(qǐng)求中的參數(shù),_score是ES計(jì)算得到的文檔分?jǐn)?shù)。發(fā)起搜索請(qǐng)求時(shí)指定用calculate-score排序
curl -XPOST localhost:9200/_search -d '{
"query": {
"function_score": {
"query": {
"match": {
"body": "foo"
}
},
"functions": [
{
"script_score": {
"lang": "groovy",
"script_file": "calculate-score",
"params": {
"my_modifier": 8
}
}
}
]
}
}}'
在上面的請(qǐng)求指定了my_modifier的值為8,排序時(shí)calculate-score腳本中對(duì)應(yīng)變量my_modifier就會(huì)被賦值為8光督。除此以外苛茂,還可以在腳本中通過doc[‘field_name’].value或者doc[‘field_name’].value獲取field data中的字段或油;通過_fields[‘field_name’]獲取沒有存放在doc values中但是放在了ES存儲(chǔ)(store)中的字段。需要注意的是doc values會(huì)被載入到內(nèi)存交胚,而store不會(huì),所以doc values取值速度更快盈电。
ES會(huì)周期性的掃描config/scripts下面的文件蝴簇,新增和被修改的腳本會(huì)被重新載入,并從script緩存中刪除文件夾中被刪除的腳本匆帚。重載的頻率可以在watcher.interval中說明熬词,默認(rèn)是60s。如果要禁止重載腳本吸重,可以設(shè)置script.auto_reload_enabled為false互拾。
2. 基于native腳本的自定義排序
ES中的native腳本使用java語言編寫,并需要實(shí)現(xiàn)相應(yīng)的NativeScriptFactory接口嚎幸。
public class CustomScriptFactory implements NativeScriptFactory {
@Override
publicExecutableScript newScript(@NullableMap params) {
returnnewCustomScript(params);
}
}
public class CustomScript extends AbstractDoubleSearchScript {
private double myVal;
private double base;
public CustomScript(@NullableMap params){
base = (Double)params.get("myVal");
}
@Override
public double runAsDouble() {
doublea = ((ScriptDocValues.Longs)doc().get("itemNum")).getValue();
returna +2;
}
}
將打包后的jar包放到ES的class path中颜矿,并在配置文件config/elasticsearch.yml中增加一行配置:
script.native.mynativescript.type: com.ymatou.search.searcher.script.CustomScriptFactory
Native腳本不能被ES自動(dòng)發(fā)現(xiàn),需要重啟ES嫉晶,另外搜索請(qǐng)求的格式也有些不同骑疆。
curl -XPOST localhost:19200/m2c/item/_search -d '{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"script_score": {
"lang":"native",
"script":"m2c_jyh_base",
"params": {
"myVal": 10.0
}
}
}
]
}
}
}'
3. Groovy腳本自定義排序和Native自定排序的比較
相對(duì)于Native自定義排序,Groovy腳本自定義排序?qū)崿F(xiàn)和部署方便:不用編譯打包替废,不用修改配置文件箍铭,也不用重啟ES,但是Native自定義排序的速度是Groovy腳本自定義排序速度的1到3倍椎镣,因此建議大家使用Groovy腳本做實(shí)驗(yàn)诈火,但是在生產(chǎn)環(huán)境中使用Native腳本。