Elasticsearch结构化查询

简单查询语句(lite)只能满足一些简单的需求,如果我们的条件复杂,需要使用(Request Body Serarch)API,参数以Json的格式传递。

一、结构化查询(Query DSL):

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。

四、match、multi_match、bool查询

如果使用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": "*:*"
		}
	]
}