es 排序 聚合统计_吐血整理:一文看懂ES的R,查询与聚合

本文详细介绍了如何将SQL查询语句转换为Elasticsearch的DSL搜索API,包括简单搜索、精确匹配、模糊匹配、分页、范围查询、多字段匹配、布尔查询、通配符查询、前缀查询、空值查询和过滤。同时,文章还探讨了Elasticsearch的聚合功能,如指标聚合(最大值、最小值、总和、平均值等)和桶聚合(分组统计、过滤器聚合、范围聚合、空值聚合)。通过实例展示了如何实现这些功能,帮助读者更好地理解和运用Elasticsearch进行复杂的数据查询与分析。
摘要由CSDN通过智能技术生成

对es查询的索引的company,其有如下字段,下面是一个示例数据

"id": "1", //id

"name": "张三",//姓名

"sex": "男",//性别

"age": 49,//年龄

"birthday": "1970-01-01",//生日

"position": "董事长",//职位

"joinTime": "1990-01-01",//入职时间,日期格式

"modified": "1562167817000",//修改时间,毫秒

"created": "1562167817000" //创建时间,毫秒

下面的搜索都会将关系型数据库语句转换成es的搜索api以及参数。

主要是用post方式,用DSL(结构化查询)语句进行搜索。

一、查询

1、简单搜索

【sql】

select * from company

【ES】有两种方式

1、GET http://192.168.197.100:9200/company/_search

2、POST http://192.168.197.100:9200/company/_search

{

"query":{"match_all":{}}

}

2、精确匹配(不对查询文本进行分词)

【sql】

select * from company where name='张三'

【ES】

POST http://192.168.197.100:9200/company/_search

{

"query":{

"term":{"name.keyword":"张三"}

}

}

term是用于精确匹配的,类似于sql语句中的“=”,因为“name”字段用的是standard默认分词器,其会将“张三”分成“张”和“三”,并不会匹配姓名为“张三”的人,而name.keyword可以让其不会进行分词。

也可以是terms,这个可以用多个值去匹配一个字段,例如

【sql】

select * from company where name in ('张三','李四')

【ES】

POST http://192.168.197.100:9200/company/_search

{

"query": {

"terms": {

"name.keyword": ["张三", "李四"]

}

}

}

3、模糊匹配

【sql】

select * from company where name like '%张%'

【ES】

POST http://192.168.197.100:9200/company/_search

{

"query": {

"match": {

"name": "张"

}

}

}

上述查询会查出姓名中带有“张”字的文档

4、分页查询

【sql】

select * from company limit 0,10

【ES】

POST http://192.168.197.100:9200/company/_search

{

"from":0,

"size":10

}

【注意】from+size不能大于10000,也可以进行修改,但不建议这么操作,因为es主要分片模式,其会在每个分片都会执行一样的查询,然后再进行汇总排序,如果数据太大,会撑爆内存。例如每个分片都查询出10000条,总共5个分片,最后就会进行50000条数据的排序,最后再取值。

5、范围查询并进行排序

【sql】

select * from company where age>=10 and age<=50

【ES】

POST http://192.168.197.100:9200/company/_search

{

"query":{

"range":{

"age":{

"gte":10,

"lte":50

}

}

},

"sort":{

"age":{

"order":"desc"

}

}

}

范围查询是range,有四种参数

(1)gte:大于等于

(2)gt:大于

(3)lte:小于等于

(4)lt:小于

排序是sort,降序是desc,升序是asc,可以有多个排序字段

6、多字段匹配查询

【sql】

select * from company where sex like '%男%' or name like '%男%'

【ES】

POST http://192.168.197.100:9200/company/_search

{

"query":{

"multi_match":{

"query":"男",

"fields":["name","sex"]

}

}

}

7、bool查询(结构化查询)

结构化查询主要有三块,分别是must,should,must_not,filter

(1)must:里面的条件都是“并”关系,都匹配

(2)should:里面的条件都是“或”关系,有一个条件匹配就行

(3)must_not:里面的条件都是“并”关系,都不能匹配

(4)filter:过滤查询,不像其它查询需要计算_score相关性,它不进行此项计算,故比query查询快

例如:

条件:

年龄在10到50,性别是男

性别一定不能是女

id是1~8的或者职位带有“董”字的

【sql】

select * from company where (age>=10 and age=50 and sex="男")

and (sex!="女")

and (id in (1,2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值