其他閱讀:https://www.elastic.co/guide/cn/elasticsearch/guide/current/query-time-boosting.html 查詢時權重提升
https://www.elastic.co/guide/cn/elasticsearch/guide/current/function-score-filters.html 過濾集提升權重
當然 bool 查詢不僅限於組合簡單的單個詞 match 查詢,它可以組合任意其他的查詢,以及其他 bool 查詢。普遍的用法是通過匯總多個獨立查詢的分數,從而達到為每個文檔微調其相關度評分 _score 的目的。
假設想要查詢關於 “full-text search(全文搜索)” 的文檔,但我們希望為提及 “Elasticsearch” 或 “Lucene” 的文檔給予更高的 權重 ,這里 更高權重 是指如果文檔中出現 “Elasticsearch” 或 “Lucene” ,它們會比沒有的出現這些詞的文檔獲得更高的相關度評分 _score ,也就是說,它們會出現在結果集的更上面。
一個簡單的 bool 查詢 允許我們寫出如下這種非常復雜的邏輯:
GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": "Elasticsearch" }}, { "match": { "content": "Lucene" }} ] } } }
should 語句匹配得越多表示文檔的相關度越高。目前為止還挺好。
但是如果我們想讓包含 Lucene 的有更高的權重,並且包含 Elasticsearch 的語句比 Lucene 的權重更高,該如何處理?
我們可以通過指定 boost 來控制任何查詢語句的相對的權重, boost 的默認值為 1 ,大於 1 會提升一個語句的相對權重。所以下面重寫之前的查詢:
GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": { "query": "Elasticsearch", "boost": 3 } }}, { "match": { "content": { "query": "Lucene", "boost": 2 } }} ] } } }
boost 參數被用來提升一個語句的相對權重( boost 值大於 1 )或降低相對權重( boost 值處於 0 到 1 之間),但是這種提升或降低並不是線性的,換句話說,如果一個 boost 值為 2 ,並不能獲得兩倍的評分 _score 。
相反,新的評分 _score 會在應用權重提升之后被 歸一化 ,每種類型的查詢都有自己的歸一算法,細節超出了本文的范圍,所以不作介紹。簡單的說,更高的 boost 值為我們帶來更高的評分 _score 。
如果不基於 TF/IDF 要實現自己的評分模型,我們就需要對權重提升的過程能有更多控制,可以使用 function_score 查詢操縱一個文檔的權重提升方式而跳過歸一化這一步驟。
參考文章:
https://www.elastic.co/guide/cn/elasticsearch/guide/current/function-score-query.html
https://blog.csdn.net/JineD/article/details/109106049
