ES提供了一套基于JSON的查询语言,主要包含两种语句:
叶子查询语句 - 具体条件的查询
组合查询语句 - 用来组合不同查询
12.1 Query and filter context
query语句可以存在于两种场景中:
Query Context - query参数中,出了决定doc是否命中外还会影响doc计算出的_score
Filter Context - filter参数中,只影响是否命中不影响_score计算
12.2 Match All & Match None Query
Match All:
GET /_search { "query": { "match_all": {} } }
Match None:
GET /_search { "query": { "match_none": {} } }
12.3 Full text queries
Match
接受text/numerics/dates,对输入做分词并查询。
GET /_search { "query": { "match" : { "message" : "this is a test" } } }
相比于query_string,match不存在query解析阶段,不支持指定field,wildcards和其他高级语法。不大会失败。
Match Phrase
对输入不分词,作为一个完整短语查询。
GET /_search { "query": { "match_phrase" : { "message" : "this is a test" } } }
Match Phrase Prefix
不分词,作为一个短语,支持以输入为前缀
GET /_search { "query": { "match_phrase_prefix" : { "message" : "quick brown f" } } }
Multi Match
多个field上进行查询
GET /_search { "query": { "multi_match" : { "query": "this is a test", "fields": [ "subject", "message" ] } } }
Query String
对输入做query语法解析,支持复杂的查询语法
GET /_search { "query": { "query_string" : { "default_field" : "content", "query" : "(new york city) OR (big apple)" } } }
Simple Query String
对输入做query语法解析,支持复杂的查询语法,simple_query_string不会抛出任何异常,只忽略非法部分。
12.4 Term Level Queries
Term level查询主要作用于数字、日期、枚举类型的fields上,而不是full texts类型的fields。他们不会对query string做分析,而是直接作用在文档的terms上。
Term/Terms
必须完全匹配指定的terms:
POST _search { "query": { "term" : { "user" : "Kimchy" } } }
指定多个terms:
GET /_search { "query": { "terms" : { "user" : ["kimchy", "elasticsearch"]} } }
Range
对于string/number/date类型的值进行范围查询:
GET _search { "query": { "range" : { "age" : { "gte" : 10, "lte" : 20, "boost" : 2.0 } } } }
range查询支持的参数:
gte >=; gt >; lte <=;lt <;
Exists
返回指定field非空的文档
GET /_search { "query": { "exists" : { "field" : "user" } } }
Prefix
field以特定字串开头的文档
GET /_search { "query": { "prefix" : { "user" : "ki" } } }
Wildcard/Regexp
*匹配任意多个字符,?匹配单个字符
GET /_search { "query": { "wildcard" : { "user" : "ki*y" } } }
正则表达式:
GET /_search { "query": { "regexp":{ "name.first": "s.*y" } } }
12.5 Compound Queries
Bool
组合其他查询
POST _search { "query": { "bool" : { "must" : { "term" : { "user" : "kimchy" } }, "filter": { "term" : { "tag" : "tech" } }, "must_not" : { "range" : { "age" : { "gte" : 10, "lte" : 20 } } }, "should" : [ { "term" : { "tag" : "wow" } }, { "term" : { "tag" : "elasticsearch" } } ], "minimum_should_match" : 1, "boost" : 1.0 } } }
must - 必须匹配,参与score计算
filter - 必须匹配,不参与score计算
must_not - 必须不匹配
should -