您好,登錄后才能下訂單哦!
function_score 配合 script_score 是排序的終極方案
例子:
curl -XGET 'http://localhost:9200/*/*/_search?pretty&explain' -d '{
"size" : 0,
"query" : {
"function_score" : {
"query" : {
"filtered" : {
"filter" : {
"bool" : {
"must" : {
"match" : {
"_all" : {
"query" : "關(guān)鍵字",
"type" : "boolean",
"operator" : "AND"
}
}
}
}
}
}
},
"functions" : [ {
"script_score" : {
"params": {
"field": "company_name",
"term": "關(guān)鍵字"
},
"script" : "_index[field][term].df()"
}
} ,
{
"filter" : {
"match" : {
"company_name" : {
"query" : "關(guān)鍵字",
"type" : "boolean",
"operator" : "AND"
}
}
},
"weight" : 2
}
],
"score_mode" : "sum"
}
},
"aggregations" : {
"agg" : {
"terms" : {
"field" : "member_id",
"size" : 0,
"order" : {
"top_hit" : "desc"
}
},
"aggregations" : {
"top_hit" : {
"max" : {
"script" : {
"inline" : "_score"
}
}
}
}
}
}
}'
需要配置:
script.engine.groovy.inline.search: on
script.inline: on
script.indexed: on
script_score可以讓你更加靈活的操作ES的打分。例如
"script_score" : {
"params": {
"field": "company_name",
"terms": ["關(guān)鍵字"]
},
"script" : "score = 0.0; queryLength = 0.0; docLength = 0.0; for (word in terms) { tf = _index[field][word].tf(); score = score + tf * 1.0; queryLength = queryLength + 1.0; docLength = docLength + pow(tf, 2.0); }; return (float)score /(sqrt(docLength) * sqrt(queryLength)); "
}
這里需要注意的是 company_name 這個(gè)字段 不允許分詞,否則這個(gè)近似算法可能有問(wèn)題,個(gè)人感覺script_score 執(zhí)行的時(shí)間比較靠后,此時(shí)分詞階段已經(jīng)結(jié)束,company_name 已經(jīng)被分詞完畢,不是源表中的值了,所以這個(gè)字段不能分詞。 這里例子實(shí)際意義不大,但是看到function_score 還是很強(qiáng)大的。
當(dāng)上面的query內(nèi)容變成如下內(nèi)容時(shí):
"match" : {
"_all" : {
"query" : "關(guān)鍵字",
"type" : "boolean",
"operator" : "AND"
}
}
相關(guān)×××開始啟用。打出的分?jǐn)?shù)算法如下。
score=(weight+script_score)*相關(guān)性分?jǐn)?shù)
而原來(lái)的寫法,打分就是 _index[field][term].df()+weight 的值,因?yàn)橄嚓P(guān)性在filter下都是1。
下面舉例來(lái)說(shuō)明
4.09 是相關(guān)性的分?jǐn)?shù),
6.09=2+4.09 其中 4.09 來(lái)自下面的配置, 很明顯_score=4.09 因?yàn)樯厦嬉呀?jīng)提到了。
"script_score" : {
"script" : "return _score"
}
所以:score=(weight+script_score)*相關(guān)性分?jǐn)?shù)。
至于相關(guān)性的分?jǐn)?shù)如何打出,也很類似,請(qǐng)自行查看資料學(xué)習(xí)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。