Elasticsearch不同的搜尋型別之間的區別
阿新 • • 發佈:2018-12-01
1、match 輕量級搜尋
{
"query": {
"match": {
"title": "王陽明"
}
}
}
上面的查詢匹配就會進行分詞,比如"王陽明"會被ik分詞器分為"王陽明" ,“陽明”, “王”,“陽”,“明” 那麼所有包含這些詞中的一個或多個的文件就會被搜尋出來。並且根據lucene的評分機制(TF/IDF)來進行評分。
2、match_phrase 短語搜尋
{
"query": {
"match_phrase": {
"title": "王陽明"
}
}
}
match_phrase要求只匹配上"王陽明"這個短語,完全匹配可能比較嚴,我們會希望有個可調節因子,少匹配一個也滿足,那就需要使用到slop
{
"query": {
"match_phrase": {
"title" : {
"query" : "王陽明",
"slop" : 1
}
}
}
}
3、multi_match 多欄位匹配
如果我們希望兩個或兩個以上的欄位進行匹配,其中一個欄位能匹配上就滿足的話,使用multi_match
{ "query": { "multi_match": { "query": "王陽明第三卷", "fields": [ "title", "keywords", "author" ] } } }
multi_match中有三種類型即: best_fields 、 most_fields 和 cross_fields (最佳欄位、多數字段、跨欄位)
(1) 我們希望完全匹配的文件佔的評分比較高,則需要使用best_fields,multi_match預設是best_fields
{ "query": { "multi_match": { "query": "王陽明", "fields": [ "title", "yearAlias" ], "minimum_should_match": "70%" } } }
(2) 我們希望越多欄位匹配的文件評分越高,就要使用most_fields
{
"query": {
"multi_match": {
"query": "王陽明",
"type": "most_fields",
"fields": [
"title",
"keywords"
]
}
}
}
(3) 我們會希望這個詞條的分詞詞彙是分配到不同欄位中的,那麼就使用cross_fields
{
"query": {
"multi_match": {
"query": "王陽明",
"fields": [
"title",
"keywords"
],
"type": "cross_fields"
}
},
"highlight": {
"fields": {
"title": {
"pre_tags": ["<a>" ],
"post_tags": [ "</a>"]
},
"keywords": {
"pre_tags": ["<b>" ],
"post_tags": ["</b>" ]
}
}
}
}
上面查詢語句中,包含了高亮顯示結果屬性:highligt
4、term 精確值查詢
{
"query": {
"term": {
"title": "王陽明"
}
}
}
與match查詢類似,但term是精確查詢,代表完全匹配,即不進行分詞器分析,文件中必須包含整個搜尋的詞彙,但是 term 和 terms 是 必須包含(must contain) 操作,而不是必須精確相等(must equal exactly),當查詢 jack 時,[jack] 和[jack,jone]兩條資料都會被找到