query语法
一、DSL方式的query语法
查询常用的关键字如下:
1 query (基于文档相关性的全文搜索)
term:精确匹配,不会对查询词进行分词。下面的示例返回message="loadUserByUsername error"的文档。
GET xxx/_search { "query": { "term": { "message.keyword": { "value": "loadUserByUsername error" } } } }
match:首先会对查询词进行分词,然后再匹配。下面的示例返回message中含有"filter" 或者 "error"的所有文档。
GET xxx/_search { "query": { "match": { "message": "filter error" } } }
match_phrase:被查询词作为一个短语,不会将查询短语拆开。下面的示例返回message="filter error"的文档。
GET xxx/_search { "query": { "match_phrase": { "message": "filter error" } } }
wildcard:模糊匹配。* 代表一个或多个字符。该字段默认是分词的,若想要不分词查询,需要对查询字段进行field.keyword。
GET searchcenter-prod-log-2019.12.03/_search { "query": { "wildcard": { "url.keyword": "/api/m/auth/v1/n/sms/send" } } }
match_phrase_prefix:查询短语前缀匹配,它与match_phrase的区别在于,它可以匹配"查询短语+其它内容"的内容。
GET xxx/_search { "query": { "match_phrase_prefix": { "message": "loadUser" } }, "_source": ["message", "@timestamp"], "from": 0 }
bool:结合其它真值查询,通常和must\should\must_not(与或非)一起组合出复杂的查询。
must:与的关系,表示必须同时满足must下的所有条件。
GET xxx/_search { "query": { "bool": { "must": [ { "match": { "message": "eureka" } }, { "match": { "message": "via" } } ] } } }
should:或的关系,表示满足should下的任意一个条件即可。
GET xxx/_search { "query": { "bool": { "should": [ { "match": { "message": "filter" } }, { "match": { "message": "error" } } ] } } }
must_not:非的关系,表示必须同时不满足must_not下的所有条件才行。
GET xxx/_search { "query": { "bool": { "must_not": [ { "match": { "message": "filter" } }, { "match": { "message": "error" } } ] } } }
2 sort 根据某个字段排序
GET xxx/_search { "query": { "match": { "message": "error" } }, "sort": [ { "@timestamp": { "order": "desc" } } ] }
3 _source
指定查询结果中展示的字段。 "_source": ["a", "b"]
GET xxx/_search { "query": { "match": { "message": "error" } }, "sort": [ { "@timestamp": { "order": "desc" } } ], "_source": ["message", "@timestamp"] }
4 size
指定检索结果输出的条数,不设定时默认为10。 "size": 20
GET xxx/_search { "query": { "match": { "message": "error" } }, "_source": ["message", "@timestamp"], "size": 20 }
5 from
以一定的偏移量来检索我们的数据,缺省时默认为0(从检索的第一条数据开始)。"from": 10
GET xxx/_search { "query": { "match": { "message": "error" } }, "_source": ["message", "@timestamp"], "from": 100 }
二、filter过滤
不需要计算相关度分数,搜索效率高。
range:范围查询,通过一定范围的值来过滤文档。
GET xxx/_search { "query": { "bool": { "filter": { "range": { "@timestamp": { "gte": "2019-09-11T05:20:36.622Z", "lte": "2019-09-11T05:24:36.622Z" } } } } } }
{ "query": { "bool": { "must": [{ "range": { "updateTime": { "gt": "1590559150406", "lt": "1600559150406" } } }], "must_not": [], "should": [] } }, "from": 0, "size": 250, "sort": [], "aggs": { } }
exists:匹配那些指定字段中至少包含一个非null值的文档。 Returns documents that have at least one non-null
value in the original field。
GET xxx/_search { "query": { "bool": { "filter": { "exists": { "field": "@timestamp" } } } } }
二、根据查询条件局部更新文档
host:ip/index/_update_by_query POST { "script": { "source": "ctx._source['relateId']=382;" }, "query": { "term": { "activityId": 746002 } } }