DSL语法、搜索结果处理

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 本节深入探讨Elasticsearch的搜索功能,涵盖DSL与RestClient实现方式。重点解析全文检索(match、multi_match)、精确查询(term、range)、地理坐标查询(geo_distance、geo_bounding_box)及复合查询,结合实例演示语法与应用场景,提升数据检索效率。

在前面的学习中,笔者带领大家完成海量数据导入ES,实现了ES基本的存储功能,但是我们知道ES最擅长的还是搜索、数据分析。所以本节笔者将继续带领大家研究一下ES的数据搜索功能,同上节一样,继续分别采用DSL和RestClient实现搜索。
1.DSL查询文档
elasticsearch的查询依然是基于JSON风格的DSL来实现的。
1.1.DSL查询分类
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
● 查询所有:查询出所有数据,一般测试用。例如:match_all
● 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
○ match_query
○ multi_match_query
● 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
○ ids
○ range
○ term
● 地理(geo)查询:根据经纬度查询。例如:
○ geo_distance
○ geo_bounding_box
● 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
○ bool
○ function_score
查询的语法基本一致:
GET /indexName/_search
{
"query": {
"查询类型": {
"查询条件": "条件值"
}
}
}
我们以查询所有为例,其中:
● 查询类型为match_all
● 没有查询条件
// 查询所有
GET /indexName/_search
{
"query": {
"match_all": {
}
}
}
其它查询无非就是查询类型、查询条件的变化。
1.2.全文检索查询
1.2.1.使用场景
全文检索查询的基本流程如下:
● 对用户搜索的内容做分词,得到词条
● 根据词条去倒排索引库中匹配,得到文档id
● 根据文档id找到文档,返回给用户
比较常用的场景包括:
● 商城的输入框搜索
● 百度输入框搜索
例如京东:

因为是拿着词条去匹配,因此参与搜索的字段也必须是可分词的text类型的字段。
1.2.2.基本语法
常见的全文检索查询包括:
● match查询:单字段查询
● multi_match查询:多字段查询,任意一个字段符合条件就算符合查询条件
match查询语法如下:
GET /indexName/_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
mulit_match语法如下:
GET /indexName/_search
{
"query": {
"multi_match": {
"query": "TEXT",
"fields": ["FIELD1", " FIELD12"]
}
}
}
1.2.3.示例
match查询示例:

GET /hotel182/_search
{
"query": {
"match": {
"name": "如家"
}
}
}

multi_match查询示例:

GET /hotel182/_search
{
"query": {
"multi_match": {
"query": "如家",
"fields": ["brand", "name"]
}
}
}
可以看到,两种查询结果是一样的:因为我们将brand、name、business值都利用copy_to复制到了all字段中。因此你根据三个字段搜索,和根据all字段搜索效果当然一样了。但是,搜索字段越多,对查询性能影响越大,因此建议采用copy_to,然后单字段查询的方式。
1.2.4.总结
match和multi_match的区别是什么?
● match:根据一个字段查询
● multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
1.3.精准查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:
● term:根据词条精确值查询
● range:根据值的范围查询
1.3.1.term查询
因为精确查询的字段搜是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多,反而搜索不到数据。语法说明:
// term查询
GET /indexName/_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
示例:当我搜索的是精确词条时,能正确查询出结果:

精确查询:term查询

GET /hotel182/_search
{
"query": {
"term": {
"brand": {
"value": "希尔33顿"
}
}
}
}
但是,当我搜索的内容不是词条,而是多个词语形成的短语时,反而搜索不到:

1.3.2.range查询
范围查询,一般应用在对数值类型做范围过滤的时候。比如做价格范围过滤。基本语法:
// range查询
GET /indexName/_search
{
"query": {
"range": {
"FIELD": {
"gte": 10, // 这里的gte代表大于等于,gt则代表大于
"lte": 20 // lte代表小于等于,lt则代表小于
}
}
}
}
示例:

精确查询:range查询

GET /hotel182/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
}
}
1.3.3.总结
精确查询常见的有哪些?
● term查询:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段
● range查询:根据数值范围查询,可以是数值、日期的范围
1.4.地理坐标查询
所谓的地理坐标查询,其实就是根据经纬度查询,官方文档:链接,常见的使用场景包括:
● 携程:搜索我附近的酒店
● 滴滴:搜索我附近的出租车
● 微信:搜索我附近的人
附近的酒店:

附近的车:

1.4.1.矩形范围查询
矩形范围查询,也就是geo_bounding_box查询,查询坐标落在某个矩形范围的所有文档:

查询时,需要指定矩形的左上、右下两个点的坐标,然后画出一个矩形,落在该矩形内的都是符合条件的点。
语法如下:
// geo_bounding_box查询
GET /indexName/_search
{
"query": {
"geo_bounding_box": {
"FIELD": {
"top_left": { // 左上点
"lat": 31.1,
"lon": 121.5
},
"bottom_right": { // 右下点
"lat": 30.9,
"lon": 121.7
}
}
}
}
}
这种并不符合“附近的人”这样的需求,所以我们就不做了。
1.4.2.附近查询
附近查询,也叫做距离查询(geo_distance):查询到指定中心点小于某个距离值的所有文档。
换句话来说,在地图上找一个点作为圆心,以指定距离为半径,画一个圆,落在圆内的坐标都算符合条件:

语法说明:
// geo_distance 查询
GET /indexName/_search
{
"query": {
"geo_distance": {
"distance": "15km", // 半径
"FIELD": "31.21,121.5" // 圆心
}
}
}
示例,我们先搜索陆家嘴附近15km的酒店:

发现共有47家酒店。然后把半径缩短到3公里:

相关文章
|
3月前
|
存储 弹性计算 人工智能
2026最新阿里云服务器一年价格:轻量、ECS云服务器和GPU全机型报价单
2026年阿里云服务器最新报价与省钱指南:轻量服务器低至38元/年(新用户秒杀),ECS普惠款99元起;详解5大实测技巧——抢新客权益、选多年付(3年省40%+)、避坑按量付费、叠加优惠券、按需选配。个人、学生、中小企业及企业用户均可精准控本,低成本上云。
883 6
|
机器学习/深度学习 弹性计算 运维
ECS阿里云监控服务
ECS阿里云监控服务
600 3
|
7月前
|
数据采集 人工智能 JavaScript
双解析引擎VS单一架构:DataEyes如何用视觉革命重塑AI数据基建
Jina与DataEyes代表AI数据工具两大技术路径。本文从架构、场景、赋能三维度对比,揭示DataEyes如何通过“视觉+代码”双模解析,提升动态数据捕获效率,实现电商、金融、农业等多行业落地,推动企业级数据获取迈向自动化与智能化。
724 154
|
2月前
|
人工智能 自然语言处理 安全
Dify 官方上架 Higress 插件,轻松接入 AI 网关访问模型服务
Higress 官方推出 Dify 插件,已正式上架 Dify 插件市场。
562 33
|
4月前
|
Java 应用服务中间件 Shell
Apache Tomcat 历史版本下载地址 官网地址
本指南详解Tomcat (以7.0.67为例)的完整部署流程:从官网下载历史版本、解压安装,到启动/停止服务(startup.sh/shutdown.sh),再到配置开机自启(systemctl)。涵盖目录结构说明及端口验证方法,适合Linux服务器快速部署。
878 135
|
12月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1648 1
Spring boot 使用mybatis generator 自动生成代码插件
|
Python
使用 Python 合并微信与支付宝账单,生成财务报告
这篇博客介绍了如何使用 Python 脚本合并微信与支付宝账单数据,生成自动化财务报告。通过 pandas 库,学习如何清洗、合并和分析账单数据,以及如何生成 Markdown 格式的财务报告。
|
数据采集 人工智能 自然语言处理
万字干货|复杂表格多Agent方案:从LLM洞察、系统性 思考到实践经验总结
笔者结合实践经验以近期在负责的复杂表格智能问答为切入点,结合大模型的哲学三问(“是谁、从哪里来、到哪里去”),穿插阐述自己对大模型的一些理解与判断,以及面向公共云LLM的建设模式思考,并分享软件设计+模型算法结合的一些研发实践经验。
1655 43
|
存储 SQL 缓存
Apache Doris 3.0 里程碑版本|存算分离架构升级、湖仓一体再进化
从 3.0 系列版本开始,Apache Doris 开始支持存算分离模式,用户可以在集群部署时选择采用存算一体模式或存算分离模式。基于云原生存算分离的架构,用户可以通过多计算集群实现查询负载间的物理隔离以及读写负载隔离,并借助对象存储或 HDFS 等低成本的共享存储系统来大幅降低存储成本。
1071 0
Apache Doris 3.0 里程碑版本|存算分离架构升级、湖仓一体再进化

热门文章

最新文章