Elasticsearch语法(聚合)
admin
2024-03-25 12:38:00
0

查询语法结构

GET /{索引名}/_search
{"from" : 0,  // 返回搜索结果的开始位置"size" : 10, // 分页大小,一次返回多少数据"_source" :[ ...需要返回的字段数组... ],"query" : { ...query子句... },"aggs" : { ..aggs子句..  },"sort" : { ..sort子句..  }
}
{"took" : 5, // 查询消耗时间,单位毫秒 "timed_out" : false, // 查询是否超时"_shards" : { // 本次查询参与的ES分片信息,查询中参与分片的总数,以及这些分片成功了多少个失败了多少个"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : { // hits字段包含我们搜索匹配的结果"total" : { // 匹配到的文档总数"value" : 1, // 找到1个文档"relation" : "eq"},"max_score" : 1.0, // 匹配到的最大分值"hits" : [ // 这里就是我们具体的搜索结果,是一个JSON文档数组]}
}

Elasticsearch query查询语法


// 匹配单个字段   match  全局查询
GET /{索引名}/_search
{"query": {"match": {"匹配字段": "匹配内容"}}
}
// 精准匹配 / 多单个字段   
GET /{索引名}/_search
{"query": {"term": {   // 精准匹配 = sql的"=""某字段": "匹配值"},"terms": {  // 任意值匹配 = sql in 语句 "shop_id": [123,100,300]}}
}
//范围查询 range
GET /order_v2/_search
{"query": {"range": {"shop_id": {"gte": 10, // gt大于  gte大于等于"lte": 200 // lt小于  lte小于等于}}}
}
// bool查询
GET /{索引名}/_search
{"query": {"bool": { // bool查询"must": [], // must条件,类似SQL中的and, 代表必须匹配条件"must_not": [], // must_not条件,跟must相反,必须不匹配条件"should": [] // should条件,类似SQL中or, 代表匹配其中一个条件}}
}

Elasticsearch 全文搜索

分词器

GET /_analyze
{"text": "上海大学","analyzer": "standard"  //默认分词器 英文友好 中文不适
}
GET /_analyze
{"text": "红烧牛肉面","analyzer": "smartcn"   //官方推荐中文分词插件
}

ik分词器 自定义扩展词库
下载地址,保持es版本一致https://github.com/medcl/elasticsearch-analysis-ik/releases

两种分词器
ik_smart - 粗粒度的分词
ik_max_word - 会尽可能的枚举可能的关键词,就是分词比较细致一些,会分解出更多的关键词
"text": "上海人民广场麻辣烫",
"analyzer": "ik_max_word"
结果:【"上海人","上海","人民","广场","麻辣烫","麻辣","烫"】
-----------------------------------------------------
"text": "上海人民广场麻辣烫",
"analyzer": "ik_smart"
结果:【"上海","人民","广场","麻辣烫","麻辣"】

Elasticsearch sort排序子句

GET /order_v2/_search
{"query": {"match_all": {}},"sort": [{"order_no": {  // 字段倒叙"order": "desc"}},{"shop_id": {   //与上面的字段值相等 就正序"order": "asc"}}]
}

Elasticsearch 聚合查询(aggs)基本概念

ES聚合查询类似SQL的GROUP by(分组,组内聚合)。
满足特定条件的文档的集合,叫做桶。

例:

GET /order/_search
{"size" : 0, // 设置size=0的意思就是,仅返回聚合查询结果,不返回普通query查询结果。"aggs" : { // 聚合查询语句的简写"popular_colors" : { // 给聚合查询取个名字,叫popular_colors"terms" : { // 聚合类型为,terms,terms是桶聚合的一种,类似SQL的group by的作用,根据字段分组,相同字段值的文档分为一组。"field" : "color" // terms聚合类型的参数,这里需要设置分组的字段为color,根据color分组}}}
}
// 上面没确定默认用count
select count(color) from order group by color

Elasticsearch 指标聚合(metrics)

ES指标聚合,就是类似SQL的统计函数.
常用的统计函数如下:

Value Count - 类似sql的count函数,统计总数
Cardinality - 类似SQL的count(DISTINCT 字段), 统计不重复的数据总数
Avg - 求平均值
Sum - 求和
Max - 求最大值
Min - 求最小值
  "aggs": {"types_count": { // 聚合查询的名字,随便取个名字"value_count": { // 聚合类型为:value_count"field": "type" // 计算type这个字段值的总数}}}
select count(type) from sales"aggs" : {"type_count" : { // 聚合查询的名字,随便取一个"cardinality" : { // 聚合查询类型为:cardinality 去重"field" : "type" // 根据type这个字段统计文档总数}}}"aggs": {"avg_grade": { // 聚合查询名字,随便取一个名字"avg": { // 聚合查询类型为: avg"field": "grade" // 统计grade字段值的平均值}}}
略......

Elasticsearch 分组聚合查询(bucket)

ES常用的桶聚合如下:

Terms聚合 - 类似SQL的group by,根据字段唯一值分组
Histogram聚合(直方图) - 根据数值间隔分组,例如: 价格按100间隔分组,0、100、200、300等等
Date histogram聚合 - 根据时间间隔分组,例如:按月、按天、按小时分组
Range聚合 - 按数值范围分组,例如: 0-150一组,150-200一组,200-500一组。
terms聚合
"aggs": {"shop": { // 聚合查询的名字,随便取个名字"terms": { // 聚合类型为: terms"field": "shop_id" // 根据shop_id字段值,分桶}}}
select shop_id, count(*) from order group by shop_id"aggs" : {"prices" : { // 聚合查询名字,随便取一个"histogram" : { // 聚合类型为:histogram"field" : "price", // 根据price字段分桶"interval" : 50 // 分桶的间隔为50,意思就是price字段值按50间隔分组}}}"aggs" : {"sales_over_time" : { // 聚合查询名字,随便取一个"date_histogram" : { // 聚合类型为: date_histogram"field" : "date", // 根据date字段分组"calendar_interval" : "month", // 分组间隔:month代表每月、支持minute(每分钟)、hour(每小时)、day(每天)、week(每周)、year(每年)"format" : "yyyy-MM-dd" // 设置返回结果中桶key的时间格式}}}"aggs" : {"price_ranges" : { // 聚合查询名字,随便取一个"range" : { // 聚合类型为: range"field" : "price", // 根据price字段分桶"ranges" : [ // 范围配置{ "to" : 100.0 }, // 意思就是 price <= 100的文档归类到一个桶{ "from" : 100.0, "to" : 200.0 }, // price>100 and price<200的文档归类到一个桶{ "from" : 200.0 } // price>200的文档归类到一个桶]}}}

Elasticsearch 聚合后排序

类似terms、histogram、date_histogram这类桶聚合都会动态生成多个桶,如果生成的桶特别多,我们如何确定这些桶的排序顺序,如何限制返回桶的数量。

ES桶聚合支持两种方式排序:
内置排序

_count - 按文档数排序。对 terms 、 histogram 、 date_histogram 有效
_term - 按词项的字符串值的字母顺序排序。只在 terms 内使用
_key - 按每个桶的键值数值排序, 仅对 histogram 和 date_histogram 有效	
"aggs" : {"colors" : { // 聚合查询名字,随便取一个"terms" : { // 聚合类型为: terms"field" : "color", "order": { // 设置排序参数"_count" : "asc"  // 根据_count排序,asc升序,desc降序}}}}

按度量指标排序

GET /cars/_search
{"size" : 0,"aggs" : {"colors" : { // 聚合查询名字"terms" : { // 聚合类型: terms,先分桶"field" : "color", // 分桶字段为color"order": { // 设置排序参数"avg_price" : "asc"  // 根据avg_price指标聚合结果,升序排序。}},"aggs": { // 嵌套聚合查询,设置桶内聚合指标"avg_price": { // 聚合查询名字,前面排序引用的就是这个名字"avg": {"field": "price"} // 计算price字段平均值}}}}
}
GET /_search
{"aggs" : {"products" : { // 聚合查询名字"terms" : { // 聚合类型为: terms"field" : "product", // 根据product字段分桶"size" : 5 // 限制最多返回5个桶}}}
}

相关内容

热门资讯

女朋友快生日了我不在她身边想说... 女朋友快生日了我不在她身边想说几句浪漫点得祝福语,请各位帮忙...亲爱的,距离永远阻挡不了我对你爱,...
我18岁了,想献血,请问献血有... 我18岁了,想献血,请问献血有什么规定?无传染性疾病
即便心再痛,也愿意因为爱而停下... 即便心再痛,也愿意因为爱而停下来等待前任回头的星座有哪些?摩羯座,金牛座还有白羊座就这个星座他是非常...
第一个字是从的成语大全,从字开... 第一个字是从的成语大全,从字开头的四字词语 第一个字是从的成语大全 从容应对、 从容自若、 从天...
谁能给我紫藤萝瀑布课后练习第1... 谁能给我紫藤萝瀑布课后练习第1题的答案!自己写。原先,焦虑和悲痛“一直压在我心上”,在繁花盛开的藤萝...
冷笑话的定义是什么? 冷笑话的定义是什么?怎么样的话才算冷笑话?不好笑的笑话吧.定义1:就是讲的人挺平静的,基本上面无表情...
感觉自己失去了目标,现在不知道... 感觉自己失去了目标,现在不知道该怎么生存下去了。人生中没有一帆风顺,现成的路可走,总会遇到一些困难,...
我都24了,还没有男朋友,我真... 我都24了,还没有男朋友,我真的很慌。怎么办?身边也没有男生说喜欢我你愿意网恋吗缘分 不要宅在家里那...
我有一个朋友,我们总是出去玩,... 我有一个朋友,我们总是出去玩,喝酒。但是他每次出来都要炫耀他赚了多少钱,我觉得他很爱炫,我就不想和炫...
林永健拍过什么电视剧 林永健拍过什么电视剧金婚喜耕田的故事城里城外马文的战争
斑马s6有必要学吗 斑马s6有必要学吗有。1、激发兴趣:通过有趣的故事、游戏和其他互动活动,斑马儿童英语S6可以激发孩子...
甜蜜乐章 撮合不了子奇和慕容啊... 甜蜜乐章 撮合不了子奇和慕容啊~~~~!必须是金曲奖的最佳演唱人,不然触发不了
暮光之城3 暮光之城3现在没有出呢!有也是骗人的!起码要国内上映之后吧!我和你一样期待呢!
学生会查寝收走了东西,要用什么... 学生会查寝收走了东西,要用什么法律武器把收走的东西要回来?和学校讲法律,劝你还是别这么冲动了。拿到明...
信任无价主要讲了一个什么故事 信任无价主要讲了一个什么故事主要讲了:一位女老师通过绝食的办法,让那位偷了快译通的学生自己主动交出。
什么叫奴隶社会 什么叫奴隶社会 奴隶社会:从公元前21世纪夏朝建立开始,到公元前221年秦王嬴政统一中国结束。[1...
中级经济师人力资源专业怎么才能... 中级经济师人力资源专业怎么才能考过啊?只是看指定的那两本书《经济基础》和《人力资源管理》,然后再把上...
为什么海里都是水啊 为什么海里都是水啊海里没水 海就不叫海了不难怎么叫海水 嘿嘿。海里没水 海就不叫海了
14岁两个女生,一米深的河里手... 14岁两个女生,一米深的河里手绑手溺亡,疑点重重,怎么回事?这个是因为她们忍受不了家里面的重男轻女,...
帮解几道五年级数学题!急急急~... 帮解几道五年级数学题!急急急~快快快!(要解)52=2*2*13