相關(guān)性算分 | Relevance
- 搜索的相關(guān)性算分,描述了一個(gè)文檔和查詢語(yǔ)句的匹配程度,ES 會(huì)對(duì)每一個(gè)匹配查詢條件的文檔進(jìn)行算分 _score;
- 相關(guān)性算分是一篇文檔針對(duì)某個(gè)關(guān)鍵詞來說的相關(guān)度高低的一個(gè)分?jǐn)?shù);
- 打分的本質(zhì)算排序,需要把最符合用戶需求的文檔排在前面,ES 5 之前,默認(rèn)的相關(guān)性算分采用 TF-IDF,現(xiàn)在采用 BM 25;
詞頻 | TF | Term Frequency
Term Frequency
- 詞在一篇文檔中出現(xiàn)的頻率;
- 詞出現(xiàn)的次數(shù) / 文檔的總詞數(shù)
文檔和關(guān)鍵詞相關(guān)性的簡(jiǎn)單度量方式
- 度量一條查詢和結(jié)果文檔相關(guān)性的簡(jiǎn)單方法:簡(jiǎn)單的將文檔中每一個(gè)關(guān)鍵詞的 TF 相加,比如搜索的關(guān)鍵詞為:"區(qū)塊鏈 的 應(yīng)用",那么一篇文檔和關(guān)鍵詞的相關(guān)性 = TF(區(qū)塊鏈)+ TF(的)+ TF(應(yīng)用);
Stop Word
- “的”在文檔中出現(xiàn)了很多次,但是對(duì)貢獻(xiàn)相關(guān)度幾乎沒有用處,不應(yīng)該考慮這樣的 TF;
逆文檔頻率 | IDF
DF | Document Frequency
- 檢索詞在文檔中出現(xiàn)的頻率;
- “區(qū)塊鏈”在相對(duì)少的在文檔中出現(xiàn);
- “應(yīng)用”在相對(duì)比較多的文檔中出現(xiàn);
- “Stop Word”在大量的文檔中出現(xiàn);
IDF | Inverse Document Frequency
- 簡(jiǎn)單說 = log(全部文檔數(shù) / 檢索詞出現(xiàn)過的文檔數(shù));
- IDF 可以衡量出關(guān)鍵詞的重要程度,IDF 值越大的關(guān)鍵詞越重要;
TF - IDF
- TF-IDF 本質(zhì)上就是將 TF 求和變成了加權(quán)求和:TF(區(qū)塊鏈) * IDF(區(qū)塊鏈) + TF(應(yīng)用) * IDF(應(yīng)用) + TF(的) * IDF(的)
TF-IDF | 概念
- TF-IDF 被公認(rèn)為信息檢索領(lǐng)域最重要的發(fā)明;
- 除了在信息檢索,在文獻(xiàn)分類和其他相關(guān)領(lǐng)域有著非常廣泛的應(yīng)用;
BM 25
- 從 ES 5 開始,默認(rèn)算法改為了 BM 25;
- 和經(jīng)典的 TF-IDF 相比,當(dāng) TF 無限增加時(shí),BM 25 算分會(huì)趨于一個(gè)數(shù)值;
- 在創(chuàng)建索引的時(shí)候,可以對(duì)相關(guān)性的算分做定制;
BM 25 | 實(shí)例分析一下
Boost 是啥
- 放大因子,默認(rèn)是 2.2;
- 文檔中一個(gè)字段的得分:
TF * IDF * Boost; - 不同的字段的重要性是不同的,比如 movie 的 title 和 overview 字段,通常認(rèn)為 title
字段在搜索的算分中的地位更重要,那么就可以放大 title 的 Boost,title 一旦命中后,更大的 Boost 使得 title 字段的算分更高,可以這樣用:
GET /movie/_search
{
"query":{
"multi_match":{
"query":"basketball with cartoom aliens",
"fields:"["title^10","overview"]
}
}
}
IDF 的計(jì)算公式
IDF = log(1 + (N - n + 0.5) / (n + 0.5) )
- N:有指定字段的文檔的數(shù)量;
- n:包含關(guān)鍵詞的文檔數(shù);
TF 的計(jì)算公式
tf = freq / (freq + k1 * (1 - b + b * dl / avgdl ) )
- freq:關(guān)鍵詞在字段中出現(xiàn)的次數(shù);
- k1
- b
- dl:字段的長(zhǎng)度;
- avgdl:字段的平均長(zhǎng)度;
TF - IDF | 舉幾個(gè)例子
數(shù)據(jù)準(zhǔn)備
PUT testscore
{
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"content": {
"type": "text"
}
}
}
}
PUT testscore/_bulk
{ "index": { "_id": 1 }}
{ "content":"we use Elasticsearch to power the search" }
{ "index": { "_id": 2 }}
{ "content":"we like elasticsearch" }
{ "index": { "_id": 3 }}
{ "content":"The scoring of documents is caculated by the scoring formula" }
{ "index": { "_id": 4 }}
{ "content":"you know, for search" }
id 為 2 的文檔出現(xiàn)在 1 的前面
- 兩個(gè)文檔的 IDF 都是 log(4/2);
- id 為 1 的文檔的 TF 是 1/7;id 為 2 的文檔的 TF 是 1/3;所以 id 為 2 的文檔的 TF-IDF 比 1 的高,所以排在了前面;
POST /testscore/_search
{
"query": {
"match": {
"content": "elasticsearch"
}
}
}
通過 explain 查看 ES 對(duì)相關(guān)性算分中每個(gè)參數(shù)的計(jì)算結(jié)果
POST /testscore/_search
{
"explain": true,
"query": {
"match": {
"content": "elasticsearch"
}
}
}
Boosting Relevance
- Boosting 是控制相關(guān)度的一種手段,在索引、字段或子查詢中都可以設(shè)置 Boosting 的值;
參數(shù) boost 的含義
- 當(dāng) boost > 1 時(shí),打分的相關(guān)度相對(duì)提升;
- 當(dāng) 0 < boost < 1 時(shí),打分的權(quán)重相對(duì)性降低;
- 當(dāng) boost > 0 時(shí),貢獻(xiàn)負(fù)分;
舉個(gè)栗子
POST testscore/_search
{
"query": {
"boosting" : {
"positive" : {
"term" : {
"content" : "elasticsearch"
}
},
"negative" : {
"term" : {
"content" : "like"
}
},
"negative_boost" : 0.2
}
}
}