ElasticSearch DSL查询、排序 、分页的原理及语法

1. DSL查询分类和基本语法

ElasticSearch提供了基于Json的DSL来定义查询,常见的查询类型包括:
• 查询所有:查询出所有数据,一般测试用,一般不是查出所有,一次性查询20条。例如 match_all
• 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引中匹配,例如:
match_query、mutil_match_query
• 精确查询:根据精确词条查找数据,一般查找keyword、数值、日期、boolean等类型字段。例如:
ids、range(数字或者日期范围)、term(具体的某一个数字);
• 地理(geo)查询:根据经纬度查询。例如:
geo_diatance、geo_bounding_box
• 复合查询,复合查询可以将上述各种查询条件组合几来,合并查询条件,例如:
bool、function_score。

2. DSL全文检索查询语句

会对用户输入内容分词,常用于搜索框搜索。
match:根据一个字段查询,会对用户输入内容分词,然后去倒排索引库检索,语法:

GET/indexName/_search{
"query":{"match"{   #  查询方式,全文检索"FIELD":"TEXT"  # 字段:查询文本}}
}

multi_match:根据多个字段查询,参与查询字段越多,查询性能越差,语法:

Get/indexName/_search
{
"query":{"multi_match":{"query": "text","fields": ["field1", "field2"]}}
}

如果想要查询多个字段,建议使用match,将多个字段使用copy to的方式拷贝到一个字段中去,创建一个新的字段名。

3. DSL精确查询语句

精确查询一般是查找keyword、数值、日期、boolean等类型字段,所以不会对搜索条件分词,常见的有:
term:根据词条精确值查询,语法如下:

Get/indexName/_search
{"query":{"term"{"FIELD"{"value": "value"}}}
}

range:根据值范围查询,例如根据日期,数值类型查询,语法如下:

Get/indexName/_search
{“query”:{"range":{"FIELD":{"gte": 10,"lte": 20}}}
}
4 .DSL地理查询语句

根据经纬度查询。常见得场景有:
• 携程:搜索我附近的酒店。
• 滴滴:搜索我附近的滴滴。
• 微信:收缩我附近的人。
地理查询的方式有很多总,如下:
• geo_bounding_box:查询geo_point 值落在某个矩形范围的所有文档,语法如下:

GET /indexName/search
{"query":{"geo_bounding_box":{"FIELD":{"top_left":{"lat": 31.1,"lon": 121.5},"bottom_right":{"lat": 30.9,"lon": 121.7}}}}
}

top_left 和bottom_right代表地图上的两个点,以两个点为准,画出一个矩形,查询的是在矩形范围内的文档,如下图所示:
在这里插入图片描述
geo_distance:查询到指定中心点小于某个距离值的所有文档,语法如下:

GET /indexName/_search
{"query":{"geo_distance":{"distance:"15km",    ## 距离"FIELD": "31.21,121.5"   ## 中心点}}
}

如下图所示,查询的就是以31.21,121.5为中心点,小于15Km范围内的所有文档,适合用于查询附近的人的场景:
在这里插入图片描述

5. DSL复合查询

复合查询:可以将其他简单查询组合起来,实现更加复杂的搜索逻辑。

5.1 function score

算分函数查询,可以控制文档相关性算分,控制文档排名。例如,当我们利用match查询时,文件结果会根据与搜索词条的关联度打分,返回结果时按照分值降序排列。
如下图所示,我们搜索 “虹桥如家”,结果如下,会发现包含虹桥如家的分数最高,排在最前面。
在这里插入图片描述

打分的算法如下图所示:
在这里插入图片描述
ES中使用的是BM25算法,BM25算法相对于TF-IDF算法的优势就是,随着词频不断增加,相关性算分不会无限增加,而TF-IDF算法随着词频不断增加,相关性算分会不断无限增加,如下图所示:
在这里插入图片描述
总结:ES中的相关性打分算法在ES5.0之前采用的是TF-IDF,会随着词频增加而越来越大,在ES5.0之后,采用BM25,会随着词频增加而不断增大,但增长曲线会趋于水平。
上面介绍了ES的相关性打分,但是我们可以根据需求修改文档的相关性算分,人为控制排名,根据新得到的算分排序,就需要讲解function score query

5.2 复合查询- function score query

语法:

GET /hotel/_search
{"query":{"function score":{"query":{"match":{"all":"外滩"}}, ## 原始查询条件,搜索文档并根据相关性打分(query score)"functions":[{"filter": {"term":{"id":"1"}},  ## 过滤条件,复合条件的文档才会被重新算分,例如这里是id为1的会重新算分"weight": 10  ## 算分函数,算分函数的结果称为function score,将来会与query score 运算,得到新的算分,常见的算分函数有## 1.weight:给一个常量值,作为函数结果(function score);## 2.field_value_factor:用文档中的某个字段值作为函数结果;## 3. random_score:随机生成一个值,作为函数结果;## 4. script_socre:自定义计算公式,公式结果作为函数结果}],"boost mode":"multiply"## 加权模式,定义function score与query score的运算方式,包括:## 1.multiply:两者相乘。默认就是这个;## 2.replace:用function score 替换 query score;## 3.其他:sum、avg、max、min。}}}

案例:给“如家”这个品牌的酒店排名靠前一些。我们需要考虑function score的三要素:
• 哪些文档需要算分加权?这里就是对应的filter,品牌为如家的需要过滤。
• 算分函数是什么?这里我们可以选择weight算分函数。
• 加权模式是什么?这里对应的就是boost_mode,我们可以选择multiply。
查询语句如下:

GET /hotel/_search
{"query":{"function_score":{"query":{//..·},"functions":[ // 算分函数"filter":{ // 满足的条件,品牌必须是如家"term":{"brand":"如家"}},"weight":2 // 算分权重为2}},"boost_mode": "sum"}}
}
4.5.3 复合查询-Boolean Query

复合查询中的布尔查询是一个或多个查询子句的组合。子句的组合方式有:
• must:必须匹配每个子查询,类似“与”;
• should:选择性匹配子查询,类似“或”;
• must_not : 必须不匹配,不参与算分,类似 “非”;
• filter:必须匹配,不参与算分。
案例,如下图所示:
在这里插入图片描述

6. DSL搜索结果处理
6.1 排序

ES支持对搜索结果的排序,默认是根据相关度算分来排序。一旦指定自己的排序字段,ES就放弃相关度算分,查询的效率也会提升。可以排序的字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。
keyword类型、数值类型、日期类型排序语法:

GET /indexName/_search
{
"query":{"match_all":{}},
"sort":[{"FIELD1": "desc"//排序字段和排序方式ASC、DESC},{"FIELD2": "asc"//排序字段和排序方式ASC、DESC}]}

根据地理坐标排序语法:

GET /indexName/search
{"query":{"match_all":{}},"sort":[{"_geo_distance" :{"FIELD1":"纬度,经度","order" : "asc","unit" :"km"}}]
}
6.2 分页

ES默认情况下只返回top 10条数据。而如果要查询更多数据就需要修改分页参数了。
ES中通过修改from 、size参数来控制要返回的分页结果,语法如下:

GET /hotel/_search
{"query": {"match_all": {}},"from":990,## 分页开始的位置,默认为0;"size":10,## 期望获取的文档总数"sort":[{"price": "asc"}]
}

ES分页使用虽然跟mysql很像,只需要指定from,size即可,但原理和mysql存在较大的差异,ES分页的原理采用的是一种逻辑分页,假如现在
需要查990到1000的文档数据,如下图所示,ES会查出从0-1000的所有数据,然后截出990-1000的文档数据:
在这里插入图片描述
上面这种截取方式对于单个节点的ES是没有问题的,但是在实际情况下,为了能够存储更多的数据,那么ES是会进行集群部署的,一旦进行集群,ES就会对文档数据进行拆分,放到不同的机器上,如下图所示:
在这里插入图片描述
ES是分布式的,所以会面临深度分页的问题,例如现在按照price字段排序后,获取from = 990, size = 10的数据,那么就会获取0到1000的文档数据,然后截取,但是现在有多个ES集群部署了,如果只是截取某一台0-1000数据文档的10条数据那么就存在问题。ES集群情况下分页截取的原理如下:
• 首先在每个集群数据分片上都排序并查询前1000条文档;
• 然后将所有节点的结果聚合,在内存中重新排序选出前1000条文档;
• 最后从这1000条中,选取从990开始的10条文档。

如果搜索页数过深,或者结果集(from+size)越大,对内存和CPU的消耗也越高。因此ES设定结果集查询的上限是10000,一旦超过10000,就会报错,一般我们在实际情况中,从业务层面就限定查询不能超过10000条,如果实际的业务就要查询超过10000条,ES提供了两种解决办法:
• search after:分页时需要排序,原理是从上一次的排序字段后的末尾值开始,走位查询条件,查询下一页数据,分页只能往后翻,不能往前翻。官方推荐使用的方式;
• scroll:原理将排序数据形成快照,保存在内存,对内存消耗非常大。官方已经不推荐使用。

总结:
from + size:
• 优点:支持随机翻页;
• 缺点:深度分页问题,默认查询上限(from+size)是10000场景;
• 百度、京东、谷歌、淘宝这样的随机翻页搜索。
after search :
• 优点:没有查询上限(单次查询的size不超过10000);
• 缺点:只能向后逐页查询,不支持随机翻页;
• 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页。
scroll:
• 优点:没有查询上限(单次查询的size不超过10000);
• 缺点:会有额外内存消耗,并且搜索结果是非实时的
• 场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 aftersearch方案。

6.3 高亮

就是在搜索结果中把搜索关键字突出显示。
原理如下:
• 将搜索结果中的关键字用标签标记出来
• 在页面中给标签添加css样式
语法如下:

GET /hotel/_search
{"query":{"match" :{"FIELD": "TEXT"}},
"highlight": {"fields":{ ## 指定要高亮的字段"FIELD":{"pre_tags": "<em>", ## 用来标记高亮字段的前置标签"post_tags":"</em>” ## 用来标记高亮字段的后置标签}}}}

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

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

相关文章

【webrtc】m77 PacedSender

mediasoup是m77的代码,m77的代码并没有paced controller ,而且与paced sender 的逻辑混在了一起。结合大神们的代码分析,对照m77 进行 理解。m77 有ProbeController。给pacersender 更新飞行数据:PacedSender::InsertPacket(size_t bytes) 对应的是 PacingController::OnPa…

虹科技术丨PTP时钟源设备全攻略:从普通时钟到透明时钟的进阶之路

来源&#xff1a;虹科工业智能互联 虹科技术丨PTP时钟源设备全攻略&#xff1a;从普通时钟到透明时钟的进阶之路 原文链接&#xff1a;https://mp.weixin.qq.com/s/ArBtuLpU6mXax4QWmZDKfQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #PTP #普通时钟 #透明时钟 …

区块链笔记(五)---德勤相关分析报告

web3.0 定义&#xff1a; 在《Insights into a Modern World》提出&#xff0c;“信息将由用户自己发布、保管、不可追溯且永远不会泄露&#xff0c;用户的任何行为将不需要任何中间机构来帮助传递”&#xff1b;用来指代一种区块链技术&#xff0c;可以基于“无须信任的交互…

解决用户留存难!复购低! 作为企业家的你可以看看!

工会排队模式详解 在互联网营销的大潮中&#xff0c;各种促销模式层出不穷&#xff0c;但真正能够吸引消费者并实现双赢的却寥寥无几。工的会排队模式便是在这一背景下应运而生&#xff0c;它巧妙地结合了工会积分、奖金池和排队机制&#xff0c;为消费者和商家带来了全新的体…

助力探索社交出海最短变现路径,融云 1V1 音视频「限时免费」

在社交赛道&#xff0c;1V1 业务是最好的切入点。 对于初创公司来说&#xff0c;1V1 业务的技术成本和运营成本相对可控&#xff0c;并且具备与秀场直播等业务融合拓展的巨大空间。未来&#xff0c;相信 1V1 业务会吸引更多开发者投身其中。 一位社交出海经验丰富的从业者曾在…

PHP+vue+mysql校园论坛bbs系统w076f-

本文尝试以B/S架构设计模式中的vue框架&#xff0c;php语言为基础&#xff0c;通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法&#xff0c;旨在完成一个快速、高效、便捷的BBS论坛系统。本系统以用户与管理员两类人&#xff0c;作为…

【力扣 - 二叉树的直径】

题目描述 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示&#xff1a; 树中节点数目在范围 [1, 10000] 内…

【最新Dubbo3深入理解】Dubbo3核心Tripple协议详解

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

区块链游戏解说:什么是 Planet IX

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;Planet IX Dashboard 什么是 Planet IX Planet IX&#xff0c;一个由原生 IX TOKEN 推动的 Web3 玩赚平台。作为一款 GameFi 策略游戏&#xff0c; Planet IX 上的每项资…

C语言字符串函数strchr与strrchr

注意&#xff1a; 这两个函数的功能&#xff0c;都是在指定的字符串 s 中&#xff0c;试图找到字符 c。strchr() 从左往右找&#xff0c;strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 示例 char *p;p strchr("www.qq.com", .); // 从左…

python自动化接口测试

前几天&#xff0c;同组姐妹说想要对接口那些异常值进行测试&#xff0c;能否有自动化测试的方法。仔细想了一下&#xff0c;工具还挺多&#xff0c;大概分析了一下&#xff1a; 1、soapui:可以对接口参数进行异常值参数化&#xff0c;可以加断言&#xff0c;一般我们会加http…

如何申请试用Gemini 1.5 Pro

https://developers.googleblog.com/2024/02/gemini-15-available-for-private-preview-in-google-ai-studio.html 我开发的chatgpt网站&#xff1a; https://chat.xutongbao.top

浅谈数字信号处理器的本质与作用:从定义、原理到应用场景

数字信号处理器&#xff08;DSP&#xff09;作为一种关键的电子元件&#xff0c;在通信、音频、图像处理等领域扮演着不可或缺的角色。然而&#xff0c;对于许多人来说&#xff0c;数字信号处理器的概念可能依然模糊&#xff0c;其作用和原理也许并不为人所熟知。因此&#xff…

”戏说“ 交换机 与 路由器

一般意义上说 老哥 这文章发表 的 东一榔头 西一锤 呵呵&#xff0c; 想到哪里就啰嗦到哪里 。 交换机&#xff1a; 其实就是在通道交换 路由器&#xff1a; 不光是在通道交换还要在协议上交换 下图你看懂了吗&#xff1f; &#xff08;仅仅数据交换-交换机 协议…

Bert基础(三)--位置编码

背景 还是以I am good&#xff08;我很好&#xff09;为例。 在RNN模型中&#xff0c;句子是逐字送入学习网络的。换言之&#xff0c;首先把I作为输入&#xff0c;接下来是am&#xff0c;以此类推。通过逐字地接受输入&#xff0c;学习网络就能完全理解整个句子。然而&#x…

Eclipse的Java Project的入口main函数

在使用Eclipse创建java project项目的时候&#xff0c;一个项目里面通常只有一个main&#xff0c;那么一个项目里面是否可以有多个main函数呢&#xff1f;其实可以的&#xff0c;但是运行java application的时候要选择执行哪个main函数。 下面举个例子&#xff1a; 1、创建一个…

(二十二)Flask之上下文管理第三篇【收尾—讲一讲g】

目录&#xff1a; 每篇前言&#xff1a;g到底是什么&#xff1f;生命周期在请求周期内保持数据需要注意的是&#xff1a; 拓展—面向对象的私有字段深入讲解一下那句&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域…

Django使用Celery异步

安装包 pip install celerypip install eventlet 1.在项目文件的根目录下创建目录结果 2. 在main.py文件中 # !/usr/bin/env python # -*-coding:utf-8 -*-""" # Author &#xff1a;skyTree # version &#xff1a;python 3.11 # Description&#…

备战蓝桥杯---动态规划(应用2(一些十分巧妙的优化dp的手段))

好久不见&#xff0c;甚是想念&#xff0c;最近一直在看过河这道题&#xff08;感觉最近脑子有点宕机QAQ&#xff09;&#xff0c;现在算是有点懂了&#xff0c;打算记录下这道又爱又恨的题。&#xff08;如有错误欢迎大佬帮忙指出&#xff09; 话不多说&#xff0c;直接看题&…

2024年【T电梯修理】最新解析及T电梯修理操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 T电梯修理最新解析根据新T电梯修理考试大纲要求&#xff0c;安全生产模拟考试一点通将T电梯修理模拟考试试题进行汇编&#xff0c;组成一套T电梯修理全真模拟考试试题&#xff0c;学员可通过T电梯修理操作证考试全真模…