ES boost細粒度搜索及multi-field搜索策略最佳實踐深刻剖析-搜索系統線上實戰

專一於大數據及容器雲核心技術解密,可提供全棧的大數據+雲原平生臺諮詢方案,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何學術交流,可隨時聯繫。詳情請關注《數據雲技術社區》公衆號。java

1 製造數據

POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"content" : "i like to write best elasticsearch article"} }
{ "update": { "_id": "2"} }
{ "doc" : {"content" : "i think java is the best programming language"} }
{ "update": { "_id": "3"} }
{ "doc" : {"content" : "i am only an elasticsearch beginner"} }
{ "update": { "_id": "4"} }
{ "doc" : {"content" : "elasticsearch and hadoop are all very good solution, i am a beginner"} }
{ "update": { "_id": "5"} }
{ "doc" : {"content" : "spark is best big data solution based on scala ,an programming language similar to java"} }
複製代碼

2 搜索條件的權重boost

  • 搜索標題中包含java的帖子,同時呢,若是標題中包含hadoop或elasticsearch就優先搜索出來,同時呢,若是一個帖子包含java hadoop,一個帖子包含java elasticsearch,包含hadoop的帖子要比elasticsearch優先搜索出來。
  • 默認狀況下,搜索條件的權重都是同樣的,都是1。
GET /forum/article/_search 
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "blog"
          }
        }
      ],
      "should": [
        {
          "match": {
            "title": {
              "query": "java"
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "hadoop"
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "elasticsearch"
            }
          }
        },
        {
          "match": {
            "title": {
              "query": "spark",
              "boost": 5
            }
          }
        }
      ]
    }
  }
}
複製代碼

3 multi-field搜索弊端及best fields策略

  • multi-field搜索,多字段搜索
GET /forum/article/_search
{
    "query": {
        "bool": {
            "should": [
                { "match": { "title": "java solution" }},
                { "match": { "content":  "java solution" }}
            ]
        }
    }
}
複製代碼
  • best fields策略,表示搜索到的結果,應該是某一個field中匹配到了儘量多的關鍵詞被排在前面;而不是儘量多的field匹配到了少數的關鍵詞,排在了前面
  • dis_max語法,直接取多個query中,分數最高的那一個query的分數便可。
GET /forum/article/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "java solution" }},
                { "match": { "content":  "java solution" }}
            ]
        }
    }
}

dis_max語法,直接取多個query中,分數最高的那一個query的分數便可

{ "match": { "title": "java solution" }},針對doc4,是有一個分數的,1.1
{ "match": { "content":  "java solution" }},針對doc4,也是有一個分數的,1.2
取最大分數,1.2

{ "match": { "title": "java solution" }},針對doc5,是沒有分數的
{ "match": { "content":  "java solution" }},針對doc5,是有一個分數的,2.3
取最大分數,2.3
複製代碼
  • doc4的分數 = 1.2 < doc5的分數 = 2.3,因此doc5就能夠排在更前面的地方,符合咱們的須要

4 multi-field搜索弊端及tie_breaker策略

  • tie_breaker參數的意義,在於將其餘query的分數,乘以tie_breaker,而後綜合與最高分數的那個query的分數,綜合在一塊兒進行計算
  • 除了取最高分之外,還會考慮其餘的query的分數,tie_breaker的值,在0~1之間,是個小數。
GET /forum/article/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "java beginner" }},
                { "match": { "body":  "java beginner" }}
            ],
            "tie_breaker": 0.3
        }
    }
}
複製代碼

5 multi-field搜索及minimum_should_match策略

  • 長尾,好比你搜索5個關鍵詞,可是不少結果是隻匹配1個關鍵詞的,其實跟你想要的結果相差甚遠,這些結果就是長尾 minimum_should_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
    }
  } 
}
複製代碼

6 multi_match搜索規範

  • ^2表示boost爲2,提高分數權重
GET /forum/article/_search
{
  "query": {
    "multi_match": {
        "query":                "java solution",
        "type":                 "best_fields", 
        "fields":               [ "title^2", "content" ],
        "tie_breaker":          0.3,
        "minimum_should_match": "50%" 
    }
  } 
}
複製代碼

7 總結

專一於大數據及容器雲核心技術解密,可提供全棧的大數據+雲原平生臺諮詢方案,請持續關注本套博客。QQ郵箱地址:1120746959@qq.com,若有任何學術交流,可隨時聯繫。詳情請關注《數據雲技術社區》公衆號。bash

相關文章
相關標籤/搜索