【ElasticSearch系列-03】ElasticSearch的高级句法查询Query DSL

ElasticSearch系列整体栏目


内容链接地址
【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827
【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631
【二】ElasticSearch的高级查询Query DSLhttps://blog.csdn.net/zhenghuishengq/article/details/134159587

ElasticSearch的高级句法查询Query DSL

  • 一,ElasticSearch高级查询语法Query DSL
    • 一,Query DSL的基本使用
      • 1.1,深分页查询Scroll
      • 1.2,match条件查询
      • 1.3,match_phrase短语查询
      • 1.4,multi_match多字段查询
      • 1.5,query_string 查询
      • 1.6,term精确匹配
      • 1.7,prefix前缀查询
      • 1.8,通配符查询wildcard
      • 1.9,范围查询range
      • 1.10,fuzzy模糊查询
      • 1.11,highlight查询
    • 2,Query DSL多条件查询(高级查询)
      • 2.1,Bool Query布尔查询
      • 2.2,Boosting Query权重查询
      • 2.3,Dis max query 最佳匹配
      • 2.4,Cross Field跨字段匹配

一,ElasticSearch高级查询语法Query DSL

前面两篇主要讲解了es的安装以及一些基本的概念,接下来这篇讲解的是es的高阶语法,QueryDSL。在这里主要是用ik分词器讲解,暂不使用默认的分词器。

一,Query DSL的基本使用

在安装了kibana之后,内部会有一个search的语句,用来查询数据

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

其结果如下,默认是返回前10条数据,类似于做了分页,默认加了一个from0和一个size10,并且在es中,size默认是小于或者等于10000,如果超过这个值,就会直接抛异常

在这里插入图片描述

1.1,深分页查询Scroll

上面说了默认采用的是from加size的方式来解决分页数据返回的问题,但是size的数据是有大小的限制的,当然也可以通过以下命令来调节size的大小

PUT /zhs/_settings
{ "index.max_result_window" :"20000"
}

虽然这种方式可以暂时调节size大小,但是治标不治本,因为依旧是会存在限制,并且由于数据量太大,还可能将内存撑爆。因此后面引入了这种Scroll游标的方式来查询全量数据

GET /zhs_db/_search?scroll=1m   //1m表示查询时间窗口保持1分钟
{"query": {"match_all": {}},"size": 10		//批量查询10条数据
}

在将查询的值返回中可以看出,会生成一个_scroll_id,以及返回一些分片数,查询的总条数等

在这里插入图片描述

就是比如说第一次查询10条数据,随后记录最后一条数据的id,然后在这个时间窗口期内,携带这个id再去库中拉取后十条数据,往复如此。不管是关系系数据库还是非关系型数据库,其设计思想都是这样

拉取的数据会存储在快照里面,后面的操作都是操作这个快照中缓存的数据。因此为了保证性能问题,会牺牲一些精准度,因为后面写进来的数据不在这个快照里面。

1.2,match条件查询

在使用这个match之前,先创建一个索引,并设置分词器为ik分词器

DELETE /zhs_db
PUT /zhs_db		
{"settings" : {"index" : {"analysis.analyzer.default.type": "ik_max_word"}}
}

先插入几条数据,先用最基础的Put的方式插入五条数据


PUT /zhs_db/_doc/1
{
"address":"东岳泰山"
}
PUT /zhs_db/_doc/2
{
"address":"西岳华山"
}
PUT /zhs_db/_doc/3
{
"address":"南岳衡山"
}
PUT /zhs_db/_doc/4
{
"address":"北岳恒山"
}
PUT /zhs_db/_doc/5
{
"address":"中岳嵩山"
}

在确定要查询某一条数据时,可以先通过这个分词分析看看是如何进行分词的

POST _analyze
{"analyzer": "ik_max_word","text": "中岳嵩山"
}

那么可以直接通过这个match的方式批量查询数据

GET /zhs_db/_search
{"query": {"match": {"address": "中岳"}}
}

如果是要查询特定的某个值,可以直接再加一个operator属性,并且value设置成and,如果没有设置这个属性,那么默认值就是的or

GET /zhs_db/_search
{"query": {"match": {"address": {"query": "中岳嵩山","operator": "and"}}}
}

除了上面的operator之外,还可以使用 minimum_should_match ,用于最小分词匹配。就是说分词器默认分为中岳和嵩山两个,只需要满足其中一个就能被查出来

address:{"query":"中岳嵩山""minimum_should_match": 1
}

1.3,match_phrase短语查询

在使用这个短语查询时,需要通过分词器分析,判断两个词的下标是否连续

GET /zhs_db/_search
{"query": {"match_phrase": {"address": "中岳嵩山"}}
}

如通过这个ik分词器分析,可以得知这两个分开的词的position是连续的,分别为0和1,如果不连续,则不能将值查询出

在这里插入图片描述

当然为了解决这个间隔问题,可以直接通过设置 slop 属性来设置允许多少个空格进行匹配

address:{"query":"中岳嵩山""slop": 1
}

1.4,multi_match多字段查询

上面主要讲解的是单字段查询,但是在实际开发中一般都是多字段查询,其语句如下

GET /zhs_db/_search
{"query": {"multi_match": {"query": "中岳嵩山","fields": ["address","name"]}}
}

1.5,query_string 查询

queryString相当于是一个multi_match的一个综合版,如果没有指定具体的字段,则会在全字段中查询

GET /zhs_db/_search
{"query": {"query_string": {"query": "中岳"}}
}

可以设置默认的字段,也可以指定多个字段

"query_string": {//"default_field": "address","fields": ["name","address"],"query": "中岳"
}

1.6,term精确匹配

上面的match属于是模糊匹配,而使用精确匹配的,就是这个term。

在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词,只有text类型分词。因此term在对这些数据进行查询时,就是精确匹配

GET /zhs_db/_search
{"query": {"term": {"address": "中岳"}}
}

如果想要对全字段进行精确匹配,可以添加一个keyword 关键字

"address.keyword": "中岳嵩山"

在es中,查询会有算分操作,而算分操作会影响到性能问题,而精确匹配是不需要算分的,可以将query转成filter,从而忽略算分所带来的影响

"query":{"constant_score":{"filter":{}}
}

如果短时间内存在多次term的查询,那么就会将这部分数据缓存起来

1.7,prefix前缀查询

前缀查询就是查询以某个字段开头的数据,因此用不上底层的倒排字典,而是将所有的数据遍历一遍,将符合的数据返回。由于用不上倒排索引,因此对性能是有一定的影响的

PUT /zhs_db/_search
{"query":{"prefix":{"address":{"value":"嵩山"}}}
}

1.8,通配符查询wildcard

通配符查询就和这个前缀查询一样,都是利用不上这个倒排索引,而是将所有的数据遍历查询一遍,符合的数据返回。

GET /zhs_db/_search
{"query": {"wildcard": {"address": {"value": "*山*"}}}
}

1.9,范围查询range

可以直接通过这个range关键字实现范围查询,

  • gte 大于等于
  • lte 小于等于
  • gt 大于
  • lt 小于
  • now 当前时间
POST /zhs_db/_search
{"query": {"range": {"age": {"gte": 25,"lte": 28}}}
}

1.10,fuzzy模糊查询

fuzzy表示允许在打错字的情况下,将想要查询的数据查询出来。

GET /zhs_db/_search
{"query": {"fuzzy": {"address": {"value": "松山","fuzziness": 1    //表示允许错一个字}}}
}

除了使用上面这种方式,还能用match的方式实现这种错别字的模糊查询

GET /zhs_db/_search
{"query": {"match": {"address": {"query": "松山","fuzziness": 1}}}
}

1.11,highlight查询

就是将query查询出来的结果,通过highlight的方式实现高亮

GET /products/_search
{"query": {"term": {"name": {"value": "牛仔"}}},"highlight": {"fields": {"*":{}}}
}

2,Query DSL多条件查询(高级查询)

2.1,Bool Query布尔查询

在一个bool查询中,可以是一个或者多个查询字句的组合,字句总共有四种,分别是 must、should、must_not、filter,前两者使用时内部会进行算分的操作,后二者不会

must相当于是and操作,即所有几句中的查询条件都要满足。如下must中是一个数组,每个子查询中就是一个正常的query dsl查询,如必须满足中地址字段中带有公园,remark字段中带有北的数据

GET /zhs_db/_search
{"query": {"bool": {"must": [{"match": {"address": "公园"}},{"match": {"remark": "北"}}]}}
}

shouuld 表示的就是一个or的应用,表示只需要满足其中的一个查询字句就能将结果返回

GET /zhs_db/_search
{"query": {"bool": {"should": []}}
}

2.2,Boosting Query权重查询

权重查询是一种控制手段,通过设置boost权重的值来影响最终的查询结果,权重的设置如下

  • 当设置的boost大于1时,查询的的相关性会提高
  • 当设置的boost大于0而小于1时,查询的相关性会降低
  • 当设置的boost的值为负数时,贡献负分

举一个例子,查询一篇文章时,将会员的文章显示在普通用户文章的前面,如下面的代码,先创建一个文章索引,随后插入两条数据,一条是vip用户的,一条是普通用户的,文章标题一样

PUT /article_db
POST /article_db/_bulk
{"index": {"_id": "1"}}
{"title":"java入门","comment":"精通java","type":"vip"}
{"index": {"_id": "2"}}
{"title":"java入门","comment":"精通java","type":"ordinary"}

那么在查询时,想将vip用户的文章排在前面,就可以直接通过设置这个boost权重进行设置,将vip用户的权重值设置为大于1,这样在算分时,算的分值就更大

GET /article_db/_search
{"query": {"bool": {"should": [{"match": {"title": "java入门"}},{"match": {"type": {"query": "vip","boost": 3}}},{"match": {"type": {"query": "ordinary","boost": 1}}}]}}
}

如下图所示,vip的算分为2.6,而普通用户的算分在1.2。如果算分值一样,谁id小谁在前面

在这里插入图片描述

当然如果查询出了不需要的数据,优先考虑通过过滤去掉数据,再考虑降低其权重

2.3,Dis max query 最佳匹配

通过dis_max以及结合queries进行使用,并且可以通过设置这个tie_breaker来确人是最佳匹配,还是所有的字段的值同等重要

POST /article_db/_search
{"query": {"dis_max": {"queries": [{ "match": { "title": "java" }},{ "match": { "comment":  "java" }}],"tie_breaker": 0.5	//0代表使用最佳匹配;1代表所有语句同等重要。}}
}

但是在实际开发中,更加的推荐通过这个multi_match这个方式来实现这个最佳字段匹配,并且设置这个type类型为 best_fields

POST /article_db/_search
{"query": {"multi_match": {"type": "best_fields","query": "java","fields": ["title","comment"],"tie_breaker": 0.2	//0代表使用最佳匹配;1代表所有语句同等重要。}}
}

除了实现最佳匹配之外,multi_match还实现了最多字段匹配,就是将type的类型设置成 most_fields

GET /titles/_search
{"query": {"multi_match": {"query": "java,"type": "most_fields","fields": ["title","comment"]}}
}

2.4,Cross Field跨字段匹配

如在遇到某些场景,需要结合多个字段的值进行匹配,如省市区,在上面讲了一种copy_to的方式解决这种跨字段匹配的方式,也可以使用这个 Cross Field 实现多字段匹配

如先创建一个address_db的地址索引,随后批量的插入一些数据

PUT /address_db
PUT /address_db/_bulk
{ "index": { "_id": "1"} }
{"province": "广东","city": "深圳","region":"南山"}
{ "index": { "_id": "2"} }
{"province": "广东","city": "深圳","region":"福田"}
{ "index": { "_id": "3"} }
{"province": "广东","city": "深圳","region":"宝安"}
{ "index": { "_id": "4"} }
{"province": "广东","city": "深圳","region":"龙岗"}
}

随后通过这个multi_match多字段查询,并且设置type类型为 cross_fields

GET /address_db/_search
{"query": {"multi_match": {"query": "广东深圳宝安","type": "cross_fields","operator": "and", "fields": ["province","city","region"]}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac之NVM|通过brew安装、更新、卸载、重新安装nvm

文章目录 导文通过brew安装NVM通过brew更新NVM通过brew卸载NVM通过brew重新安装NVM 导文 Mac之NVM 通过brew安装、更新、卸载、重新安装 通过brew安装NVM brew install nvm通过brew更新NVM brew upgrade nvm通过brew卸载NVM brew uninstall nvm通过brew重新安装NVM brew re…

快手协议算法最新版

快手的协议分析是指对快手算法系统进行分析,以了解其推荐内容和个性化用户体验的机制。 然而,一般来说,协议分析的目标是理解算法系统中各个组成部分的功能和作用,以及它们之间的相互关系。以下是一些常见的分析方向:…

Python 自动化(十六)静态文件处理

准备工作 将不同day下的代码分目录管理,方便后续复习查阅 (testenv) [rootlocalhost projects]# ls day01 day02 (testenv) [rootlocalhost projects]# mkdir day03 (testenv) [rootlocalhost projects]# cd day03 (testenv) [rootlocalhost day03]# django-admi…

springboot--多环境配置快速切换开发、测试、生产环境

多环境配置快速切换开发、测试、生产环境 前言1、使用1.1指定环境Profile({"dev","test"})Spring Profiles 提供一个隔离配置的方式,使其仅在特定环境生效 任何Component,Configuration或ConfigurationProperties 可以使用Profile标记&#xff…

损失函数总结(十四):RMSELoss、LogCosh Loss

损失函数总结(十四):RMSELoss、LogCosh Loss 1 引言2 损失函数2.1 RMSELoss2.2 LogCosh Loss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、CrossEntropyLoss、NLLLoss、CTCLoss、PoissonNLLLos…

【2021集创赛】Risc-v杯一等奖:自适应噪声环境的超低功耗语音关键词识别系统

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位:东南大学 队伍名称:Hey Siri 指导老师:刘波 参赛队员:钱俊逸、张人元、王梓羽 总决赛奖项:全国一等奖 摘要…

Redis高可用(主从复制,哨兵,集群)

Redis主从复制 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从…

OpenGL ES相关库加载3D 车辆模型

需求类似奇瑞的这个效果,就是能全方位旋转拖拽看车,以及点击开关车门车窗后备箱等 瑞虎9全景看车 (chery.cn) 最开始收到这个需求的时候还有点无所适从,因为以前没有做过类似的效果,后面一经搜索后发现实现的方式五花八门&#xf…

sqli 靶场 Level23-Level30 wp

level-23 (注释被过滤) 抓包,查看正常请求和响应。 略 尝试是否存在注入 id1’,id1’,成周期性变化 尝试 POC POC: id1andextractValue(1,concat(0x7e,user()))-- 结果:failed。怀疑–被过滤掉了,尝试…

深度学习实战:基于TensorFlow与OpenCV的手语识别系统

文章目录 写在前面基于TensorFlow与OpenCV的手语识别系统安装环境一、导入工具库二、导入数据集三、数据预处理四、训练模型基于CNN基于LeNet5基于ResNet50 五、模型预测基于OpenCV 写在后面 写在前面 本期内容:基于TensorFlow与OpenCV的手语识别系统 实验环境&…

PFMEA详解结构分析——Sun FMEA软件

FMEA从1949年诞生到今天已经发生过多次更新,最新版本是2019年6月发布的《AIAG VDA FMEA手册》。新手册借鉴了AIAG的方框图、参数图、流程图等工具的运用,也借鉴了VDA的五步过程导向法,并在此基础上头尾各增加一步,形成了FMEA七步法…

云原生安全日志审计

记得添加,把配置文件挂载进去 - mountPath: /etc/kubernetes/auditname: audit-policyreadOnly: true.....- hostPath:path: /etc/kubernetes/audit/type: DirectoryOrCreatename: audit-policy/etc/kubernetes/manifests/kube-apiserver.yaml 具体配置文件如下 a…

阿里云2023年双11大促活动优惠券领取与使用及特惠云服务器产品购买规则汇总

2023年阿里云双11大促活动正在火热进行中,今年的双11活动还是延续了去年金秋云创季的活动名称,对于大部分用户来说,最为关心的是活动优惠券与云服务器的优惠政策,在我们领取双11优惠券和购买双11活动云服务器的时候,应…

京东大数据平台(京东数据分析):9月京东牛奶乳品排行榜

鲸参谋监测的京东平台9月份牛奶乳品市场销售数据已出炉! 9月份,牛奶乳品市场销售呈大幅上涨。鲸参谋数据显示,今年9月,京东平台牛奶乳品市场的销量为2000万,环比增长约65%,同比增长约3%;销售额为…

HT3163 免电感滤波 音频功率放大器工作原理

HT3163是一款G效AB/D类音频功率放大器。在D类模式,18V供电、THDN10%条件下,能够持续提供40W/4Ω功率输出。在AB类模式,12V供电、THDN10%条件下,能够持续输出17W/4Ω功率。 HT3163具有防削顶失真(ACF)输出控…

ASO优化之Google Play评分评论的重要性

应用程序的成果不仅仅是拥有功能齐全且无错误的产品,评分和评论会影响谷歌应用商店的排名算法,好评和差评都会影响应用在商店中的排名,这是关于与用户建立信任的一个环节。 1、积极主动地管理评论。 定期监控评论、解决用户问题以及根据反馈…

【嵌入式项目应用】__UART自定义通信协议代码实现方法

目录 前言 一、什么是通信协议 二、简单通信协议的问题 三、通信协议的常见内容 1. 帧头 2. 设备地址/类型 3. 命令/指令 4. 命令类型/功能码 5. 数据长度 6. 数据 7.帧尾 8.校验码 四、通信协议代码实现 1. 消息数据发送 a. 通过串口直接发送每一个字节 b. 通过…

进程地址空间

一 先前问题解释 1 #include<stdio.h>2 #include<unistd.h>3 int g_val 200;4 int main()5 {6 printf("begin");7 int id fork();8 if(id 0)9 {10 g_val 100;11 printf("我是子进程,pid: %d, 父进程:%d, g_v…

急求!录屏在哪里找?看这里就够了

“电脑的录屏在哪里找呀&#xff1f;已经找了一上午了&#xff0c;真的找不到&#xff0c;有哪位大神知道录屏在哪的&#xff0c;帮帮我&#xff0c;非常感谢&#xff01;” 随着社会的发展&#xff0c;录制电脑屏幕的需求变得越来越普遍。无论是在线教学、游戏直播还是远程会…

【Linux】Linux网络总结图详解

网络是进行分层管理的应用层HTTPHTPPS 传输层&#xff08;UDP、TCP&#xff09;UDPTCPTCP和UDP对比 网络层IP 数据链路层&#xff08;MAC&#xff09;/物理层&#xff08;以太网&#xff09;以太网通信&#xff08;负责网卡之间&#xff09; 网络是进行分层管理的 应用层 HTTP…