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]两条数据都会被找到