溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

function_score 之script_score

發(fā)布時(shí)間:2020-05-12 03:45:03 來(lái)源:網(wǎng)絡(luò) 閱讀:1767 作者:大海之中 欄目:開發(fā)技術(shù)


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ō)明


function_score 之script_score


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í)

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI