Elasticsearch 不同的搜索類型之間的區別


1、match   輕量級搜索

 

1 GET /wymlib/_search
2 
3 {
4   "query": {
5     "match": {
6        "title": "王陽明"
7     }
8   }
9 }

上面的查詢匹配就會進行分詞,比如"王陽明"會被ik分詞器分為"王陽明" ,"陽明", "王","陽","明" 那么所有包含這些詞中的一個或多個的文檔就會被搜索出來。並且根據lucene的評分機制(TF/IDF)來進行評分。

 

2、match_phrase   短語搜索

 

1 GET   /wymlib/_search
2 
3 {
4   "query": {
5     "match_phrase": {
6       "title": "王陽明"
7     }
8   }
9 }

match_phrase要求只匹配上"王陽明"這個短語,完全匹配可能比較嚴,我們會希望有個可調節因子,少匹配一個也滿足,那就需要使用到slop

 1 {
 2   "query": {
 3     "match_phrase": {
 4         "title" : {
 5             "query" : "王陽明",
 6             "slop" : 1
 7         }
 8     }
 9   }
10 }

 

3、multi_match   多字段匹配

 

如果我們希望兩個或兩個以上的字段進行匹配,其中一個字段能匹配上就滿足的話,使用multi_match

 1 {
 2   "query": {
 3     "multi_match": {
 4       "query": "王陽明第三卷",
 5       "fields": [  6         "title",
 7         "keywords",
 8         "author"
 9       ]
10     }
11   }
12 }

multi_match中有三種類型即: best_fields 、 most_fields 和 cross_fields (最佳字段、多數字段、跨字段)

1) 我們希望完全匹配的文檔占的評分比較高,則需要使用best_fields,multi_match默認是best_fields

 1 {
 2   "query": {
 3     "multi_match": {
 4       "query": "王陽明",
 5       "fields": [
 6         "title",
 7         "yearAlias"
 8       ],
 9       "minimum_should_match": "70%"
10     }
11   }
12 }

2) 我們希望越多字段匹配的文檔評分越高,就要使用most_fields

{
  "query": {
    "multi_match": {
      "query": "王陽明",
      "type": "most_fields",
      "fields": [
        "title",
        "keywords"
      ]
    }
  }
}

3) 我們會希望這個詞條的分詞詞匯是分配到不同字段中的,那么就使用cross_fields

 1 {
 2   "query": {
 3     "multi_match": {
 4       "query": "王陽明",
 5       "fields": [
 6         "title",
 7         "keywords"
 8       ],
 9       "type": "cross_fields"
10     }
11   },
12   "highlight": {
13     "fields": {
14       "title": {
15         "pre_tags": ["<a>" ],
16         "post_tags": [ "</a>"]
17       },
18       "keywords": {
19         "pre_tags": ["<b>" ],
20         "post_tags": ["</b>" ]
21       }
22     }
23   }
24 }

上面查詢語句中,包含了高亮顯示結果屬性:highligt

 

4、term 精確值查找

1 {
2   "query": {
3     "term": {
4       "title": "王陽明"
5     }
6   }
7 }

與match查詢類似,但term是精確查找,代表完全匹配,即不進行分詞器分析,文檔中必須包含整個搜索的詞匯,但是 term 和 terms 是 必須包含(must contain) 操作,而不是必須精確相等(must equal exactly),當查詢 jack 時,[jack] 和[jack,jone]兩條數據都會被找到


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM