Elasticsearch查詢之Disjunction Max Query

前言

Disjunction Max Query 又稱最佳 best_fields 匹配策略,用來優化當查詢關鍵詞出現在多個字段中,以單個字段的最大評分作為文檔的最終評分,從而使得匹配結果更加合理

寫入數據

如下的兩條例子數據:

docId: 1
title: java python go
content: java scaladocId: 2
title: kubernetes docker
content: java spring python

POST test01/doc/_bulk
{ "index" : { "_id" : "1" } }
{ "title" : "kubernetes docker", "content": "java spring python" }
{ "index" : { "_id" : "2" } }
{ "title" : "java python go", "content": "java scala" }

查詢數據

GET test01/_search?
{"query": {"bool": {"should": [{"match": {"title": "java spring"}},{"match": {"content": "java spring"}}]}}
}

結果如下:

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 6,"successful" : 6,"skipped" : 0,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.5753642,"hits" : [{"_index" : "test01","_type" : "doc","_id" : "2","_score" : 0.5753642,"_source" : {"title" : "java python go","content" : "java scala"}},{"_index" : "test01","_type" : "doc","_id" : "1","_score" : 0.5753642,"_source" : {"title" : "kubernetes docker","content" : "java spring python"}}]}
}

可以看到,兩個 doc 的 score 一樣,盡管從內容上看 id=1 的 數據更應該排在前面,但默認的排序策略是有可能會導致id=2 的數據排在 id=1 的前面。

原理分析

在 ES 的默認評分策略下,boolean 查詢的score是所有 should 條件匹配到的評分相加,下面簡化分析一下得分流程,真實評分會比這個復雜,但大致思路一致:

在 id=1 中數據,由于 title 無命中,但 content 匹配到了 2 個關鍵詞,所以得分為 2.

在 id=2 中數據,其 title 命中 1 個關鍵詞 ,并且其 content 也命中一個關鍵詞,所以最后得分也為 2.

從而得出了最終結果兩個 doc 的得分一樣

dis_max 查詢

使用 dis_max查詢優化匹配機制,采用單字段最大評分,作為最終的 score

GET test01/_search?
{"query": {"dis_max": {"queries": [{"match": {"title": "java spring"}},{"match": {"content": "java spring"}}]}}
}

結果如下:

{"took" : 4,"timed_out" : false,"_shards" : {"total" : 6,"successful" : 6,"skipped" : 0,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.5753642,"hits" : [{"_index" : "test01","_type" : "doc","_id" : "1","_score" : 0.5753642,"_source" : {"title" : "kubernetes docker","content" : "java spring python"}},{"_index" : "test01","_type" : "doc","_id" : "2","_score" : 0.2876821,"_source" : {"title" : "java python go","content" : "java scala"}}]}
}

結果已經符合預期了

tie_breaker參數

前面的結果我們看到已經符合預期了,現在如果我們用 dis max 繼續查詢另一種 case:


GET test01/_search?
{"query": {"dis_max": {"queries": [{"match": {"title": "python scala"}},{"match": {"content": "python scala"}}]}}
}

結果如下:

"hits" : [{"_index" : "test01","_type" : "doc","_id" : "2","_score" : 0.2876821,"_source" : {"title" : "java python go","content" : "java scala"}},{"_index" : "test01","_type" : "doc","_id" : "1","_score" : 0.2876821,"_source" : {"title" : "kubernetes docker","content" : "java spring python"}}]

可以看到兩者的評分又一樣了,但從實際來說,我們肯定希望 id = 2 的文檔的得分更高的,因為其在多個字段中都有命中,但因為 dis max的匹配評分機制,又導致忽略了其他字段的評分的貢獻,這個時候就需要進一步優化了,在 dis max 里面可以使用 tie_breaker 參數來控制,tie_breaker的值默認是 0 ,其設置了tie_breaker參數之后,dis max 的工作原理如下:

  1. 從得分最高的匹配子句中獲取相關性得分。
  2. 將任何其他匹配子句的分數乘以 tie_breaker 值。
  3. 將最高分數和其他子句相乘的分數進行累加,得到最終的排序 score 值。

改進后的查詢語句如下:

GET test01/_search?
{"query": {"dis_max": {"queries": [{"match": {"title": "python scala"}},{"match": {"content": "python scala"}}],"tie_breaker": 0.4}}
}

查詢結果:

"hits" : {"total" : 2,"max_score" : 0.40275493,"hits" : [{"_index" : "test01","_type" : "doc","_id" : "2","_score" : 0.40275493,"_source" : {"title" : "java python go","content" : "java scala"}},{"_index" : "test01","_type" : "doc","_id" : "1","_score" : 0.2876821,"_source" : {"title" : "kubernetes docker","content" : "java spring python"}}]}

這樣結果就符合我們的預期了

總結

使用dis max 查詢可以達到 best_fields 匹配的效果,在某些細分的檢索場景下效果更好,但單純的 dis max 查詢會導致忽略其他字段評分貢獻,這種一刀切的機制并不是最優的策略,所以需要配合 tie_breaker 參數,來弱化非 best field 子句的評分貢獻,從而達到最終的優化效果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 Redis 實現分布式限流

基于 Redis 實現分布式限流 一、 簡介二、分布式限流1 數據結構1.1 Redis List1.2 Redis Set1.3 Redis Sorted Set 2 實現分布式限流3 實現原理分析 三、分布式限流算法1. 計數器算法2. 漏斗算法3. 令牌桶算法 四、分布式限流實戰1. 單機限流實現2. 基于Redis Clusters的分布式…

常見程序搜索關鍵字轉碼

個別搜索類的網站因為用戶惡意搜索出現誤攔截情況,這類網站本身沒有非法信息,只是因為把搜索關鍵字顯示在網頁中(如下圖),可以參考下面方法對輸出的關鍵字進行轉碼 DEDECMS程序 本文針對Dedecms程序進行搜索轉碼&…

優先級隊列【C++】

文章目錄 priority_queuepriority_queue 使用priority_queue的模擬實現向上調整算法向下調整算法pushpoptopsizeempty 仿函數完整代碼 priority_queue 優先隊列(priority_queue)也是隊列的一種,priority_queue的接口是和queue的接口是相同的…

快速上手Vue開發:在項目中如何配置 tsconfig.json 文件?

文章目錄 一、簡介二、配置1、示例2、編譯器選項列表 一、簡介 tsconfig.json文件中指定了用來編譯這個項目的根文件和編譯選項。 二、配置 1、示例 {"compilerOptions": {"baseUrl": ".","paths": {"/*": ["src/*&…

C#__基本特性和使用

// 特性(attribute): // 一種允許我們向程序集添加元數據的語言結構 // 用于保存程序結構信息的某種特殊類型的類 // 類似“批注”,用于解釋說明 #define IsShowMessage // 宏定義,在開頭定義&#xff0…

uni-app彈窗列表滾動, 彈框下面的內容也跟隨滾動解決方案

滑動彈窗里的列表,彈框下面的內容也會跟著滑動,導致彈窗中的列表不能正常滾動 1.彈窗組件代碼,需要在最外層的view中加入touchmove.stop.prevent"moveHandle",且彈窗中需要滾動的列表要使用scroll-view標簽包裹起來&…

Python爬蟲——requests_post請求

import requests import jsonurl https://fanyi.baidu.com/sugheaders {User-Agent: ,Cookie: }data {kw: hello }response requests.post(url, data, headersheaders)content response.textobj json.loads(content.encode(utf-8)) print(obj)總結: post請求…

五分鐘搭建生鮮蔬果小程序

如今,隨著移動互聯網的快速發展,小程序已經成為眾多企業和商家推廣產品和服務的重要工具。而生鮮蔬果行業作為一個常見的消費領域,也開始逐漸轉向小程序商城來進行銷售和服務。那么,如何從零開始搭建一個生鮮蔬果小程序商城呢&…

Hlang--用Python寫個解釋器

文章目錄 前言流程數學解釋器結果封裝數的操作運行時異常運行解釋實現總結前言 沒錯今天提前來做這個東西,昨天晚上干這個玩意差不多干了兩個多小時才搞定,導致凌晨2點才睡覺,最要命的是,寫著寫著突然想到有一道線代理解錯了,一個晚上,做夢全是這兩個東西。尤其是晚上效…

LeetCode150道面試經典題-- 快樂數(簡單)

1.題目 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為: 對于一個正整數,每一次將該數替換為它每個位置上的數字的平方和。然后重復這個過程直到這個數變為 1,也可能是 無限循環 但始終變不到 1。如果這個過程 結果為 1&am…

JVM——JVM參數指南

文章目錄 1.概述2.堆內存相關2.1.顯式指定堆內存–Xms和-Xmx2.2.顯式新生代內存(Young Ceneration)2.3.顯示指定永久代/元空間的大小 3.垃圾收集相關3.1.垃圾回收器3.2.GC記錄 1.概述 在本篇文章中,你將掌握最常用的 JVM 參數配置。如果對于下面提到了一些概念比如…

Linux系統之安裝my-mind思維導圖工具

Linux系統之安裝my-mind思維導圖工具 一、my-mind介紹二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹 三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本3.3 檢查端口占用情況 四、安裝httpd4.1 檢查本地yum倉庫4.2 安裝httpd4.3 關閉防火墻和selinux4.4 創建…

arcgis數據采集與拓撲檢查

1、已準備好一張配準好的浙江省行政區劃圖,如下: 2、現在需要繪制湖州市縣級行政區劃。需要右擊文件夾新建文件地理數據庫,如下: 其余步驟均默認即可。 創建好縣級要素數據集后,再新建要素類,命名為縣。 為…

【Java 動態數據統計圖】動態數據統計思路案例(動態,排序,containsKey)五(117)

需求:前端根據后端的返回數據:畫統計圖; 1.動態獲取地域數據以及數據中的平均值,按照平均值降序排序; 說明: X軸是動態的,有對應區域數據則展示; X軸 區域數據降序排序;…

03-第一個Spark程序WordCount

Scala版 1)創建項目 增加 Scala 插件 Spark 由 Scala 語言開發的,咱們當前使用的 Spark 版本為 3.2.0,默認采用的 Scala 編譯版本為 2.13,所以后續開發時。我們依然采用這個版本。開發前請保證 IDEA 開發工具中含有 Scala 開發…

ebay燈串UL報告 UL588檢測標準

季節性和裝飾性照明用品即燈串以及配件都是便攜式插頭連接的臨時性商品,最大額定輸入電壓為 120 伏。 由 ILAC ISO 17025 認證的實驗室出具的檢測報告,確認每件商品均已經過檢測,符合下列要求: 季節性和裝飾性照明用品(燈串&…

企業中商業智能BI,常見的工具和技術

商業智能(Business Intelligence,簡稱BI)數據可視化是通過使用圖表、圖形和其他可視化工具來呈現和解釋商業數據的過程。它旨在幫助組織更好地理解和分析他們的數據,從而做出更明智的商業決策。 常見的商業智能數據可視化工具和技…

AtcoderABC222場

A - Four DigitsA - Four Digits 題目大意 給定一個整數N,其范圍在0到9999之間(包含邊界)。在將N轉換為四位數的字符串后,輸出它。如果N的位數不足四位,則在前面添加必要數量的零。 思路分析 可以使用輸出流的格式設…

鼠標樣式和指向

學習抖音&#xff1a; 渡一前端教科頻道 圖上指針跟著鼠標移動&#xff0c;并且改變方向 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><style>* {padding: 0;margin: 0;}.arrow {position: fixed;width: 3…

Spring Clould 消息隊列 - RabbitMQ

視頻地址&#xff1a;微服務&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; 初識MQ-同步通訊的優缺點&#xff08;P61&#xff0c;P62&#xff09; 同步和異步通訊 微服務間通訊有同步和異步兩種方式&#xff1a; 同步通訊&#xff1a;就像打電話&…