ES 筆記二十:單字串多欄位查詢:Dis Max Query

CrazyZard發表於2019-11-11
  • 單字串查詢
    • Google 只提供一個輸入框,查詢相關的多個欄位
    • 支援按照價格,時間等進行過慮

DEMO

PUT /blogs/_doc/1
{
  "title": "Quick brown rabbits",
  "body": "Brown rabbits are commonly seen."
}
PUT /blogs/_doc/2
{
  "title": "Keeping pets healthy",
  "body": "My quick brown fox eats rabbits on a regular basis."
}
//查詢語句
POST /blogs/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "Brown fox"
          }
        },
        {
          "match": {
            "body": "Brown fox"
          }
        }
      ]
    }
  }
}
  • 查詢should 語句中的兩個查詢
  • 加和兩個查詢的評分
  • 乘以匹配語句的總數
  • 除以所有語句的總數

結果

"hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.90425634,
    "hits" : [
      {
        "_index" : "blogs",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.90425634, // 因為2個欄位都有brown
        "_source" : {
          "title" : "Quick brown rabbits",
          "body" : "Brown rabbits are commonly seen."
        }
      },
      {
        "_index" : "blogs",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.77041256,
        "_source" : {
          "title" : "Keeping pets healthy",
          "body" : "My quick brown fox eats rabbits on a regular basis."
        }
      }
    ]
  }

ES 筆記二十:單字串多欄位查詢:Dis Max Query

ES 筆記二十:單字串多欄位查詢:Dis Max Query

  • 上列中,title 和 body 相互競爭
    • 不應該將分數簡單疊加,而是應該找個單個最佳匹配的欄位的評分
  • Disjunction Max Query
    • 將任何與任一查詢匹配的文件作為結果返回。採用欄位上最匹配的評分返回
POST /blogs/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "title": "Quick fox"
          }
        },
        {
          "match": {
            "body": "Quick fox"
          }
        }
      ]
    }
  }
}

ES 筆記二十:單字串多欄位查詢:Dis Max Query

最佳欄位查詢調優

  • 有一些情況下,同時匹配title 和 body 欄位的文件比只與一個欄位匹配的文件的相關度更高
  • disjunction max query查詢指揮簡單的使用單個最佳匹配語句的評分_scoce 作為整體評分

通過Tie Breaker 引數調整

  • 獲得最佳匹配語句的評分
  • 其他匹配語句的評分 與 tie_breaker 相乘
  • 對以上評分求和並規範化
    • Tie Breanker 是一個介於0-1之間的浮點數。0 代表使用最佳匹配l;1代表所有語句同等重要。
      POST blogs/_search
      {
      "query": {
      "dis_max": {
          "queries": [
              { "match": { "title": "Quick pets" }},
              { "match": { "body":  "Quick pets" }}
          ],
          "tie_breaker": 0.2
      }
      }
      }

相關文章