国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ElasticSearch[八]:自定義評分功能、使用場景講解以及 function_score常用的字段解釋

這篇具有很好參考價值的文章主要介紹了ElasticSearch[八]:自定義評分功能、使用場景講解以及 function_score常用的字段解釋。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

ElasticSearch[八]:自定義評分

一、適用的場景

  • 基本介紹

ES 的使用中,ES 會對我們匹配文檔進行相關(guān)度評分。但對于一些定制化的場景,默認評分規(guī)則滿足不了我們的要求。這些定制化場景,ES 也是推出了自定義評分方式來進行支持??梢允褂?ES 提供的一些函數(shù),什么可以使用較分來讓我們的評分規(guī)則多樣化。我舉個大家都很熟悉的場景,在點外賣時候,大家是不是有一個綜合排序,比如用戶希望通過距離和價格來進行綜合排序,這在 mysql 中是不是比較難以實現(xiàn),接下來我將由簡到繁的來教你如何在 ES 中實現(xiàn)這種綜合評分排序的功能

1.1 使用場景

1.1.1 根據(jù)價格評分排序

在 mysql 中我們可以通過價格從高到低,從低到高排序,但是像訂酒店那樣,用戶有期望價格的,酒店越符合用戶的期望價格,評分越高。mysql 的排序這時候是不是有點捉襟見肘了。廢話不多說了,直接來 ES 實現(xiàn)。

{
    "from": 0,
    "size": 12,
    "query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "price": {
                                    "value": 50,
                                    "boost": 1.0
                                }
                            }
                        }
                    ],
                    "adjust_pure_negative": true,
                    "boost": 1.0
                }
            },
            "functions": [
                {
                    "filter": {
                        "match_all": {
                            "boost": 1.0
                        }
                    },
                    "gauss": {
                        "price": {
                            "origin": 50,
                            "offset": 0,
                            "scale": "25",
                            "decay": 0.5
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "_score": {
                "order": "desc"
            }
        }
    ]
}

1.1.2 根據(jù)距離評分排序

在我們?nèi)粘J褂玫膱鼍?,我們?jīng)常有需要根據(jù)距離來進行排序評分,常見的 App 中都是有一個距離更近,來篩選商戶。接下來就來看看 ES 的實現(xiàn)。

{
    "from": 0,
    "size": 12,
    "query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "price": {
                                    "value": 50,
                                    "boost": 1.0
                                }
                            }
                        }
                    ],
                    "adjust_pure_negative": true,
                    "boost": 1.0
                }
            },
            "functions": [
                {
                    "filter": {
                        "match_all": {
                            "boost": 1.0
                        }
                    },
                    "gauss": {
                        "location": {
                            "origin": {
                                "lon": 130.380857,
                                "lat": 31.112834
                            },
                            "offset": 0,
                            "scale": "150km",
                            "decay": 0.5
                        }
                    }
                }
            ]
        }
    },
    "sort": [
        {
            "_score": {
                "order": "desc"
            }
        }
    ]
}

1.1.3 根據(jù)距離價格綜合評分排序

上面舉例了兩個單一的場景,要么是價格,要么是距離,那如果想實現(xiàn)復(fù)雜點的場景呢,希望通過距離和價格綜合排序。比如用戶希望訂一個距離虹橋火車站近的,價格 200 左右的酒店。廢話不多說,直接看實現(xiàn)。

{
    "from": 0,
    "size": 12,
    "query": {
        "function_score": {
            "query": {
                "match_all": {
                    "boost": 1.0
                }
            },
            "functions": [
                {
                    "filter": {
                        "match_all": {
                            "boost": 1.0
                        }
                    },
                    "gauss": {
                        "location": {
                            "origin": {
                                "lon": 130.380857,
                                "lat": 31.112834
                            },
                            "scale": "150km",
                            "decay": 0.5
                        },
                        "multi_value_mode": "MIN"
                    },
                    "weight": 1
                },
                {
                    "filter": {
                        "match_all": {
                            "boost": 1.0
                        }
                    },
                    "gauss": {
                        "price": {
                            "origin": 200,
                            "offset": 0,
                            "scale": "25",
                            "decay": 0.5
                        }
                    },
                    "weight": 2
                }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "max_boost": 3.4028235E38,
            "boost": 1.0
        }
    },
    "sort": [
        {
            "_score": {
                "order": "desc"
            }
        }
    ]
}

1.1.4 自定義編寫腳本

像上面都是 ES 提供給我們現(xiàn)成的功能函數(shù),但是,用戶的場景千千萬,總有一個場景這些函數(shù)會不適合。比如,用戶希望酒店的價格的結(jié)尾含 8 的評分更高呢。ES 提供的這些函數(shù)就不起作用了,但 ES 還提供了終極密法。你可以自定義腳本來決定每個文檔的分數(shù)。

{
    "from": 0,
    "size": 12,
    "query": {
        "function_score": {
            "query": {
                "bool": {
                    "must": [
                        {
                            "term": {
                                "price": {
                                    "value": 50,
                                    "boost": 1.0
                                }
                            }
                        }
                    ],
                    "adjust_pure_negative": true,
                    "boost": 1.0
                }
            },
            "functions": [
                {
                    "filter": {
                        "match_all": {
                            "boost": 1.0
                        }
                    },
                    "script_score": {
                        "script": {
                            "source": "doc['price'].size()==0?0:5",
                            "lang": "painless"
                        }
                    }
                }
            ],
            "score_mode": "sum",
            "boost_mode": "replace",
            "max_boost": 3.4028235E38,
            "boost": 1.0
        }
    },
    "sort": [
        {
            "_score": {
                "order": "desc"
            }
        }
    ]
}

二、常用的字段解釋

  • 整體結(jié)構(gòu)

如果需要使用自定義評分,評分查詢結(jié)構(gòu)和正常的查詢結(jié)構(gòu)還是有些區(qū)別的, 分頁和排序和正常的都是一樣的,主要還是 query 內(nèi)的成員,使用的是 function_score。我們來看看圖上圖框住的就是自定義評分需要使用的特定的查詢結(jié)構(gòu)??纯蠢锩媸遣皇沁€有很多成員,接下來我一一為大家介紹這些成員的含義。

ElasticSearch[八]:自定義評分功能、使用場景講解以及 function_score常用的字段解釋,Elastic search,elasticsearch,大數(shù)據(jù),全文檢索,搜索引擎,自然語言處理,人工智能,NLP

2.1 function_score

2.1.1 query

function_score 第一個成員 query,這個就和大家平時用的一樣,篩選符合條件的結(jié)果,并把這個結(jié)果用作后面的評分函數(shù)的數(shù)據(jù)來源,我們來看看它內(nèi)部的結(jié)構(gòu)。下圖框中,目的是為了查詢 price 為 50 的結(jié)果

ElasticSearch[八]:自定義評分功能、使用場景講解以及 function_score常用的字段解釋,Elastic search,elasticsearch,大數(shù)據(jù),全文檢索,搜索引擎,自然語言處理,人工智能,NLP

2.1.2 functions

functions,也是我們使用評分函數(shù)和編寫腳本的地方,他的值是一個數(shù)組,也就是我們使用多個函數(shù)來進行綜合評分,還可以對每個評分進行權(quán)重控制,主要有以下幾個值

  • filter

    filter 主要通過條件匹配結(jié)果作用在當(dāng)前函數(shù)上

  • weight

weight 當(dāng)前函數(shù)的權(quán)重,函數(shù)的分值會乘上 weight
  • ES 提供的幾種評分模式,是腳本還是隨機等

    1. 衰減函數(shù):
    先看看官方的圖,衰減函數(shù)的作用機制, 我們可以設(shè)定一個期望值,越接近期望值的分越高,分值在 0-1 之間,分別有三條對應(yīng)的函數(shù)曲線 linear 、 exp 和 gauss (線性、指數(shù)和高斯函數(shù))
    ElasticSearch[八]:自定義評分功能、使用場景講解以及 function_score常用的字段解釋,Elastic search,elasticsearch,大數(shù)據(jù),全文檢索,搜索引擎,自然語言處理,人工智能,NLP

    原點(origin):期望值,這個值可以得到滿分(1.0)
    偏移量(offset):與原點相差在偏移量之內(nèi)的值也可以得到滿分
    衰減規(guī)模(scale):當(dāng)值超出了原點到偏移量這段范圍,它所得的分數(shù)就開始進行衰減了,衰減規(guī)模需配合衰減值一起使用。比如衰減規(guī)模是 500 米,衰減值是 0.5,那么在 500 米的時候分值就是 0.5,具體衰減速率由函數(shù)曲線決定
    衰減值(decay):該字段可以被接受的值(默認為 0.5),相當(dāng)于一個分界點,具體的效果與衰減的模式有關(guān)

    2. script_score:自定義腳本評分, 主要就是我們編寫腳本的地方

描述
source 就是我們需要填寫腳本的地方
lang 使用的腳本語言,幾個可選值對應(yīng)相應(yīng)的開發(fā)語言

3. random_score:隨機得到 0 到 1 分數(shù)
4. field_value_factor:將某個字段的值進行計算得出分數(shù)。

2.1.3 score_mode

score_mode,主要是控制我們多個評分函數(shù)之間如何運算的,比如 function_score 第一個元素會對結(jié)果進行評分,第二元素也會對結(jié)果進行評分,我們通過參數(shù)來控制這兩個的評分是相加還是別的操作,這最終得出來的分值也稱為功能分值。有以下幾個可選值

函數(shù)名 描述
max 使用最高分
first 使用第一個評分函數(shù)的分值
multiply 多個評分函數(shù)分值相乘(默認)
avg 多個評分函數(shù)分值的平均值
sum 多個評分函數(shù)分值的分數(shù)和
min 使用最小分

2.1.4 boost_mode

boost_mode,控制的是查詢分值(下圖框起來的 1 的部分)和功能分值(下圖框起來的 2 的部分)是如何運算的。有以下幾個可選值

ElasticSearch[八]:自定義評分功能、使用場景講解以及 function_score常用的字段解釋,Elastic search,elasticsearch,大數(shù)據(jù),全文檢索,搜索引擎,自然語言處理,人工智能,NLP

函數(shù)名 描述
max 使用查詢分數(shù)和功能分數(shù)里最大值
replace 使用功能分數(shù),查詢分數(shù)將被忽略
multiply 使用查詢分數(shù)和功能分數(shù)相乘(默認)
avg 使用查詢分數(shù)和功能分數(shù)平均值
sum 使用查詢分數(shù)和功能分數(shù)和
min 使用查詢分數(shù)和功能分數(shù)里最小值

三、通過 ESJavaApi 實現(xiàn)自定義評分功能

public static void main(String[] args) {
        /**構(gòu)建functions**/
        FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[2];
        //第一個評分函數(shù),gauss
        Map<String, Double> locationMap = new HashMap<String, Double>();
        locationMap.put("lat", 130.11);
        locationMap.put("lon", 12.12);
        ScoreFunctionBuilder gaussFunctionByLocation = ScoreFunctionBuilders.gaussDecayFunction("location", locationMap, "150km", 0, 0.5);
        filterFunctionBuilders[0] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(gaussFunctionByLocation);
        //第二個評分函數(shù),自定義評分
        String scriptLang = "painless";
        String script = "doc['price'].size()==0?0:5";
        ScriptScoreFunctionBuilder scriptFunction = ScoreFunctionBuilders.scriptFunction(new Script(Script.DEFAULT_SCRIPT_TYPE, scriptLang, script, Collections.emptyMap(), Collections.emptyMap()));
        filterFunctionBuilders[1] = new FunctionScoreQueryBuilder.FilterFunctionBuilder(scriptFunction);

        /**function_score**/
        //構(gòu)建query
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //設(shè)置query,functions
        FunctionScoreQueryBuilder functionScoreQueryBuilder = new FunctionScoreQueryBuilder(boolQueryBuilder, filterFunctionBuilders);
        //設(shè)置boostMode
        functionScoreQueryBuilder.boostMode(CombineFunction.REPLACE);
        //設(shè)置scoreMode
        functionScoreQueryBuilder.scoreMode(FunctionScoreQuery.ScoreMode.SUM);

        //設(shè)置分頁排序
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.from(0);
        sourceBuilder.size(12);
        sourceBuilder.sort("price", SortOrder.ASC);
        
        //執(zhí)行
        SearchRequest searchRequest = new SearchRequest("index_name");
        searchRequest.source(sourceBuilder);
    }

參考鏈接:

https://blog.csdn.net/qq_51641196/article/details/130074051?spm=1001.2014.3001.5502

https://blog.csdn.net/W2044377578/article/details/128636611文章來源地址http://www.zghlxwxcb.cn/news/detail-820889.html

到了這里,關(guān)于ElasticSearch[八]:自定義評分功能、使用場景講解以及 function_score常用的字段解釋的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++引用的相關(guān)定義以及使用場景與指針之前的區(qū)別

    C++引用的相關(guān)定義以及使用場景與指針之前的區(qū)別

    ??博客主頁: 主頁 ??系列專欄: C++ ??感謝大家點贊??收藏?評論?? ??期待與大家一起進步! 引用不是新定義一個變量,而是給已存在變量取了一個別名,編譯器不會為引用變量開辟內(nèi)存空間,它和它引用的變量共用同一塊內(nèi)存空間。 引用的特性: 引用在定義時必

    2024年02月03日
    瀏覽(27)
  • IDA的詳細使用指南以及核心功能講解

    IDA的詳細使用指南以及核心功能講解

    首先打開網(wǎng)頁搜索吾愛破解,進入吾愛破解官網(wǎng),找到逆向資源區(qū)欄目 在該欄目中找到IDA軟件資源 點擊進入,獲取網(wǎng)盤地址以及提取碼 進入網(wǎng)盤進行下載 下載好之后打開壓縮包,將可執(zhí)行文件添加桌面快捷方式 此時即可點擊使用IDA軟件 2.1、打開與關(guān)閉 打開:我們雙擊ID

    2024年02月02日
    瀏覽(20)
  • 詳細講解Docker架構(gòu)的原理、功能以及如何使用

    詳細講解Docker架構(gòu)的原理、功能以及如何使用

    LXC為Linux Container的簡寫??梢蕴峁┹p量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復(fù)雜性。相當(dāng)于C++中的NameSpace。容器有效地將由單個操作系統(tǒng)管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有沖突的資源使用需求。

    2024年03月21日
    瀏覽(22)
  • 設(shè)計模式之-訪問者模式,快速掌握訪問者模式,通俗易懂的講解訪問者模式以及它的使用場景

    當(dāng)談到訪問者模式時,我們可以通過以下方式進行詳細解釋: 訪問者模式是一種行為型設(shè)計模式,它允許你在不修改已有代碼的情況下,向現(xiàn)有對象結(jié)構(gòu)添加新的操作。該模式將操作(或方法)封裝在稱為訪問者的獨立對象中,使得可以在不修改元素類的情況下,通過訪問者

    2024年02月03日
    瀏覽(27)
  • Cheat Enginee(CE)的詳細使用指南~包含下載安裝教程以及核心功能講解

    Cheat Enginee(CE)的詳細使用指南~包含下載安裝教程以及核心功能講解

    首先:搜索并且進入官網(wǎng),點擊DownLoad按鈕 選擇下載路徑:(根據(jù)自己計算機的實際情況進行下載) 下載完成后運行exe安裝文件,并選擇自己熟悉的語言,點擊OK進入安裝程序 點擊NEXT按鈕,繼續(xù)安裝 進入到ce修改器(Cheat Engine)許可協(xié)議界面,點擊Accept按鈕,同意協(xié)議 下載產(chǎn)品

    2024年02月01日
    瀏覽(32)
  • 微信小程序:自定義多選框樣式,實現(xiàn)多選、全選功能,以及使用css實現(xiàn)選中打鉤效果
  • 進階 vue自定義指令 vue中常用自定義指令以及應(yīng)用場景,案例書寫

    進階 vue自定義指令 vue中常用自定義指令以及應(yīng)用場景,案例書寫

    除了 Vue 內(nèi)置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 還允許你注冊自定義的指令 (Custom Directives)。 我們已經(jīng)介紹了兩種在 Vue 中重用代碼的方式:組件和組合式函數(shù)。組件是主要的構(gòu)建模塊,而組合式函數(shù)則側(cè)重于有狀態(tài)的邏輯。另一方面,自定義指令主要是為了重用涉

    2024年02月15日
    瀏覽(21)
  • C++數(shù)據(jù)封裝以及定義結(jié)構(gòu)的詳細講解鴨~

    名字:阿玥的小東東 ? 博客主頁:阿玥的小東東的博客_CSDN博客-pythonc++高級知識,過年必備,C/C++知識講解領(lǐng)域博主 目錄 定義結(jié)構(gòu) 訪問結(jié)構(gòu)成員 結(jié)構(gòu)作為函數(shù)參數(shù)

    2024年02月04日
    瀏覽(23)
  • ElasticSearch應(yīng)用場景以及技術(shù)選型[ES系列] - 第496篇

    ElasticSearch應(yīng)用場景以及技術(shù)選型[ES系列] - 第496篇

    歷史文章( 文章 累計490+) 《國內(nèi)最全的Spring?Boot系列之一》 《國內(nèi)最全的Spring?Boot系列之二》 《國內(nèi)最全的Spring?Boot系列之三》 《國內(nèi)最全的Spring?Boot系列之四》 《國內(nèi)最全的Spring?Boot系列之五》 《國內(nèi)最全的Spring?Boot系列之六》 Mybatis-Plus自動填充功能配置和使用 [

    2024年02月04日
    瀏覽(20)
  • 什么是DTU? DTU的工作原理講解以及無線透傳技術(shù)在物聯(lián)網(wǎng)行業(yè)的發(fā)展和應(yīng)用場景

    什么是DTU? DTU的工作原理講解以及無線透傳技術(shù)在物聯(lián)網(wǎng)行業(yè)的發(fā)展和應(yīng)用場景

    一、什么是DTU? 廣義上的D TU是數(shù)據(jù)傳輸單元(Data Transfer Unit)的縮寫 , 在物聯(lián)網(wǎng)通訊行業(yè), DTU是 一種專門用于將串口數(shù)據(jù)轉(zhuǎn)換為IP數(shù)據(jù)或?qū)P數(shù)據(jù)轉(zhuǎn)換為串口數(shù)據(jù),并通過無線通信網(wǎng)絡(luò)進行傳輸?shù)臒o線終端設(shè)備 。 二、DTU 的工作原理講解 DTU 是一種無線通訊模塊,它利用無

    2024年02月03日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包