Elasticsearch Query DSL笔记
1. DSL介绍
Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使查询更加灵活、精确且更易于调试。
2.全文查询
http://localhost:9201/bookdb_index1/bookdb_type/_search
2.1 match_all
/_search查找整个ES中所有索引内容,/前面可以加上索引名,多个索引名之前用英文逗号分隔。
{ "query": { "match_all": {} } }
2.2 match
下面例子就是查找first_name为Jane的所有记录
{ "query": { "match": { "first_name":"Jane" } } }
2.3 multi_match
在多个字段上执行相同的match查询,下面的例子就表示查询first_name或last_name字段中包含Jane的记录
{ "query": { "multi_match": { "query": "Jane", "fields": [ "first_name", "last_name" ] } } }
2.4 query_string
可以在查询里面使用AND或OR来完成复杂的查询。下面例子表示查找first_name为"Jane"或者"John"的记录
{ "query": { "query_string": { "query": "Jane OR John", "fields": [ "first_name" ] } } }
2.5 term
term可以用来精确匹配 ,精确匹配的值可以是数字,时间,布尔值或者是设置了not_analyzed不分词的字符串
{ "query": { "term": { "age": {
"value" : 25
} } } }
term对输入的文本不进行分析,直接匹配输出结果,如果要匹配多个值,可以用terms。
{ "query": { "terms": { "age": [ 25, 32 ] } } }
2.6 range
range用来查询落在指定区间的数字或者时间。下面例子 搜索age在25到35之间的数据。操作符主要有四个 gt大于,gte大于等于,lt小于,lte小于等于
{ "query": { "range": { "age": { "gte": 25, "lte": 35 } } } }
2.7 exists
查询出存在某字段文档
{ "query": { "bool": { "must": [ { "exists": { "field": "age" } } ] } }, "from":0, "size":2 }
2.8 bool组合查询
通常我们可以需要将很多个条件组合在一起查出最后的结果,这个时候需要使用ES提供的bool来实现。布尔查询支持的子查询共有四种,分别是:must,should,must_not和filter。
must:类似于SQL中的AND,必须包含;
must_not:类似于SQL中的NOT,必须不包含;
should:文档应该匹配should子句查询的一个或多个;
filter:过滤器,文档必须匹配该过滤条件,跟must子句的唯一区别是,filter不会对结果进行相关性评分_score,换言之当我们的业务中无相关性的要求时,建议查询的过程中多用filter。
下面是组合查询的例子,我们要查询first_name为Jane且age为32且age不为43的所有数据
{ "query": { "bool": { "filter": [ { "match": { "first_name": "Jane" } }, { "match": { "age": 32 } } ], "must_not": { "match": { "age": 43 } } } } }
2.9 sort
sort是排序,也是很常用的查询,这里举age倒叙查询的例子
{ "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ] }
3.聚合查询
3.1 分桶
根据age字段的值进行分桶(有点类似于SQL中的group by),这里的age_bucket是给该桶起的名字
{ "query": { "match_all": {} }, "aggs": { "age_bucket": { "terms": { "field": "age" } } } }
3.2度量
计算出age字段的最大值(metric有点类似于SQL的avg、max、min),这里的max_age是给该度量起的名字
{ "query": { "match_all": {} }, "aggs": { "max_bucket": { "max": { "field": "age" } } } }
4.业务应用
参考:https://learnku.com/docs/elasticsearch73/7.3