日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

OpenSearch-行業算法版文檔排序實踐

用戶對于搜索引擎最關注的兩方面一是召回,即滿足條件的doc全部可以被召回;二是排序,即在滿足條件的文檔中將相關度最高的文檔優先召回。其中,二往往是需要根據用戶的實際業務需求進行調整,因此就需要用戶對OpenSearch-行業算法版在排序方面提供的能力有一定的了解,本文將詳細介紹OpenSearch-行業算法版在排序方面的能力,并且列舉一些常見場景如何通過OpenSearch的排序能力實現。

sort子句與排序策略的關系

簡單來說sort子句在OpenSearch-行業算法版中代表全局排序,而排序策略可以理解為sort子句中的一個層級的排序,排序策略是通過系統內置的函數結合表達式形成一種復雜的文檔算分邏輯來實現用戶復雜的業務場景,但最終參與排序的還是排序策略中表達式算出的最終得分。舉個例子,某個業務希望通過文檔的新舊程度進行排序,同時新舊程度相同的文檔,可以根據文檔的相似程度進行二級排序,此時實現用戶上述需求,就需要通過sort子句同時結合排序策略,假設用戶業務表中有一個字段為create_time,同時檢索的字段為name,則可以在sort子句中加入:

sort=-create_time;-RANK

同時在基礎排序設置static_bm25() 函數,在業務排序中設置text_relevance(name)函數即可。(排序策略的配置步驟可排序策略配置進行參考)。

這里的RANK就表示獲取排序策略的得分,而“-” 表示倒序,“+”表示正序。

系統默認在不配置sort子句的情況下用-RANK作為排序條件,而如果配置了sort子句,在需要排序策略分排序的時候需要顯示的寫入-RANK,否則系統將不會自動引入排序策略分作為排序條件。

為了更形象的表達sort子句和排序策略的關系,這里以一個案例的方式說明:

假設OpenSearch有一個應用,應用結構為:

字段

類型

索引

id

int

關鍵字

name

text

中文通用

age

int

關鍵字

為name設置了一個基礎排序,表達式內容如下:

image

為name設置了一個業務排序,表達式內容如下:

image

同時在檢索時,配置sort子句為:

sort=age;-RANK

打開排序明細查看算分詳情:

image

首先可以看到排序分為13,10000.2259030193,因為sort子句設置的是age;-RANK,因此13表示文檔字段age的值,而10000.2259030193表示排序策略的最終得分,OpenSearch會先根據age的值進行正序排序,age值相同的文檔再根據排序策略的最終得分倒序排序。

再看排序公式:

FirstRank:
expression[static_bm25()], result[0.496452].
SecondRank:
expression[text_relevance(name)], result[0.225903].

FirstRank表示基礎排序得分,SecondRank表示業務排序得分,最終的排序分為10000.2259030193,為什么最終排序策略得分為10000.2259030193而不是[0.496452+0.225903] 在下一節會詳細說明。

由上述現象,可以得出結論:在OpenSearch中sort子句類似于SQL中order by的功能,可以直接通過文檔中的屬性字段進行排序,也支持復雜的排序策略進行算分,而排序策略又有內置的函數支持和算分規則,最終根據sort子句的“+”,“-”,以及排序字段控制文檔排序方式以及文檔得分。

排序策略說明

排序策略打分原理

image

對于排序策略的算分分為兩個階段:基礎排序和業務排序,通過query召回并通過filter過濾后的文檔,首先進入基礎排序,根據基礎排序表達式海選出文檔得分較高的文檔,然后取出TOP N個結果再按照業務排序表達式進行精細算分,最終返回排序策略的最終得分。算分規則如下:

  • 若只配置了基礎排序,則文檔得分為(10000+基礎排序表達式計算的結果),總分最大為20000,超過20000結果仍為20000。

  • 若只配置了業務排序,則文檔得分為(10000+業務排序表達式計算的結果),總分無上限。

  • 若同時配置了基礎排序和業務排序,那么進入業務排序的文檔最終得分為(10000+業務排序表達式計算的結果),其余文檔最終得分為(10000+基礎排序表達式計算的結果,總分最大為20000,超過20000結果仍為20000)。

再結合上一節排序算分為:

FirstRank:
expression[static_bm25()], result[0.496452].
SecondRank:
expression[text_relevance(name)], result[0.225903].

最終得分為10000.2259030193。

通過上述原理,可理解為該命中的doc,在基礎排序階段在召回100W的doc中,參與了基礎排序,通過static_bm25函數算分為0.496452,同時該文檔的基礎排序分正好使該文檔排在了所有命中文檔的前200內,參與了業務排序,在文檔從基礎排序進入業務排序時文檔分會默認加10000分,同時舍棄基礎排序的得分,以業務排序得分+10000分為最終的排序策略得分,由于該文檔在業務排序中通過text_relevance函數算分為0.225903,所以該文檔的最終排序策略得分為10000.2259030193。

業務排序函數用法

注意:以下內置函數中引用到的應用結構中的字段均需要設置為屬性字段,否則會報錯Invalid formula。

函數

描述

案例

i in (value1, value2, …, valuen)

如果i的值在集合[value1, value2, …,valuen]中出現,則該表達式值為1,否則為0。

字段age=5

age in (1,2,3,4,5) # 結果為1

age in (6,7,8,9) # 結果為0

if(cond, then_value, else_value)

如果cond的值非0,則該if表達式的實際值為then_value,否則為else_value。 如if( 2,3, 5)的值為3,if( 0,3,5)的值為5。

字段a=1

if(a==1,5,10) #結果為5

if(1,5,10) #結果為5

if(a==2,5,10) #結果為10

if(0,5,10) #結果為10

random()

返回[0,1]間的一個隨機值。

-

now()

返回當前時間,自Epoch ( 00:00:00 UTC,January 1,1970)開始計算,單位是秒。

-

  • 常用的文本相關性、地理位置、時效性、算法相關性、功能性函數的介紹,可參考業務排序函數。

  • 常用的數學函數可參考排序策略配置-數學函數;

  • 常用的表達式運算符可參考排序策略配置-基本運算

說明

若排序策略的表達式仍無法滿足復雜場景的算分邏輯,可以通過cava插件,編寫腳本進行復雜場景的算分,關于cava插件的使用以及原理此處不再贅述,有興趣的用戶可以參考排序插件開發-Cava語言

常用場景的排序策略配置

1. 比如想根據age>10 的 +10分,age>40的+20分,根據weight>60的+30,最后根據最后得分排序。

實現1

#業務排序表達式設置為:默認是匹配到只加1分
(age>10)*10+(age>40)*20+(weight>60)*30

實現2

#精排表達式設置為:
if(age>10,10,0) + if(age>40,20,0) +if(weight>60,30,0)

2. 比如,xxx公司,xxx杭州分公司,那么“xxx公司”要排在“xxx杭州分公司”的前面。

實現

#可以在業務排序(精排表達式)是里配置field_match_ratioc函數
field_match_ratio(title)

3. 比如搜索 all:'dim_itm_tb',那么“dim_itm_tb”想在“dim_itm_tb_dst_itm_relation_dd”前面。

實現

#可以在業務排序(精排表達式)是里配置field_match_ratioc函數:
field_match_ratio(detail) 

4. 如何實現query = item:"iphone 8" OR item: 'iphone 8' 類似這種查詢呢

實現

#可以在業務排序(精排表達式)是里配置query_min_slide_window函數:
query_min_slide_window(title)

5. 我設置了一個精排 text_relevance,搜索關鍵詞是 "民國",但是不知道為什么 "民國趣聞-民國", "中國民族史-民國" 等要比 "民國" 排序要考前。(需要讓“民國”排在最前面)

實現

#可以在業務排序(精排表達式)是里配置query_min_slide_window函數:
query_min_slide_window(title)

6. 搜索關鍵字在字段內容重復出現,會導致static_bm25()函數重復算分,如果規避這種情況?

實現

#在業務排序里配置query_match_ratio
query_match_ratio(title) 

7. 如何把搜索存在關鍵詞堆積的文檔給排到后面去?

實現

#使用query_term_match_count,定義重復多少次為結果堆積。
if(field_term_match_count(title)>3,1,10)

8.如何配置字符串不為空時增加一定的分數?

實現

可以先在源庫中增加標記字段(mark),如過被判斷字段為空就標記成0,不為空就標記成1。然后在精排表達式中使用if函數進行判斷。
精排表達式設置為:當mark=1時排序分加500
if(mark==1,500,0)

案例分享

函數介紹

在排序階段,我們可以通過在基礎排序階段(粗排)設置static_bm25函數和在業務排序階段(精排)設置text_relevance函數來獲取文本的相關性得分。相關介紹:

  • static_bm25:靜態文本相關性,用戶衡量query與文本的匹配度,值域為[0,1];

  • text_relevance:關鍵詞在字段上的文本匹配度,值域為[0,1]

準備工作

  1. 為了方便展示文本相關性得分對排序的影響,這里準備以下幾條數據,id表示主鍵,name表示文本內容:

id    name
1    黑色幽默,又稱為“黑色喜劇”,是產生于1960年代美國的一個現代主義文學流派
2    《黑色幽默》是周杰倫演唱的一首歌曲
3		 周杰倫,臺灣華語流行歌曲男歌手、音樂家、編曲家、唱片制片人、魔術師。
4    黑夜將至,周圍一切都是黑色的,為了緩解壓抑的氣氛,周杰倫很幽默的說了一個笑話
5    黑色幽默女版(原唱:周杰倫Jay Chou)
6    Jay Chou 周杰倫【黑色幽默 Black Humor】-Official Music Video

2. 創建一個基礎排序和業務排序,名稱分別為test_first_rank_name和test_second_rank_name

image.png

并且在test_first_rank_name中配置static_bm25函數,在test_second_rank_name中配置text_relevance函數。

3. 創建一個查詢分析,名稱為test_qp,并且Query改寫策略設置為OR:

image.png

4. 把“1”中的測試數據上傳至opensearch應用中。

案例分析

案例1

需求:query=title:'黑色幽默周杰倫' ,搜索出最相關的文檔。

分析:用戶的需求是搜索出周杰倫的《黑色幽默》,可以看到測試數據中id=4的name內容里是不相關的,但是term分詞后又都匹配,該文檔會被召回,所以在排序階段需要將此不相關的文檔排到后面去。

操作步驟:完成工作準備中的“2”即可實現。

結果展示

image

案例2

需求:query=title:'黑色幽默周杰倫' ,搜索出最相關的文檔,如果文檔中沒有“周杰倫”相關的率先將“黑色幽默”相關的召回,之后在召回“周杰倫”相關的文檔。

分析:用戶的需求是搜索出周杰倫的《黑色幽默》,可以看到測試數據中id=4的name內容里是不相關的,但是term分詞后又都匹配,該文檔會被召回,所以在排序階段需要將此不相關的文檔排到后面去。

操作步驟:完成工作準備中的“2”和“3”即可實現。

結果展示

image