简单查询语句(lite)只能满足一些简单的需求,如果我们的条件复杂,需要使用(Request Body Serarch)API,参数以Json的格式传递。
1)空查询,等同于使用Math All
POST /_search { "query":{ "match_all":{} } }
2)条件字段查询
POST /_search { "query": { "match": { "about": "like" } } }
3)合并多子句查询(可以多重合并)
{ "bool": { "must": { "match": { "tweet": "elasticsearch" }}, "must_not": { "match": { "name": "mary" }}, "should": { "match": { "tweet": "full text" }} } }
结构化查询(Query DSL)和结构化过滤(Filter DSL)非常相似,以使用目的不同而有差异。
过滤语句会询问文档中是否包含特定值,如status 是否包含 online字段。
查询语句是为了找到文档,通过相关性进行匹配得分:查询run的时候,同时会查找同义词 runs,runing,jog。
所以可以看出,一般情况下,过滤语句比查询语句更耗时,并且查询语句也不容易缓存(除非匹配文档量很少)。
So,原则上使用查询语句做全文搜索或者其他需要相关性的评分,其他的全部使用过滤语句。
1)term过滤: term 主要应用于精确匹配,比如数字,日期,布尔值,或者使用not_analyzed的字符串。
2)terms过滤:类似term过滤,允许指定多个匹配条件
3)range过滤:范围过滤
4)exist和missing过滤,可以过滤稳重中是否包含某个字段
5)bool 过滤,合并多个过滤条件:must:完全匹配相对于and ,must_not:相反匹配相当于No,should:至少一个匹配相当于or。
1) match查询是一个标准查询,不管是全文检索或者是精准查询基本都要用到,如果使用match查询一个全文本字段,他在真正查询之前会先用分析器分析一下查询字段。
2)multi_match 允许在match查询的基础上同时搜索多个字段。
3)bool查询与Bool过滤类似,bool查询是计算每个字句的相关性score。
查询与过滤合并有很多种组合方式,在真正的实验中要多多学习,但是先过滤后查询,获取到的数据集变小,肯定是可以提高性能的
{
"query": {
"filtered": {
"query": { "match": { "email": "business opportunity" }},
"filter": { "term": { "folder": "inbox" }}
}
}
}
类似mysql的explain,在ES中也有explain,这个东东比较复杂,后期单独深究这个模块
GET /_validate/query?explain
{
"query": {
"match": {
"about": "like powerful"
}
}
}
结果:
{
"_shards": {
"total": 3,
"successful": 3,
"failed": 0
},
"valid": true,
"explanations": [{
"index": "megacorp",
"valid": true,
"explanation": "*:*"
},
{
"index": "test",
"valid": true,
"explanation": "*:*"
},
{
"index": "test2",
"valid": true,
"explanation": "*:*"
}
]
}