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]兩條數據都會被找到