elasticsearch 7.0 新特性之Script Score query

首先這個特性處于實驗階段矿咕,在之后發(fā)布的release版本中可能會被移除悦荒,Elastic官方會盡最大努力去修復(fù)可能出現(xiàn)的各種問題春锋,因為不受GA保護(hù)累贤,所以前期大家盡量不要在生產(chǎn)環(huán)境中使用

1、介紹

script_score 是 function score 2.0版本屹耐, 允許用戶在檢索中靈活修改文檔score尸疆,來實現(xiàn)自己干預(yù)結(jié)果排名的目的,另外script score性能要高于function score
下面我們通過一個簡單的例子來加深理解惶岭,通過script score將文檔score值修改為“l(fā)ike”字段值的十分之一:

GET /_search
{
    "query" : {
        "script_score" : {
            "query" : {
                "match": { "message": "elasticsearch" }
            },
            "script" : {
                "source" : "doc['likes'].value / 10 "
            }
        }
     }
}

2寿弱、操作

  • 在script 中訪問當(dāng)前文檔_score值
    用戶可以在script中訪問變量_score ,還是上面的例子,我們給當(dāng)前score加上“l(fā)ike”值:
{
    "query" : {
        "script_score" : {
            "query" : {
                "match": { "message": "elasticsearch" }
            },
            "script" : {
                "source" : "doc['likes'].value + _score "
            }
        }
     }
}
  • Vector查詢支持
    這類查詢目前有cosineSimilarity 和 dotProduct兩類函數(shù)支持按灶,只能應(yīng)用在dense_vecotor 和 sparse_vector數(shù)據(jù)類型上症革。
    例如,通過cosineSimilarity函數(shù)計算query文檔與索引庫里文檔的dense_vector相似度:
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.queryVector, doc['my_dense_vector'])",
        "params": {
          "queryVector": [4, 3.4, -0.2]  
        }
      }
    }
  }
}

如果是計算sparse_vector field的cosine相似度:

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilaritySparse(params.queryVector, doc['my_sparse_vector'])",
        "params": {
          "queryVector": {"2": 0.5, "10" : 111.3, "50": -1.3, "113": 14.8, "4545": 156.0}
        }
      }
    }
  }
}

再如鸯旁,在dense_vector field上計算給定文檔與索引庫文檔點積的距離時:

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "dotProduct(params.queryVector, doc['my_dense_vector'])",
        "params": {
          "queryVector": [4, 3.4, -0.2]
        }
      }
    }
  }
}

同理噪矛,在sparse_vector上進(jìn)行點積計算,需要使用dotProductSparse 函數(shù):

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "dotProductSparse(params.queryVector, doc['my_sparse_vector'])",
        "params": {
          "queryVector": {"2": 0.5, "10" : 111.3, "50": -1.3, "113": 14.8, "4545": 156.0}
        }
      }
    }
  }
}

上述vector查詢需要注意的時铺罢,如果vector field缺失數(shù)值時艇挨,或者查詢語句中vector規(guī)格與索引庫字段的vector規(guī)格不一致,那么該文檔的計算結(jié)果會是0

  • 調(diào)用自定義Painless script
    用戶可以靈活的使用Painless語法編寫自己的Function 韭赘,并在script中進(jìn)行調(diào)用缩滨,另外值得注意的是,本身es提供了大量的預(yù)定義Function可供調(diào)用辞居,這些都是經(jīng)過優(yōu)化的楷怒,執(zhí)行效率比較高蛋勺。
sigmoid(value, k, a) = value^a/ (k^a + value^a)  
"script" : {
    "source" : "sigmoid(doc['likes'].value, 2, 1)"
}
  • 對數(shù)字類型字段添加衰減函數(shù)
    常用到的衰減函數(shù)有decayNumericLinear(線性)瓦灶,decayNumericExp(指數(shù)),decayNumericGauss(高斯)
"script" : {
    "source" : "decayNumericLinear(params.origin, params.scale, params.offset, params.decay, doc['dval'].value)",
    "params": { 
        "origin": 20,
        "scale": 10,
        "decay" : 0.5,
        "offset" : 0
    }
}
  • 對geo類型字段添加衰減函數(shù)
    常用到的衰減函數(shù)有decayGeoLinear(線性)抱完,decayGeoExp(指數(shù))贼陶,decayGeoGauss(高斯)
"script" : {
    "source" : "decayGeoExp(params.origin, params.scale, params.offset, params.decay, doc['location'].value)",
    "params": {
        "origin": "40, -70.12",
        "scale": "200km",
        "offset": "0km",
        "decay" : 0.2
    }
}
  • 對日期類型字段添加衰減函數(shù)
    常用到的衰減函數(shù)有decayDateLinear(線性),decayDateExp(指數(shù))巧娱,decayDateGauss(高斯)碉怔,不支持 mow 函數(shù)。
"script" : {
    "source" : "decayDateGauss(params.origin, params.scale, params.offset, params.decay, doc['date'].value)",
    "params": {
        "origin": "2008-01-01T01:00:00Z",
        "scale": "1h",
        "offset" : "0",
        "decay" : 0.5
    }
}

需要注意的是上述幾個衰減函數(shù)中都用到了params參數(shù)禁添,而該參數(shù)官方說明是不支持動態(tài)改變數(shù)值的撮胧,個人覺得不是很好用,后期應(yīng)該還會優(yōu)化

  • Function Score 轉(zhuǎn) Script Score

script_score:function score中的script_score 函數(shù)部分不需要進(jìn)行修改老翘,可以直接拷貝到script score里運行芹啥。

weight:

"script" : {
    "source" : "params.weight * _score",
    "params": {
        "weight": 2
    }
}

random_score:

"script" : {
    "source" : "randomNotReproducible()"
}

field_value_factor:


"script" : {
    "source" : "Math.log10((doc['field'].size() == 0 ? 1 : doc['field'].value()) * params.factor)",
    params" : {
        "factor" : 5
    }
}

其中 Math.log10((doc['field'].size() == 0 是為了排除因field missing引起的異常锻离,field_value_factor 里modifier(權(quán)重調(diào)控函數(shù))可以通過下面函數(shù)實現(xiàn):

名稱 實現(xiàn)
none -
log Math.log10(doc['f'].value)
log1p Math.log10(doc['f'].value + 1)
log2p Math.log10(doc['f'].value + 2)
ln Math.log(doc['f'].value)
ln1p Math.log(doc['f'].value + 1)
ln2p Math.log(doc['f'].value + 2)
square Math.pow(doc['f'].value, 2)
sqrt Math.sqrt(doc['f'].value)
reciprocal 1.0 / doc['f'].value

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市墓怀,隨后出現(xiàn)的幾起案子汽纠,更是在濱河造成了極大的恐慌,老刑警劉巖傀履,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虱朵,死亡現(xiàn)場離奇詭異,居然都是意外死亡钓账,警方通過查閱死者的電腦和手機碴犬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梆暮,“玉大人翅敌,你說我怎么就攤上這事√杼悖” “怎么了蚯涮?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卖陵。 經(jīng)常有香客問我遭顶,道長,這世上最難降的妖魔是什么泪蔫? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任棒旗,我火速辦了婚禮,結(jié)果婚禮上撩荣,老公的妹妹穿的比我還像新娘铣揉。我一直安慰自己,他們只是感情好餐曹,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布逛拱。 她就那樣靜靜地躺著,像睡著了一般台猴。 火紅的嫁衣襯著肌膚如雪朽合。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天饱狂,我揣著相機與錄音曹步,去河邊找鬼。 笑死休讳,一個胖子當(dāng)著我的面吹牛讲婚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俊柔,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筹麸,長吁一口氣:“原來是場噩夢啊……” “哼纳猫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竹捉,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤芜辕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后块差,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侵续,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年憨闰,在試婚紗的時候發(fā)現(xiàn)自己被綠了状蜗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹉动,死狀恐怖轧坎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泽示,我是刑警寧澤缸血,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站械筛,受9級特大地震影響捎泻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埋哟,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一笆豁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赤赊,春花似錦闯狱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爷辱,卻和暖如春录豺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饭弓。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留媒抠,地道東北人弟断。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像趴生,于是被迫代替她去往敵國和親阀趴。 傳聞我的和親對象是個殘疾皇子昏翰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354