ElasticSearch 7.4学习记录(DSL语法)

news2024/11/14 21:38:37

上文和大家一起初次了解了很多ES相关的基础知识,本文的内容将会是实际企业中所需要的吗,也是我们需要熟练应用的内容。
面对ES,我们最多使用的就是查询,当我负责这个业务时,现不需要我去考虑如何创建索引,添加文档等,只需要根据复杂业务实现查询即可,本文的重点也会在如何使用ES进行查询,并给出很多实际案例进行补充解释和演示

本次案例演示说明所需要的数据-----------student数据信息:

属性数值
id001
namezjh
address中国陕西省延安市
brief喜欢足球的男生
age28
属性数值
id002
namewxx
address中国陕西省渭南市
brief喜欢zjh的女生
age18

  • 1 DSL查询语法
    • 1.1 什么是DSL
    • 1.2 查询所有
    • 1.3 全文检索
    • 1.4 精确查询
    • 1.5 复合查询
    • 1.6 搜索结果处理
      • 1.6.1 结果排序+分页查询
      • 1.6.2 结果高亮
  • 2 DSL语法对应Java代码的实现
    • 2.1 match_all
    • 2.1' 核心代码梳理
    • 2.2 match与multi_match
    • 2.3 term和range
    • 2.4 boolean
    • 2.5 排序和分页
  • 3 聚合索引
    • 3.1 初体验聚合效果(buckets聚合案例)
    • 3.2 优化聚合效果
    • 3.3 Metrics聚合案例
    • 3.4 DSL语法对应Java代码的实现
    • 3.5 多条件的聚合
    • 3.6 理解聚合

1 DSL查询语法

1.1 什么是DSL

就是在这个环境下查询语句,有自己的语法格式要求,需要我们熟练掌握。
或者你可以想一下,在mysql环境下的sql语法,这就是在ES环境下的DSL语法,都是为了实现查询功能。
在这里插入图片描述

一个简化的查询模版

GET /索引库名/_search
{
	"query":{
		"查询类型":{
			"查询条件":"条件值"
		}
	}
}

查询类型可以实现不同的查询效果,下面的案例很好的解释给了大家。

1.2 查询所有

match_all:查询全部的数据

GET /student/_search
{
	"query":{
		"match_all":{}
	}
}

1.3 全文检索

match查询:利用分词器进行查询,比如:传入“男生”,会将其分词取倒排索引库查询,找到含有“男”与“生”数据,即找到zjh和wxx的全部数据

这是一个模板
GET /student/_search
{
	"query":{
		"match":{
			"field":"text"
		}
	}
}

实际案例:拆分“男生”去brief字段中查找有无”男“与”生“,最终找到zjh和wxx
GET /student/_search
{
	"query":{
		"match":{
			"biref":"男生"
		}
	}
}

升级案例:现在不想指定一个字段去查找,想查询所有的字段中的数据是否有匹配的
GET /student/_search
{
	"query":{
		"match":{
			"all":"跑步工资"
		}
	}
}
这个all就表示会在所有字段id,name,address,brief的值中去匹配”跑步工资“

multi_match查询:允许同时查询多个字段

这是一个模板
GET /student/_search
{
	"query":{
		"multi_match":{
			"query":"text",
			"fields":["field1","field2"]
		}
	}
}
实际案例:找到address含有“延安”且brief含有”喜欢“的数据,最终找到zjh和wxx
GET /student/_search
{
	"query":{
		"multi_match":{
			"query":"延安喜欢",
			"fields":["address","brief"]
		}
	}
}

需要注意的是multi_match设置的字段越多,效率越慢,推荐优先使用match

1.4 精确查询

当查询条件是不可分的:keyword,数值,日期,boolean等,不会对其分词,即为精确查询

  • term:根据词条精确值查询
  • range:根据值范围查询

案例:
当查询内容传入:上海,就希望匹配到含有“上海”的数据,而不是含有“上”与“海”的这种数据。此乃term

当查询内容传入:100-300元,就希望匹配到在这个范围内的数据。此乃range

在这里插入图片描述

这是一个term模板
GET /student/_search
{
	"query":{
		"term":{
			"field":{
				“value”:“value”
			}
		}
	}
}
实际案例:找到address含有“男生”的数据,找到空数据,因为必须精准为男生,才能找到zjh
GET /student/_search
{
	"query":{
		"term":{
			"field":{
				“brief”:“男生延安”
			}
		}
	}
}
这是一个range模板
GET /student/_search
{
	"query":{
		"range":{
			"field":{
				“gte”:“value”,
				“lte”:“value”
			}
		}
	}
}
实际案例:找到年龄在10-20之间的人,最终找到wxx
GET /student/_search
{
	"query":{
		"range":{
			"age":{
				“gte”:10,
				“lte”:20
			}
		}
	}
}

注意:gte是大于等于;gt是大于

1.5 复合查询

Boolean Query
布尔查询是一个或者多个查询字句的组合。组合方式有

  • must : 必须匹配每个子查询(与)
  • should:选择性匹配子查询(或)
  • must_not:必须不匹配(非)不参与算分
  • filter:必须匹配 不参与算分
GET /student/_search
{
	"query":{
		“bool”:{
			“must”:[  
			       {"term":{“address”:“中国”} }
			       {"term":{“name”:“zjh”} }
			 ],
			 "should":[ 
			       {"term":{“brief”:“喜欢”} },
			       {"term":{“brief”:“足球”} }
			 ],
			 “must_not”:[
			 		{"range":{“age”:{"gte:20"} } },
			 ],
			 “filter”:[
			 		{"term":{“brief”:“生”}}
			 ]
		}
	}
}

这串代码表示:
must:(address必须含有中国) 且 (name必须含有zjh)
should:(brief含有喜欢) 或者 (brief含有足球)二选一
mustnot:(年龄大于等于20)相反-----(年龄小于20)

这个案例仅仅告诉你如何理解must等,下面介绍一个贴切的案例

查询名字包含“麦当劳”,地点在北京,人均消费不高于100元,周一到周天营业的快餐店

1.6 搜索结果处理

1.6.1 结果排序+分页查询

这是一个range模板
GET /student/_search
{
	"query":{
		“查询类型”:{}
		},
		"sort":[{"fileld":”value“}]
}
实际案例:全部查询,将结果按照年龄倒序,若相等按照id升序排
GET /student/_search
{
	"query":{
		"match_all":{}
		},
	"sort":[{”age“:”desc“},{”id“:”asc“}],
	“from”:0,
	“size”:10
		}
	}
}

es查询结果默认只显示10条数据。from:0--------size:10,表示从0开始,显示10条数据

实际上,如我们会将一批数据分成10批,存在10台服务器的ES上。如果我们需要查询价格由低到高排序前100条,底层执行的逻辑是:每一台ES由低到高排序,查出前100,然后聚合10台机器的数据(10*100),从聚合结果1000中再找到前100的数据。
不过呢,当我们执行数据读取时候,一定是会扫描所有的ES节点,不需要担心查询的时候会不会只查询当前服务器上es的数据,是不会的。

1.6.2 结果高亮

浏览器搜索java,可以看到查询结果中含有java部分高亮显示,这是如何实现的?
在这里插入图片描述
是ES帮忙做的,我们只需要告诉ES需要高亮显示的字段和内容即可

GET /student/_search
{
	"query":{
		“match”:{
			“all”:“中国”
		},
		“highlight”:{
			“fields”:{  //高亮字段
				“address”:{
					"requeire.field_match":“false”,//是否需要与查询字段匹配
					“pre_tags”:"<em>", //用来标记高亮字段的前置标签,
					“post_tags”:“</em>”  //用来标记高亮字段的后置标签
				}
			}
		}
}

2 DSL语法对应Java代码的实现

2.1 match_all

在这里插入图片描述

 RestHighLevelClient client 注意前面我已经获取了client
 关于代码实现,可以理解为四个部分,不同业务需要变动代码的部分只有2,4@Test
    void testMatchAll() throws IOException {
        //1.准备request
        SearchRequest request = new SearchRequest("student");

        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());

        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        //4.解析响应中的hits
        SearchHits searchHits = response.getHits();

        long value = searchHits.getTotalHits().value; //获取value值(参考ES)
        System.out.println(value);

        SearchHit[] hits = searchHits.getHits(); //获取文档数据

        for (SearchHit hit : hits) {
            String json = hit.getSourceAsString();
            System.out.println(json);
        }

    }

为什么解析response呢,因为其全部内容如下图,我们需要选出需要的即可
在这里插入图片描述

2.1’ 核心代码梳理

这里梳理一下上述java代码的对应关系,帮助理解
source()方法中存在操作类型,有查询query,有结果排序sort,有分页form,size等
在这里插入图片描述

在这里插入图片描述

QueryBuilders()里面有查询类型,包括前面科普的精确查询term,全部查询match_all,复合查询bool等
在这里插入图片描述
在这里插入图片描述

2.2 match与multi_match

在这里插入图片描述

2.3 term和range

在这里插入图片描述

2.4 boolean

在这里插入图片描述

2.5 排序和分页

在这里插入图片描述

3 聚合索引

理解什么是聚合索引:类似于group by的概念,下图前两个常用。先看看聚合怎么用,文末会有个案例更清楚的解释聚合的概念
在这里插入图片描述

3.1 初体验聚合效果(buckets聚合案例)

比如我现在需要统计酒店的品牌数量有几种,则可以根据品牌数量进行聚合,就会得到名为“七天酒店” 34家 ;“如家” 30家 ;“速8” 20家的返回结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.2 优化聚合效果

对价格在200元以内的酒店进行聚合,这个案例表示query和aggs是平级。

在这里插入图片描述

3.3 Metrics聚合案例

在这里插入图片描述
也就是在Buckets聚合上再加了一层,很好记住,(sorce字段是酒店评分)注意观察下图,发现多了count、min、max、avg,sum。什么意思呢,就是说我们对酒店评分进行聚合,得到了最大值,最小值,平均值等等。
在这里插入图片描述

3.4 DSL语法对应Java代码的实现

在这里插入图片描述
在这里插入图片描述

3.5 多条件的聚合

就是同时聚合多个字段:城市、星级、品牌
在这里插入图片描述
如何理解这个业务
前面提到的精确查询,根据上海就可以查出city字段中含有”上海“的所有文档,但是我们仅仅停留在粗暴的找出信息的阶段,若我需要对上海这一类文档求平均价格,计数等,term的功能就显得捉襟见肘了。所以这里需要聚合处理。理解了业务需求在看看如何实现

1.准备request
2.准备DSL
	2.1 多个聚合字段
3.发出请求
4.解析结果
	4.1 分别处理聚合名称的数据

2.1内容
在这里插入图片描述
4.1内容,有几个集合字段就实现几次
在这里插入图片描述
实际上,你只需要清楚一个字段的聚合实现流程,那么当你写多个字段的聚合时,仅仅需要重复2和4的代码,那这些代码你可以封装成函数更优雅。

3.6 理解聚合

现在我们需要搜索城市是上海的数据
直接使用精确查询:找到city字段含有”上海“的文档;(注意理解ES中文档的概念)
聚合city字段:对city字段进行聚合,得到“上海”“北京”“深圳”的聚合结果,注意,只是聚合结果,不是具体的文档数据。此外我可以对聚合结果进行求和,求平均值等操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/908153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu18.04安装keil5(踩坑)看完再享用,别直接上手

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装winewine的总结 二、安装Keil5总结 前言 切记看完再享用&#xff0c;别直接上手&#xff0c;不然安装的时候会和我一样踩坑的&#xff08;走了很多弯路…

Unity之用Transform 数组加多个空物体-->简单地控制物体按照指定路线自动行驶

文章目录 **原理解释**&#xff1a;**带注释的代码**&#xff1a;实际运用 当你需要实现物体按照指定路线行驶时&#xff0c;你可以通过以下步骤来实现&#xff1a; 原理解释&#xff1a; 路径点&#xff1a;你需要定义一系列路径点&#xff0c;这些点将构成物体行驶的路线。每…

[软件工具]精灵标注助手目标检测数据集格式转VOC或者yolo

有时候我们拿到一个数据集发现是xml文件格式如下&#xff1a; <?xml version"1.0" ?> <doc><path>C:\Users\Administrator\Desktop\test\000000000074.jpg</path><outputs><object><item><name>dog</name>…

纷享销客连接型CRM助力中国企业全球业务增长

近年来&#xff0c;中国企业出海热度越来越高&#xff0c;中国企业出海之路也越走越宽&#xff0c;全球化步伐明显加速。2023年&#xff0c;中国企业业务出海正进入快车道和分水岭阶段&#xff0c;中国也正在从一个世界工厂变成全球资源的整合者。 0 中国企业出海&#xff0c…

精简体积的OLED 基础驱动库 - OLED_BASIC

打算用一个存储空间不大的Arduino 芯片做点简单的文字和图形显示&#xff0c;屏幕芯片SSD1316&#xff0c;感觉u8g2 占用还是太大&#xff0c;想裁剪别人的现成代码又感觉无从下手&#xff0c;所以就基本上重写了一个OLED 显示库&#xff0c;仓库地址&#xff1a;gitee.com/etb…

SQL助你面大厂(Join家族介绍)

在学习SQL时候&#xff0c;在多表查询的时候你肯定使用过Join&#xff0c;无非就是把两表联合在一起进行多表查询&#xff0c;但是你是真的了解它们的用法么&#xff1f; Join家族一般有left Join、Rigth Join、Inner Join、Left Semi Join、Left Anti Join、Full Join为主 C…

补充1 MATLAB_GUI_修改普通按钮(PushButton)的参数创建一个长按回调按钮

目录 一、实例效果二、补充的知识点&#xff08;两种回调函数&#xff09;三、步骤  1. 先建一个空白的GUI。  2.在GUI Figure 上添加一个按钮&#xff08;PushButton&#xff09;组件&#xff0c;并设置其属性&#xff0c;例如位置、大小和文本等。  3.CtrS保存一下GUI。…

强推9个研究生必备的免费论文下载网站

一、文献党下载器 文献党下载器把庞大的中外文献数据库资源集成在一个平台&#xff0c;就是把大量的中外数据库资源整合在一个站&#xff08;目前文献资源量名列前茅&#xff09;。不论是中文还是外文文献&#xff0c;不论是哪种文献类型&#xff0c;不论是哪个学科领域该网站…

<kernel>kernel 6.4 USB-之-hub_port_connect()分析

&#xff1c;kernel&#xff1e;kernel 6.4 USB-之-hub_port_connect()分析 kernel 6.4 USB系列文章如下&#xff1a; &#xff1c;kernel&#xff1e;kernel 6.4 USB-之-hub_event()分析 &#xff1c;kernel&#xff1e;kernel 6.4 USB-之-port_event()分析 &#xff1c;kern…

全球机器传感器市场价值约为142亿美元,预计将以超过7.5%的增长率增长

机器传感器是一类用于检测、测量和感知机器环境中物理量、化学量或其他特定参数的设备。这些传感器将实际的物理现象转化为电信号或数字信号&#xff0c;以便计算机或控制系统进行处理、分析和控制。机器传感器在工业、自动化、物联网、机器人、汽车等领域有广泛应用。 根据阿…

部门来了个新同事,听说是00后,上来一顿操作给我看呆了...

在程序员职场上&#xff0c;什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反感的&#xff0c;是技术平平&#x…

OD动态调试exe

之前一直卡&#xff0c;好不容易搞懂一点&#xff0c;记下来记下来 分析exe文件&#xff0c;用ida打开&#xff0c;找到主函数main&#xff0c;分析主函数可以发现&#xff0c;main在判断之后调用了l02等函数 因为判断部分的逻辑还是有点复杂&#xff0c;因此想让他直接打印函…

基于PaddleOCR2.7.0发布WebRest服务测试案例

基于PaddleOCR2.7.0发布WebRest服务测试案例 #WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. #警告&#xff1a;这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。 输出结果…

smartsofthelp 5.0 最专业的数据库优化工具,数据库配置优化,数据库高并发优化,SQL 语句优化...

下载地址:百度网盘 请输入提取码 SQL操作返回历史记录&#xff1a; 2023-08-21 20:42:08:220 输入&#xff1a;select version as 版本号 2023-08-21 20:42:08:223 输出&#xff1a;当前数据库实例版本号&#xff1a;Microsoft SQL Server 2012 - 11.0.2100.60 (X64) …

司徒理财:黄金美盘继续看跌,黄金原油最新走势分析及操作建议

黄金走势分析及策略      黄金上周继续回落收跌&#xff0c;周线连续第四周走低&#xff0c;而且还破了周的低点1892&#xff0c;空头力量仍占据优势&#xff0c;暗示后市仍有继续走低的动力和空间&#xff0c;日线方面&#xff0c;黄金一直是承压5日均线下行&#xff0c;是…

@Slf4j报错:Not generating field log: A field with same name already exists

错误出处&#xff1a; 错误原因&#xff1a; 同时使用了Slf4j注解以及LittlecLogger private static final LittlecLogger log LittlecLoggerFactory.getLogger(TimeTrackController.class); 修复方法&#xff1a; 将log改为LOG&#xff0c;便于区分&#xff0c;代码即用到了…

服务运营|斯坦福大学商学院Yue Hu :基于排队论的医院急诊部人员配置策略

作者&#xff1a;李舒湉&#xff0c; 陈盈鑫&#xff0c; XinW 编者按 本次解读的文章是“Prediction-Driven Surge Planning with Application in the Emergency Department”。论文第一作者是斯坦福大学商学院&#xff08;Stanford Graduate School of Business) 的Yue Hu&a…

浅谈煤矿井下电力监控系统的应用研究

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;主要介绍了应用煤矿井下电力监控系统的重要意义&#xff0c;并对煤矿井下电力监控系统的主要原理和基本构成做了简要介绍&#xff0c;并从隔爆监控单元设计、通信协议设计和组态监控系统设计等方面提出了电力监…

小白到运维工程师自学之路 第七十八集 (安装Jenkins)

一、环境概述 随着软件开发需求及复杂度的不断提高&#xff0c;团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins自动化部署可以解决集成、测试、部署等重复性的工作&#xff0c;工具集成的效率明显高于人工操作&#xf…

【考研数学】解决求解微分方程时,常数的结合问题以及是否能直接去掉绝对值的讨论

文章目录 引言例子 1例子 2总结 引言 在微分方程&#xff0c;尤其是一阶线性微分方程的求解过程中&#xff0c;经常出现求 ∫ 1 x d x \int\frac{1}{x}dx ∫x1​dx 等原函数需要加绝对值的不定积分。如果放在不定积分里&#xff0c;肯定毫不犹豫会加上绝对值&#xff0c;也就…