該文章同步發佈於:我的部落格
也歡迎關注我的 Facebook 以及 Instagram 接收軟體相關的資訊!
在介紹了 全文搜尋 後,就要來介紹一個一直有看到但卻沒有仔細介紹過的值,就是 _score
,也是資料與搜尋字詞關聯性的評分。
評分在搜尋引擎中是一種很常見的作法,用於評估搜尋的內容和資料之間的相似性或相關性。當使用者輸入搜尋字詞後,搜尋引擎會返回一包資料,這些資料會按照搜尋內容的相關性或配對程度進行排序。
這種排序的方式就是基於每筆資料的評分。
使用者體驗: 使用者進行搜尋時,通常希望最相關的內容優先顯示。評分確保了搜尋結果的水準,使得最相關的資料出現在結果的最上方。
巨大的資料量: 在大型的資料叢集中,許多資料可能都含有搜尋的內容。但是,所有的配對並非都是平等的。有些資料可能只是碰巧地被配對,而其他資料則可能更加具有相關性。評分允許系統更好地區分這些資料。
搜尋的動態性: 不同的搜尋可能會有不同的上下文和意圖。評分機制允許系統根據不同的搜尋上下文和用戶需求動態地調整結果。
搜尋的歧義: 某些搜尋可能在不同的上下文中具有多重意義。例如,搜尋 apple 可能指的是 水果 或是 Apple 公司。評分可以幫助系統基於資料的上下文來確定其相關性。
增加搜尋的靈活性: 全文搜尋允許使用者進行模糊搜尋、使用萬用字元或進行相似詞搜尋。在這些情況下,評分可以幫助確定哪些資料更為相關。
總之,評分在全文搜尋中起到了關鍵的作用,確保使用者得到的結果是最相關的,並且提供了一種方式來區分和排序大量可能配對的資料。
這時候最困難的地方就在於,Elasticsearch ( 以下簡稱 ES ) 是如何去計算這些分數的呢?
ES 現在有使用兩種方式在計算分數,分別是 TF-IDF
以及 BM25
這兩種演算法:
聽起來很像 Elon Musk 會幫小孩取的名字,但其實沒有那麼酷炫也沒有那麼複雜,它是由兩個字詞組成,分別是 TF
以及 IDF
組合而成的算法。
假設一篇文章中關於『 拉麵 』這個字出現了 10 次,那這篇文章的 TF
就會是 10,這是很粗略很簡單地介紹方式,實際上是以出現次數除以這篇文章的總詞數。
用來衡量一個詞是不是太過於『 平凡 』這件事,以中文來說,的
和
這兩個詞,幾乎每一篇文章都會有,所以 IDF
就會讓這些詞的分數變得比較低一些,因為它們對於搜尋的相關性影響不大。
這是 ES 在 5.0 之後的版本預設使用的算法,其實就是 TF-IDF
的進階版,差別在於其配對同一單字越多次後,對於評分的幫助就不會那麼大,用一個最粗略的說法,TF-IDF
針對出現 10 次拉麵給了 10 分,那 BM25
可能只會給到 7 分。
其實就是加入了針對相同單字出現頻率對關聯性的上限限制,不希望相同的單字出現越多次代表越精準,可以看一下下圖,應該能更好的理解:
在資料搜尋的領域中,對搜尋結果進行適當的評分非常重要。其目的在於確保最終的搜尋結果更加貼近用戶的期望,從而提高整體的搜尋效率和準確性。
異質性 (Heterogeneity) 是什麼? Wiki
在資料搜尋中,不同的搜尋詞具有不同的重要性。例如,當一個用戶搜尋 Apple 電腦 時,他們可能更關心 Apple 這個品牌而非 電腦 這一通用字詞。因此,賦予搜尋詞不同的權重可以更精確地捕捉使用者的意圖。
Boosting 是 ES 中的一項功能,允許用戶對搜尋中的某些部分進行加權。透過 boost 參數,用戶可以賦予某些搜尋詞更高的權重,從而影響其在最終評分計算中的比重。
例如,使用 boost 可以確保某一特定的詞語在搜尋過程中獲得更多的重視,從而提高相對應資料的排名。
下方的搜尋,我們讓電影卡司中有 Sandra Bullock 的電影評分變得更高:
// GET /movies/_search
{
"query": {
"bool": {
"must": {
"match": {
"extract": "American"
}
},
"should": {
"match": {
"cast": {
"query": "Sandra Bullock",
"boost": 3
}
}
}
}
}
}
透過學習評分的過程,我理解到,搜尋引擎中的評分不僅僅是一個單純的一個數字,它是搜尋結果的質量和相關性的關鍵。
不同的評分方法和機制都在嘗試解決同一個問題:如何在巨大的資料叢集中找到最相關的資訊。
ES 提供的工具和方法允許我們微調評分機制,以更接近這個目標。
最後,評分只是搜尋引擎中的一部分,但它是確保質量和提高使用者體驗的重要部分。
隨著更多的資料和更複雜的搜尋需求,持續學習和調整評分策略將成為開發者的重要任務。