ElasticSearch - SpringBoot整合ES之全文搜索匹配查询 match
文章目录
- 1. 数据准备
- 2. match 匹配查询
- 1. 全文检索
- 2. 简化查询DSL语句
- 3. match 匹配查询原理
官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html
权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/structured-search.html
1. 数据准备
官方测试数据下载地址:https://download.elastic.co/demos/kibana/gettingstarted/accounts.zip ,数据量很大,我们自己构造数据吧。
PUT /user/_doc/1
{"first_name" : "John","last_name" : "Smith","age" : 25,"about" : "I love to go rock climbing","interests": [ "sports"]
}PUT /user/_doc/2
{"first_name" : "zhangsan","last_name" : "Smith","age" : 19,"about" : "我是一个安静的人","interests": [ "read" ]
}PUT /user/_doc/3
{"first_name" : "lisi","last_name" : "Alice","age" : 29,"about" : "我喜欢规划自己的生活","interests": [ "sports", "read","music" ]
}
2. match 匹配查询
在匹配之前分析提供的文本,返回与提供的文本、数字、日期或布尔值匹配的文档。 该match查询是执行全文搜索的标准查询,包括模糊匹配选项。
1. 全文检索
① 底层分词器会对查询文本分词,匹配about字段中含有go或者含有rock的文档:
GET /user/_search
{"query": {"match" : {"about" : {"query" : "go rock"}}}
}
② 对应的Java调用:
@Slf4j
@Service
public class ElasticSearchImpl {@Autowiredprivate RestHighLevelClient restHighLevelClient;public void searchUser() throws IOException {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("about","go rock");searchSourceBuilder.query(matchQueryBuilder);SearchRequest searchRequest = new SearchRequest(new String[]{"user"},searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse);}
}
③ 查询的结果:
{"took" : 4,"timed_out" : false,"_shards" : {"total" : 7,"successful" : 7,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.464436,"hits" : [{"_index" : "user","_type" : "_doc","_id" : "1","_score" : 1.464436,"_source" : {"first_name" : "John","last_name" : "Smith","age" : 25,"about" : "I love to go rock climbing","interests" : ["sports"]}}]}
}
2. 简化查询DSL语句
GET /user/_search
{"query": {"match" : {"about" : {"query" : "我是一个"}}}
}
可以简化查询为:
GET /user/_search
{"query": {"match" : {"about" : "我是一个"}}
}
{"took" : 25,"timed_out" : false,"_shards" : {"total" : 7,"successful" : 7,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 2.8478274,"hits" : [{"_index" : "user","_type" : "_doc","_id" : "2","_score" : 2.8478274,"_source" : {"first_name" : "zhangsan","last_name" : "Smith","age" : 19,"about" : "我是一个安静的人","interests" : ["read"]}},{"_index" : "user","_type" : "_doc","_id" : "3","_score" : 0.6810339,"_source" : {"first_name" : "lisi","last_name" : "Alice","age" : 29,"about" : "我喜欢规划自己的生活","interests" : ["sports","read","music"]}}]}
}
3. match 匹配查询原理
查询match的类型为boolean。这意味着对提供的文本进行了分析,分析过程根据提供的文本构造了一个布尔查询。该operator参数可以设置为or或and 来控制布尔子句(默认为or),如果为and代表所有字段都要匹配,如果为or代表匹配分词后的任何一个词。
① 带有operator参数and搜索条件,匹配的文档需要包含文本的所有分词,少一个都不行:
GET /user/_search
{"query": {"match" : {"about" : {"query" : "是一安静个我","operator" : "and"}}}
}
@Slf4j
@Service
public class ElasticSearchImpl {@Autowiredprivate RestHighLevelClient restHighLevelClient;public void searchUser() throws IOException {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("about","是一安静个我");// 设置Operator参数matchQueryBuilder.operator(Operator.AND);searchSourceBuilder.query(matchQueryBuilder);SearchRequest searchRequest = new SearchRequest(new String[]{"user"},searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse);}
}
{"took" : 2,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 2.8478274,"hits" : [{"_index" : "user","_type" : "_doc","_id" : "2","_score" : 2.8478274,"_source" : {"first_name" : "zhangsan","last_name" : "Smith","age" : 19,"about" : "我是一个安静的人","interests" : ["read"]}}]}
}
② 带有operator参数or搜索条件,匹配的文档需要包含文本的任意一个分词:
GET /user/_search
{"query": {"match" : {"about" : "是一个我"}}
}
@Slf4j
@Service
public class ElasticSearchImpl {@Autowiredprivate RestHighLevelClient restHighLevelClient;public void searchUser() throws IOException {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("about","是一个我");// 设置Operator参数matchQueryBuilder.operator(Operator.OR);searchSourceBuilder.query(matchQueryBuilder);SearchRequest searchRequest = new SearchRequest(new String[]{"user"},searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse);}
}
{"took" : 29,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 2.8478274,"hits" : [{"_index" : "user","_type" : "_doc","_id" : "2","_score" : 2.8478274,"_source" : {"first_name" : "zhangsan","last_name" : "Smith","age" : 19,"about" : "我是一个安静的人","interests" : ["read"]}},{"_index" : "user","_type" : "_doc","_id" : "3","_score" : 0.6810339,"_source" : {"first_name" : "lisi","last_name" : "Alice","age" : 29,"about" : "我喜欢规划自己的生活","interests" : ["sports","read","music"]}}]}
}
相关文章:
ElasticSearch - SpringBoot整合ES之全文搜索匹配查询 match
文章目录1. 数据准备2. match 匹配查询1. 全文检索2. 简化查询DSL语句3. match 匹配查询原理官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/index.html权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/…...
句子的改写和扩写
目录 1.句子改写 2.句子扩写 (不低于15个句子算是长句子,不能太多长句子) 1.句子改写 我绝不会嫁给你的。 如果你是世界上最后一个男人,我就去寺庙。 If you married me,I would jump into the well. 如果你嫁给我,我…...
DockerFile创建及案例
DockerFile dockerfile是用来构建docker镜像的文件,命令脚本参数脚本! 构建步骤 编写一个dockerfile文件docker build 构建成为一个对象docker run 运行镜像docker push 发布镜像(DockerHub、阿里云镜像仓库) 去官网Docker-Hub…...
第十四届蓝桥杯三月真题刷题训练——第 1 天
目录 题目1:数列求值 代码: 题目2:质数 代码: 题目3:饮料换购 代码: 题目1:数列求值 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出…...
基于容器云提交spark job任务
容器云提交spark job任务 容器云提交KindJob类型的spark任务,首先需要申请具有Job任务提交权限的rbac,然后编写对应的yaml文件,通过spark内置的spark-submit命令,提交用户程序(jar包)到集群执行。 1、创建任务job提交权限rbac …...
Linux系统调用之目录操作函数
前言 如果,想要深入的学习Linux系统调用中mkdir,rmdir,rename,chdir,getcwd等这些有关于目录操作函数,还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令: man 2 mkdir/rmdir/rename/ch…...
设计模式-策略模式
前言 作为一名合格的前端开发工程师,全面的掌握面向对象的设计思想非常重要,而“设计模式”是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的,代表了面向对象设计思想的最佳实践。正如《HeadFirst设计模式》中说的一句话&…...
面试+算法:罗马数字及Excel列名与数字互相转换
概述 算法是一个程序员的核心竞争力,也是面试最重要的考查环节。 试题 判断一个罗马数字是否有效 罗马数字包含七种字符:I,V,X,L,C,D和M,如下 字符数值I1V5X10L50C100D500M1000…...
Connext DDS路由服务Routing Service(1)
1 简介 RTI路由服务是一种开箱即用的解决方案,允许开发人员快速扩展和集成不同或地理位置分散的实时系统。它跨域、LAN和WAN扩展RTI ConnextDDS应用程序,包括防火墙和NAT穿越。 它还支持DDS到DDS的桥接,允许您对数据进行转换。这允许未修改的DDS应用程序进行通信,即使它们是…...
如何使用SaleSmartly进行Facebook Messenger 营销、销售和支持
如何使用SaleSmartly(ss客服)进行Facebook Messenger 营销、销售和支持上篇文章我们讲了什么是Facebook Messenger CRM以及获得Facebook Messenger CRM的注意事项,现在你有更多时间与客户聊天,让我们看看你如何使用SaleSmartly&am…...
教资教育知识与能力中学教学
目录 3.1 教学概述 3.2 教学过程 3.3 教学原则*【简答/辨析重点】 3.4 教学方法 3.5 教学组织形式 3.6 教学工作基本环节 3.7 教学评价 3.1 教学概述 1、教学的意义【14/18辨析】 教学是传授系统知识、促进学生发展的最有效形式; 教学是学校进行全面发展教…...
IDEA中使用Tomcat的两种方式:集成本地Tomcat使用Tomcat Maven插件
一、前言 在IDEA中创建完一个Maven Web项目,并补齐了目录以后,准备使用Tomcat时,就需要在自己创建的项目中去部署Tomcat,前文已经介绍了如何创建Maven Web,所以这里就不多加赘述,直接讲述部署Tomcat的方法…...
IP 地址的简介
IP 地址 Internet 依靠 TCP/IP 协议,在全球范围内实现不同硬件结构、不同操作系统、不同网络系统的主机之间的互联。在 Internet 上,每一个节点都依靠唯一的 IP 地址相互区分和相互联系,IP 地址用于标识互联网中的每台主机的身份,…...
3D动作/动画特效
硕士/博士符合一本高校人才引进条件的硕士、博士,教研能力突出者可签合作高校正式编制本科/硕士成绩优异专业扎实、有创新思维者可在签约工作后在校继续读研读博【产业模式】数字经济→数字孪生→升级转型【细份领域】数字产业、数字工程、数字教研、数字政企【合作…...
python 多线程编程之_thread模块
_thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁、简单锁、互斥锁、互斥和二进制信号量)。 下面是常用的线程函数: 函数描述start_new_thread(function,…...
vue:vue2与vue3的区别
一、背景 vue2是指的2.X vue3是指的3.0以及更新的版本(3.2版本在script标签里可以写setup,极大的简化了开发) 本文对比两者区别。 二、官网 生命周期选项 | Vue.js API 参考 | Vue.js Vue.js - 渐进式 JavaScript 框架 | Vue.js Vue.…...
SQL数据库语法
目录 1. 常用数据类型 2. 约束 4. 数据库操作 5. 数据表操作 1. 常用数据类型 int 整型double 浮点数varchar 字符型data 年月日datetime 年月日 时分秒2. 约束 主键 primary key : 物理上存储的顺序(存在真实排序), 主键…...
人机界面艺术设计
人机界面艺术设计 2.1人机界面艺术设计思路 人们经常有意通过某种工具或创造来解决难题,然而这并不意味着人们乐于接受别人或其他事情,他们很难提出问题。在用户使用网页或软件的时候,他们有明确的目标,他们利用电脑来帮助自己达…...
【办公类-19-01-02】办公中的思考——Python,统计教职工的姓名中那些字最多?
背景需求:上一篇计算了教职工的姓氏谁最多,col[0]]这一篇统计教职工的(姓氏名字)里面哪些字出现最多。材料准备:1、下载所有员工名单写代码。py 包含”姓氏名字“的重字率统计from pandas import DataFrame, Series im…...
HCIP实验1
实验要求 1 R6为isp, 接口IP地址均为公有地址;该设备只能配置IP地址,之后不能冉对其进行其他任何配置; 2 R1-R5为局域网,私有IP地址192.168.1.0/24, 请合理分配; 3 R1, R2, R4,各有两个环回地址; R5; R6各有一个环回地址;所有路由器上环回均…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
