请求
GET http://127.0.0.1:9200/user/user5/_search
一、match
{"query": {"match": {"name" : "中华人民共和国"}}}
上面的查询会先对内容进行分词,分词以后所有包含这分词中的一个或多个的文档就会被搜索出来。并且根据lucene的评分机制(TF/IDF)来进行评分。
二、match_phrase
{"query": {"match_phrase": {"name" : "中华人民共和国"}}}
精确匹配所有同时包含所有分词的文档
完全匹配可能比较严,我们会希望有个可调节因子,少匹配一个也满足,那就需要使用到slop。
{"query": {"match_phrase": {"name": {"query": "中华人民共和国","slop": 1}}}}
三、multi_match
{"query": {"multi_match": {"query" : "中华人民共和国","fields" : ["title", "content"]}}}
如果我们希望两个字段进行匹配,其中一个字段匹配分词,文档就满足,使用multi_match
type
best_fields
完全匹配的文档占的评分比较高,则需要使用best_fields,
{"query": {"multi_match": {"query": "中华人民共和国","type": "best_fields","fields": ["tag","content"],"tie_breaker": 0.3}}
most_fields
希望越多字段匹配的文档评分越高,就要使用most_fields
{"query": {"multi_match": {"query": "中华人民共和国","type": "most_fields","fields": ["tag","content"]}}
cross_fields
希望这个词条的分词词汇是分配到不同字段中的,那么就使用cross_fields
{"query": {"multi_match": {"query": "中华人民共和国","type": "cross_fields","fields": ["tag","content"]}}
四、term
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
{"query": {"term": {"name" : "中华人民共和国"}}}
五、bool
联合查询,多条件匹配
- must: 文档必须完全匹配条件
- should: should下面会带一个以上的条件,至少满足一个条件,这个文档就符合should
- must_not: 文档必须不匹配条件
{"query": {"bool": {"must": {"term": {"name" : "中华人民共和国"}},"must_not": {"term": {"title" : "中华人民共和国"}}}}}
六、match_all
全部搜索
{"query": {"match_all": {"name" : "中华人民共和国"}}}
七、Query Filter
可以对搜索结果进行过滤
{"query": {"bool": {"must": [{"match": {"name" : "中华人民共和国"}}],"filter": {"range": {"price": {"gt": 4000}}}}}}
