Elasticsearch日常操作中最常用的就是查询操作了,查询有分简单查询和复杂查询,简单查询不需要编写查询的结构体,但功能有限。复杂查询支持的功能很多,但是需要编写查询语句,查询语句初学时还是十分痛苦的。
简单查询是指仅在普通url请求参数下的查询,例如:
GET twitter/tweet/_search?q=user:kimchy
查询语句查询字段user=kimchy的数据。
常用的查询参数有:
常用的查询做法是构造查询语句进行查询,查询语句初学时感觉比较复杂,理解之后就好很多了。
查询语句进行查询示例:
GET /twitter/tweet/_search
{
"query" : {
"term" : { "user" : "kimchy" }
}
}
跟上面简单查询一样的功能,也是返回user字段等于kimchy的数据。
语句里面常用的字段参数:
** query **上面语句已经展示过了,"query" : {"term" : { "user" : "kimchy" }}
,这时比较简单的,一个比较规范的查询语句模板应该这样子的:
"query" : {
"query": {
"bool": {
"must": [],必须满足的条件,里面的每个条件的关系相当于and
"should": [],应该满足的条件(也有可能不满足),里面的每个条件的关系相当于or
"must_not": [],不能满足的条件,里面的每个条件的关系为and
}
}
}
平常查询的时候向里面填条件就可以了。
跟上面一样的
稍微不一样,花样更多了,举个例子:
普通版的排序:
GET /my_index/my_type/_search
{
"sort" : [
{ "post_date" : {"order" : "asc"}},
"user",
{ "name" : "desc" },
{ "age" : "desc" },
"_score"
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
可以排序数组里面的值,例如数组的平均值,最大值等等:
GET /my_index/my_type/_search
{
"sort" : [
{ "post_date" : {"order" : "asc"}},
{ "name" : "desc" },
{ "price" : {"order" : "asc", "mode" : "avg"}}, 平均数来排序,支持max,min,sum,median,avg
{ "age" : {"order" : "asc", "missing" : "_last"}}, 没有值的一律按最小值,支持_last,_first
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
也支持自定义排序字段脚本:
GET /_search
{
"query" : {
"term" : { "user" : "kimchy" }
},
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"source": "doc['field_name'].value * params.factor",
"params" : {
"factor" : 1.1
}
},
"order" : "asc"
}
}
}
在查询时还可以增加自定义字段,例如元数据里面含有数目和单价,我们可以增加一个自定义的字段,例如总金额等等。
GET /_search
{
"query" : {
"match_all": {}
},
"script_fields" : {
"total_amount" : {
"script" : {
"lang": "painless",
"source": "doc['price'].value * doc['num'].value"
}
}
}
}