八 tie_breaker參數優化dis_max

案例:搜索title或content中包含java beginner的帖子

GET /forum/article/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "java beginner" }},
                { "match": { "body":  "java beginner" }}
            ]
        }
    }
}

可能出現的場景如下:

(1)某個帖子,doc1,title中包含java,content不包含java beginner任何一個關鍵詞
(2)某個帖子,doc2,content中包含beginner,title中不包含任何一個關鍵詞
(3)某個帖子,doc3,title中包含java,content中包含beginner
(4)最終搜索,可能出來的結果是,doc1和doc2排在doc3的前面,而不是我們期望的doc3排在最前面

dis_max,只是取分數最高的那個query的分數,對於(1)(2)(3)這三個場景,dis_max的值是一樣的,所以可能出現(4)的結果。

 

使用tie_breaker將其他query的分數也考慮進去

tie_breaker參數的意義,在於說,將其他query的分數(即最大分數之外的分數),乘以tie_breaker,然後與最高分數的那個query的分數,綜合在一起進行計算,也就是說,除了取最高分以外,還會考慮其他的query的分數
tie_breaker的值,在0~1之間,是個小數,就ok

GET /forum/article/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "java beginner" }},
                { "match": { "body":  "java beginner" }}
            ],
            "tie_breaker": 0.3
        }
    }
}
 

multi_match案例:

GET /forum/article/_search
{
  "query": {
    "dis_max": {
      "queries":  [
        {
          "match": {
            "title": {
              "query": "java beginner",
              "minimum_should_match": "50%",
          "boost": 2
            }
          }
        },
        {
          "match": {
            "body": {
              "query": "java beginner",
              "minimum_should_match": "30%"
            }
          }
        }
      ],
      "tie_breaker": 0.3
    }
  } 
}

minimum_should_match:控制搜索的精確度,只有匹配一定數量的關鍵詞數據才能返回。作用:去長尾

長尾,比如你搜索5個關鍵詞,但是很多結果是隻匹配1個關鍵詞的,其實跟你想要的結果相差甚遠,這些結果就是長尾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章