当前位置: 首页 > news >正文

ElasticSearch 7.4学习记录(DSL语法)

上文和大家一起初次了解了很多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@Testvoid testMatchAll() throws IOException {//1.准备requestSearchRequest request = new SearchRequest("student");//2.准备DSLrequest.source().query(QueryBuilders.matchAllQuery());//3.发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4.解析响应中的hitsSearchHits 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.准备DSL2.1 多个聚合字段
3.发出请求
4.解析结果4.1 分别处理聚合名称的数据

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

3.6 理解聚合

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

相关文章:

ElasticSearch 7.4学习记录(DSL语法)

上文和大家一起初次了解了很多ES相关的基础知识&#xff0c;本文的内容将会是实际企业中所需要的吗&#xff0c;也是我们需要熟练应用的内容。 面对ES&#xff0c;我们最多使用的就是查询&#xff0c;当我负责这个业务时&#xff0c;现不需要我去考虑如何创建索引&#xff0c;添…...

全志orangepi-zero2驱动编写2,控制电平高低

使用驱动编写控制高低电平 可看我前俩篇文章&#xff1a; 【1】全志orangepi-zeor2驱动编写 【2】驱动函数框架详解 检索芯片手册关键信息 知道GPIO基地址 知道PC偏移地址 知道想要控制的端口的信息 知道数据位如何操作 代码实操 驱动代码 #include <linux/fs.h&…...

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章四 一、论软件的静态演化和动态演化及其应用1.论文题目2.写作要点和写作素材二、论大规模分布式系统缓存设计策略1.论文题目2.写作要点和写作素材三、论基于REST服务的Web应用系统设计1.论文题目2.写…...

06.利用Redis实现点赞功能

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redisson实现点赞功能 学习产出&#xff1a; 解决方案&#xff1a; 点赞后的用户记录在Redis的set数据类型中 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactI…...

【React】生命周期和钩子函数

概念 组件从被创建到挂载到页面中运行&#xff0c;再到组件不用时卸载的过程。 只有类组件才有生命周期。 分为三个阶段&#xff1a; 挂载阶段更新阶段销毁阶段 三个阶段 挂载阶段 钩子函数 - constructor 创建阶段触发 作用&#xff1a;创建数据 之前定义状态是简写&…...

无涯教程-TensorFlow - 优化器

Optimizers是扩展类&#xff0c;其中包括用于训练特定模型的附加信息&#xff0c;Optimizers类使用给定的参数初始化&#xff0c;用于提高速度和性能&#xff0c;以训练特定模型。 TensorFlow的基本Optimizers是- tf.train.Optimizer 此类在tensorflow/python/training/opti…...

基于AQS+双向链表实现队列先进先出

学习AQS写的一个模拟案例 package com.tom.xiangyun.ch04_aqs;import com.tom.tuling.UnsafeFactory; import sun.misc.Unsafe;import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock;/*** 使用双向链表实现队列** author 钟棋…...

无涯教程-Perl - time函数

描述 此函数返回自纪元以来的秒数(对于大多数系统,是1970年1月1日UTC,00:00:00&#xff1b;对于Mac OS,是1904年1月1日,00:00:00)。适用于gmtime和本地时间。 语法 以下是此函数的简单语法- time返回值 此函数返回自纪元后数秒的整数。 例 以下是显示其基本用法的示例代…...

CUDA Bug<三>当__global__函数出现里面所有输出的数组都随机赋值了

问题具体描述&#xff1a; eg. __global__ void Updata_HomJm(float* H,float *HJm,float* fr,float *gr,float* ur,float* urgrJm,float*wpd,float *w, float *wJm,int n) { int idx blockIdx.x*blockDim.x threadIdx.x;float t 0.0;//H*zpint idx_Ai idx*n;for (int j…...

甜椒叶病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)

代码运行要求&#xff1a;Torch>1.13.1即可 1.数据集介绍&#xff1a; 第一个文件夹是细菌斑叶&#xff08;3460张&#xff09; 第二个文件夹是 健康&#xff08;4024张&#xff09; 2.整个文件夹 data文件夹存放的是未被划分训练集和测试集的原始照片 picture文件夹存放的…...

Python爬虫——scrapy_日志信息以及日志级别

日志级别&#xff08;由高到低&#xff09; CRITICAL&#xff1a; 严重错误 ERROR&#xff1a; 一般错误 WARNING&#xff1a; 警告 INFO&#xff1a; 一般警告 DEBUG&#xff1a; 调试信息 默认的日志等级是DEBUG 只要出现了DEBUG或者DEBUG以上等级的日志&#xff0c;那么这些…...

微信小程序 echarts 画多个横向柱状图

然后是json {"usingComponents": {"ec-canvas": "../../common/ec-canvas/ec-canvas"},"navigationBarTitleText": "主题活动" } ec-canvas获取方式 在链接里下载代码 然后copy ec-canvas文件夹到自己的项目 https://gi…...

【二叉树】572. 另一棵树的子树

572. 另一棵树的子树 解题思路 遍历二叉树的思路针对每一个节点判断该节点的子树和subtree是不是相等需要编写判断两个子树是否相等的函数 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* …...

220V转5V芯片三脚芯片-AH8652

220V转5V芯片三脚芯片是一种非常常见的电源管理芯片&#xff0c;它通常被用于将高压交流输入转为稳定的直流5V输出。芯片型号AH8652是一款支持交流40V-265V输入范围的芯片&#xff0c;采用了SOT23-3三脚封装。该芯片内部集成了650V高压MOS管&#xff0c;能够稳定地将输入电压转…...

windows系统丢失mfc120u.dll的解决方法

1.mfc120u.dll是什么 mfc120u.dll是Windows操作系统中的一个动态链接库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09;文件。它包含了一些用于运行C程序的函数和其他资源。这个特定的DLL文件是Microsoft Foundation Classes&#xff08;MFC&#xff09;库的…...

css 实现电梯导航

实现原理&#xff1a;利用css实现电梯导航很简单&#xff0c;基本原理就是通过a标签绑定跳转目标的id来实现的 html代码&#xff1a; <div class"body"><div class"top" id"top"></div><div class"con1" id"…...

【Spring Boot】Spring Retry减少1000 行代码讲解

文章目录 前言问题介绍解决方案Let’s start hacking!1. 设置 Spring 重试2. 重构代码 总结 前言 本文翻译自国外论坛 medium&#xff0c;原文地址&#xff1a;levelup.gitconnected.com/how-i-delet…&#xff0c;原文作者&#xff1a;Hari Ohm Prasath 使用 Spring Retry 重…...

【数据结构OJ题】相交链表

原题链接&#xff1a;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 看到这道题&#xff0c;很容易想到的方法就是暴力求解&#xff0c;就是将一个链表的每个结点的地址…...

【华为OD机试】最小传输时延I【2023 B卷|200分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图表示, 其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[i]={u,v,w},其中u表示…...

Android13 网络 Adb 默认开启

Android 13 网络 Adb 默认开启 文章目录 Android 13 网络 Adb 默认开启一、前言二、默认adb 代码实现1、修改的目录&#xff1a;2、具体修改&#xff1a;&#xff08;1&#xff09;在XXX_device.mk 添加属性&#xff08;2&#xff09;设置固定端口号&#xff08;3&#xff09;去…...

Git分享-规范/建议/技巧

1. Git多人协作开发流程图 1.1 processOn默认的模板 1.2 改造之后 https://www.processon.com/view/link/64ccaf56a433c931b2f9428a 访问密码&#xff1a;512I ① 总流程图 ② feat分支&#xff08;功能/需求 分支&#xff09;流程 ③ bugfix分支&#xff08;紧急补丁分支&…...

vue3文件下载功能

定义方法&#xff1a; utils.js /**** param url 目标下载接口* param query 查询参数* param fileName 文件名称* returns {*}*/ export function downBlobFile(url: any, query: any, fileName: string) {return request({//url: url,method: get,responseType: blob,param…...

Python调用文心一言的API

最近申请了文心一言的key&#xff0c;然后尝试调用了一下文心一言&#xff0c;这里使用一个简单的方式来调用文心一言&#xff1a; pip install paddle-pipelinesfrom pipelines.nodes import ErnieBotapi_key "your apply key" secret_key "your apply secr…...

【计算机网络八股】计算机网络(一)

目录 计算机网络的各层协议及作用&#xff1f;TCP和UDP的区别&#xff1f;UDP 和 TCP 对应的应用场景是什么&#xff1f;详细介绍一下 TCP 的三次握手机制&#xff1f;为什么需要三次握手&#xff0c;而不是两次&#xff1f;为什么要三次握手&#xff0c;而不是四次&#xff1f…...

记录一次arcgis engine开发版本引入问题

之前基于arcigs 10.1vs2013开发的程序&#xff0c;现在拿出来要改&#xff0c;但是目前版本是arcgis10.7vs2017/vs2019,打开后无论如何替换引用版本&#xff0c;都报错 &#xff08;具体版本对应可以看这&#xff1a;ArcGIS Engine 与 Visual Studio 版本对照表_vs2019对应啥版…...

2023年Java毕业设计怎样选题,有哪些注意事项,300道Java毕业设计题目

文章目录 一、确定个人兴趣和技能二、考虑实际应用价值三、注重创新和独特性四、合理规划时间和资源五、注重实践和测试Java 毕业设计题目参考第一部分第二部分 小结 随着计算机技术的不断发展&#xff0c;Java编程语言已经成为了众多大学计算机专业学生必修的一门课程。而Java…...

算法-滑动窗口-串联所有单词的子串

算法-滑动窗口-串联所有单词的子串 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 1.2 题目描述 2 滑动窗口Hash表 2.1 解题思路 构建一个大小为串联子串的总长的滑动窗口为每个words中的子串创建一个hash表, <子…...

2023年7月京东美妆护肤品小样行业数据分析(京东数据挖掘)

如今&#xff0c;消费者更加谨慎&#xff0c;消费决策也更加理性。在这一消费环境下&#xff0c;美妆护肤市场中&#xff0c;面对动辄几百上千的化妆品&#xff0c;小样或体验装无疑能够降低消费者的试错成本。由此&#xff0c;这门生意也一直备受关注。 并且&#xff0c;小样…...

记录Taro巨坑,找不到sass类型定义文件

问题 taronutuisassts项目里tsconfig.json一直报红报错。 找不到“sass”的类型定义文件。 程序包含该文件是因为: 隐式类型库 “sass” 的入口点 其实正常人想的肯定是装上 types/sass试试。开始我试过了&#xff0c;没用。删了依赖重装也没用。后面在issue中找到答案了 解决…...

CS1988|C#无法在异步方法中使用ref,in,out类型的参数的问题

CS1988|C#无法在异步方法中使用ref,in,out类型的参数 &#x1f300;|场景&#xff1a; BlazorServer的场景中推荐使用异步方法&#xff0c;使用ref,out,in为参数前缀则报错CS1988 原因如下: ref parameters are not supported in async methods because the method may not h…...

网站建设都包括哪些方面/长沙做搜索引擎的公司

T1 一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G{V,E}&#xff0c;这张无向图有n个点m条边组成。并且这是一张带权图&#xff0c;只有点权。 LYK想把这个图删干净&#xff0c;它的方法是这样的。每次选择一个点&#xff0c;将它删掉&a…...

深圳做微信网站制作/百度网盘怎么找片

①打开pcb文件&#xff0c;选择设计--层叠管理器 ②进入下图 然后选择左下角的Impedance&#xff0c;点击add增加阻抗计算 ③以单端50欧姆为例 选中阻抗会出现详细设置计算...

iis发布网站无法访问/电商网站建设方案

第一部分&#xff1a;预备知识 原文&#xff1a;Part I: Initial Knowledge 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 自豪地采用谷歌翻译 你需要学习的第一件事就是一切事情。我知道这是吓人的&#xff0c;但我在介绍中提到&#xff0c;你在整本书中只会练习三个…...

wordpress不要分页/深圳竞价排名网络推广

操作符会进行隐式自动类型转换,此处ab隐式的将加操作的结果类型强制转换为持有结果的类型, 而aab则不会自动进行类型转换.如&#xff1a; 以下代码是否有错,有的话怎么改&#xff1f; 有错误.short类型在进行运算时会自动提升为int类型,也就是说 s11 的运算结果是int类型,而s1…...

和恶魔做交易的网站/西安优化外包

ssh推送.py程序到CentOS7服务器端运行出现lost connection错误 (base) F:\workspace>dir 驱动器 F 中的卷是 新加卷 卷的序列号是 C2B9-6277 F:\workspace 的目录2019/03/13 16:44 <DIR> .2019/03/13 16:44 <DIR> ..2019/03/13 16:47 <DIR> .idea2019/03/…...

怎样保存网站资料 做证据/哈尔滨网络推广优化

1、最短路径 每组数据第一行是两个整数N、M&#xff08;N<100&#xff0c;M<10000&#xff09;&#xff0c; N表示成都的大街上有几个路口&#xff0c; 标号为1的路口是商店所在地&#xff0c;标号为N的路口是赛场所在地&#xff0c; M则表示在成都有几条路。 NM0表…...