详解SpringCloud微服务技术栈:DSL查询ES文档高级语法、相关性算分数学原理总结

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习
🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch实践1——RestClient操作索引库与文档
📚订阅专栏:微服务技术全家桶
希望文章对你们有所帮助

之前已经使用了DSL实现了索引的增删改查以及文档的增删改,并且通过RestClient进行实现。
但是文档的查询操作很复杂,并且分类比较多,所以先用DSL语句进行各种查询操作的实现,再用RestClient实现各类查询。

DSL查询ElasticSearch文档

  • DSL查询分类和基本语法
  • 全文检索查询
  • 精确查询
  • 地理查询
  • 复合查询
    • 相关性算分
    • Function Score Query
    • Boolean Query

DSL查询分类和基本语法

ElasticSearch提供了基于JSON的DSL来定义查询,常见查询的分类:

1、查询所有:查询出所有数据,一般测试的时候用,例如match_all
2、全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配,例如:
(1)match_query
(2)multi_match_query
3、精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段,例如:
(1)ids
(2)range
(3)term
4、地理(geo)查询:根据经纬度查询,例如:
(1)geo_distance
(2)geo_bounding_box
5、复合(compound)查询:将上述各种查询条件组合起来,合并查询条件,例如:
(1)bool
(2)function_score

基本语法:

GET /indexName/_search
{
	"query": {
		"查询类型": {
			"查询条件": "条件值"
		}
	}
}

如果是查询所有,那么就没有查询的条件,例如:

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

不过这种查询方法,最终显示的结果可能不会全部出来,避免压力过大,至于如何全部搜索出来,后续演示一下分页查询就好了。

全文检索查询

全文检索查询,会对用户输入的内容分词,常用于搜索框搜索:
match查询是全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,例如:

# 将外滩如家分词为外滩和如家进行检索,都包含的酒店排名最高
GET /hotel/_search
{
	"query": {
		"match": {
			"all": "外滩如家"
		}
	}
}

multi_match与match相似,但是允许查询多个字段:

# 查询酒店的品牌和名称是否与“外滩如家”匹配
GET /hotel/_search
{
	"query": {
		"multi_match": {
			"query": "外滩如家",
			"fields": ["brand", "name"]
		}
	}
}

更推荐使用match,要查询的字段之前就已经全部放在all里面了。而multi_match要查询的字段太多,效率会更低下。

精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段,不会对搜索条件做分词。常见的2种:
(1)term:根据词条精确值查询

GET /hotel/_search
{
	"query": {
		"term": {
			"city": {
				"value": "上海"
			}
		}
	}
}

(2)range:根据值的范围查询

# 查询 100<价格<=300 的酒店
GET /hotel/_search
{
	"query": {
		"range": {
			"price": {
				"gt": 100,
				"lte": 300
			}
		}
	}
}

地理查询

根据经纬度查询。常见应用场景包括携程、滴滴、微信等。
geo_bounding_box:选取两个经纬度坐标,并且根据这两个点做矩形,在矩形之内的酒店即为查询结果,比较适合用来查询一定范围内的信息。
geo_distance:查询到指定中心点小于某个距离值的所有文档。

GET /hotel/_search
{
	"query": {
		"geo_distance": {
			"distance": "15km",
			"location": "31.21, 121.5"
		}
	}
}

复合查询

复合查询就是把其它查询组合起来,实现更复杂的搜素逻辑

相关性算分

function score:算分函数查询,可以控制文档相关性算分,控制文档排名。如百度竞价。
简单的算分可以直接算词条的频率:
T F (词条频率) = 词条出现次数 文档中词条总数 TF(词条频率)=\frac{词条出现次数}{文档中词条总数} TF(词条频率)=文档中词条总数词条出现次数
但是当搜索内容里面包括多个词条时,词条就有权重之分了,使用TF-IDF算法
I D F (逆文档频率) = L o g ( 文档总数 包含词条的文档总数 ) s c o r e = ∑ i n T F (词条频率) ∗ I D F (逆文档频率) IDF(逆文档频率)=Log(\frac{文档总数}{包含词条的文档总数})\\ score=\sum_i^nTF(词条频率) * IDF(逆文档频率) IDF(逆文档频率)=Log(包含词条的文档总数文档总数)score=inTF(词条频率)IDF(逆文档频率)
也就是说,这个词条在全部文档中出现的越多,它就越不值钱
当然,现在的ES已经不使用这种算法了,而采用了BM25算法
S c o r e ( Q , d ) = ∑ i n l o g ( 1 + N − n + 0.5 n + 0.5 ) ⋅ f i f i + k 1 ⋅ ( 1 − b + b ∗ d l a v g d l ) Score(Q,d) = \sum_i^nlog(1+\frac{N-n+0.5}{n+0.5}) · \frac{f_i}{f_i+k_1 · (1-b+b*\frac{dl}{avgdl})} Score(Q,d)=inlog(1+n+0.5Nn+0.5)fi+k1(1b+bavgdldl)fi
这个算法具体是怎么样更优秀的大家可以自行推导,看起来复杂但是其实也没有特别的复杂,比起TF-IDF算法,BM25算法受大量词频的影响会小很多,在大量词频的情况下也相对更平滑:
在这里插入图片描述
因此需要记住ES中的相关性打分的算法有哪些,我看一些大厂面试也是会考的,甚至上面的公式也是要会的。

TF-IDF:在ES5.0之前,会随着词频增加而越来越大
BM25:在ES5.0之后,会随着词频的增加而增大,但增长曲线会趋于水平

Function Score Query

使用function score query,可以修改文档的相关性算分(从原有的相关性算法基础上修改),根据新得到的算分排序。
这里直接用例子来进行说明,假设用户要搜索带着“外滩”的酒店,但是因为品牌方为“如家”的酒店跟我是合作关系,我当然就希望查询结果中带“如家”的排名会靠前一点:
在这里插入图片描述
这只是个例子,其使用还有多种重新算分的方法,需要掌握如下几点:

1、query:原始查询,搜索文档并根据相关性来打分(BM25算法),得到query score
2、filter:过滤条件,符合条件的文档才会被重新算分
3、weight:算法函数,算分函数的结果成为function score,将来会与query score运算,得到新算分,常见算分函数:
(1)weight:给一个常量值,作为function score
(2)field_value_factor:将文档中的某个字段值,作为function score
(3)random_score:随机生成一个值,作为function score
(4)script_score:自定义计算公式,公式结果作为function score
4、boost_mode:加权模式,定义query scorefunction score的运算方式:
(1)multiply:默认方式,相乘
(2)replace:用function score替换query score
(3)其他:sum、avg、max、min

总结:

function score query定义的三要素:
(1)过滤条件:决定哪些文档要加分
(2)算法函数:如何计算function score
(3)加权方式:function score与query score如何运算

Boolean Query

布尔查询与function score query不一样,function score query是在原来的算分基础上修改算分。而Boolean Query不会修改算分是一个或多个查询子句的组合。子查询的组合方式有:

must:必须匹配每个子查询,类似“与”
should:选择性匹配子查询,类似“或”
must_not:必须不匹配,不参与算分,类似“非”
filter:必须匹配,不参与算分

must_not和filter可以解决一个问题,子查询过多的时候,参与算分太多就会影响性能,而must_not和filter只会返回匹配和不匹配,却不去具体算分,同时因为几乎没有啥运算,所以ES底层会将其放到缓存中去,因此这两种方法会大大提升性能。例如用户要过滤出酒店价格低于500的,那么只需要将符合条件的呈现就行,没必要去再给价格算分后排个序。

这样的方法常见于搜索中下的筛选按钮,比如筛选出品牌、酒店的星级等(filter或must_not),高效率的先筛选出一部分符合条件的酒店,然后再去搜索框中搜索(must),从而提高整体效率。

例如:搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通信入门系列——高斯白噪声和限带高斯白噪声

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、高斯白噪声 二、复高…

单调栈第二天(还没写完)

503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…

C++位图的应用与布隆过滤器

位图的概念 用每一个二进制比特位来表示某种状态&#xff0c;适用于海量数据&#xff0c;通常用于判断某个数据是否存在 以上面试题可以用位图来解决&#xff1a;用一个二进制比特位来表示数据是否存在--二进制比特位为1表示存在&#xff0c;为0表示不存在 位图的模拟实现 #…

第五篇【传奇开心果】BeeWare的Toga库开发移动应用示例: Local Storage本地数据处理

传奇开心果博文系列 系列博文目录BeeWare的Toga库开发移动应用示例系列博文目录前言一、本地读取存储数据示例二、表格显示本地数据和清除数据示例三、添加本地数据查询功能示例四、添加本地数据修改和删除功能示例五、添加本地数据增加功能示例系列博文目录 BeeWare的Toga库开…

C语言 服务器编程-定时器

定时器 引言定时器的基本逻辑定时器信号事件 引言 传统的TCP socket模型是基于套接字&#xff08;文件描述符&#xff09;来传递消息的&#xff0c;但是文件描述符资是有限的&#xff0c;如果大量的连接占用了大量的文件描述符&#xff0c;那么新来的请求可能就无法申请到文件…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

MySQL数据定义语言DDL

MySQL数据定义语言DDL 目录 MySQL数据定义语言DDLDDL关键字数据定义语言DDL1.查看数据库2.创建库3.删除库4.切换库5.创建表6.删除表7.查看表8.查看表属性9.插入列10.修改列11.设置主键12.设置外键并绑定主键13.设置自增14.删除列15.重命名16.设定默认值17.添加备注18.设置是否可…

完成NAT实验

实验要求&#xff1a; 步骤一&#xff1a;配置vlan vlan b 2 3 interface GigabitEthernet 0/0/2 port link-type access port default vlan 2 interface GigabitEthernet 0/0/3 port link-type access port default vlan 3 interface GigabitEthernet 0/0/1 port link-type…

svg 属性详解:填充与边框

svg 属性详解&#xff1a;填充与边框 1 颜色和透明度2 填充规则 fill-rule3 边框样式3.1 stroke-width3.2 stroke-linecap3.3 stroke-linejoin3.4 stroke-dasharray 1 颜色和透明度 图像都有颜色&#xff0c;svg 中可以使用属性 fill 和 stroke 来修改图形的颜色。fill 属性设置…

真香一个团队协作工具部署

部署 version: "3.4"services:mongo:image: mongocontainer_name: twake-dbvolumes:- /opt/Twake/data:/data/dbnode:image: twaketech/twake-node:latestcontainer_name: twake-webports:- 3345:3000# - 8000:3000environment:- DEVproduction- SEARCH_DRIVERmong…

「 网络安全术语解读 」通用攻击模式枚举和分类CAPEC详解

引言&#xff1a;在网络安全领域&#xff0c;了解攻击者的行为和策略对于有效防御攻击至关重要。然而&#xff0c;攻击模式的描述和分类方式缺乏统一性和标准化。为了解决这个问题&#xff0c;MITRE公司创建了CAPEC标准&#xff0c;以提供一个共享和统一的攻击模式分类框架。 1…

用友U8接口-系统管理(3)

教程目录 部署和简要说明(1) 获取token&数据字段(2) 概括 本文的操作需要正确部署U8HttpApi对本套接口系统管理目录说明 系统管理 获取token 参考获取token 根据sql进行查询 此POST方式接口运行调用者传入SQL语句&#xff0c;或者将SQL语句写到xml文件中&#xff0…

Redis 面试题 | 13.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

如何实现无公网IP实现远程访问MongoDB文件数据库

&#x1f4d1;前言 本文主要是如何实现无公网IP实现远程访问MongoDB文件数据库的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x…

快递对账教程

对企业行政人员来说&#xff0c;快递对账管理&#xff0c;应该是工作中最为头疼之事了。 最开始寄快递还是手写纸质快递单的时候&#xff0c;对企业行政来说&#xff0c;快递对账管理&#xff0c;本来就是一件麻烦事。当时大部分企业采用的都是寄前审批&#xff0c;寄后报销的…

数据结构·顺序表经典例题(双指针)

本节讲解两道顺序表经典例题&#xff0c;运用到了双指针的思想 双指针并不是两个指针&#xff0c;而是用两个类似指针的东西去扫描数组&#xff0c;以达到简化运算的效果 1. 移除元素 OJ链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平…

五、Flask学习之MySQL

五、Flask学习之MySQL 1. 下载MySQL 下载教程&#xff1a;MySQL安装及可视化工具SQLyog下载 2.常用指令 2.1. 查看已有数据库 show databases;2.2. 创建数据库 create database 名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;2.3. 删除数据库 drop database 名字;…

《WebKit 技术内幕》学习之十五(4):Web前端的未来

4 Cordova项目 Cordova是一个开源项目&#xff0c;能够提供将Web网页打包成本地应用格式的可运行文件。读者可能对Cordova项目陌生&#xff0c;但是大家可能对它的前身非常熟悉&#xff0c;那就是PhoneGap项目&#xff0c;它后来被Adobe公司收购。 图15-4描述了Cordova的主要工…

Topaz Video AI:无损放大,让你的视频更清晰!

在当今的数字时代&#xff0c;视频内容的重要性越来越受到人们的关注。无论是在社交媒体上分享生活片段&#xff0c;还是在商业领域中制作宣传视频&#xff0c;人们都希望能够展现出更高质量的视频内容。 然而&#xff0c;由于各种原因&#xff0c;我们经常会面临一个问题&…

港口集装箱堆场温湿度监控MQTT无线传输智能节点

设备互联互通的时代已经到来&#xff0c;不同的设备之间需要实现数据互通&#xff0c;提高生产效率和管理效率。因此&#xff0c;一款功能齐全、性能稳定的设备显得尤为重要。我们来介绍一款4G/5G无线远程io模块。具有8DI兼容干湿节点、4DO继电器、6AI可选电流型4-20mA电压型0-…