袁庭新ES系列12节 | Elasticsearch高级查询操作

前言

上篇文章讲了关于Elasticsearch的基本查询操作。接下来袁老师为大家带来Elasticsearch高级查询部分相关的内容。Elasticsearch是基于JSON提供完整的查询DSL(Domain Specific Language:领域特定语言)来定义查询。因此,我们有必要在专题模块来详细探讨Elasticsearch高级查询部分内容。

我们先来做个热身,了解下这一小节学习的目标,我将带领大家从以下五个模块来学习Elasticsearch的高级查询相关技术。

  • 结果过滤查询
  • 条件过滤查询
  • 结果排序
  • 分页查询
  • 高亮显示

一. 结果过滤查询

默认情况下,Elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。

如果我们只想获取其中的部分字段,我们可以添加_source属性来进行过滤。

1.直接指定字段

演示示例:

GET /yx/_search
{"_source": ["title", "price"],"query": {"term": {"price": 2699}}
}

语法说明:在查询结构中,通过_source属性来指定查询结果集中需要保留哪些字段信息。

响应结果:

{"took": 90,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": 1,"_source": {"price": 2699,"title": "小米手机"}}]}
}

运行上述代码响应结果见下:

2.指定includes和excludes

我们也可以通过:

属性

描述

includes

来指定想要显示的字段

excludes

来指定不想要显示的字段

注意:二者都是可选的。

演示示例:

GET /yx/_search
{"_source": {"includes": ["title", "images"]},"query": {"term": {"price": 2699}}
}

响应结果:

{"took": 148,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": 1,"_source": {"images": "http://image.yx.com/12479122.jpg","title": "小米手机"}}]}
}

运行上述代码响应结果见下:

下面的示例与上面的结果将是一样的:

GET /yx/_search
{"_source": {"excludes": ["price"]},"query": {"term": {"price": 2699}}
}

响应结果:

{"took": 6,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 1,"max_score": 1,"hits": [{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": 1,"_source": {"images": "http://image.yx.com/12479122.jpg","title": "小米手机"}}]}
}

运行上述代码响应结果见下:

二. filter过滤

Elasticsearch使用的查询语言(DSL)拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:过滤情况(filtering context)和查询情况(query context)。

如何选择查询与过滤?通常的规则是,使用查询(query)语句来进行全文搜索或者其它任何需要影响相关性得分的搜索。 除此以外的情况都使用过滤(filters)。

1.条件查询中进行过滤

所有的查询都会影响到文档的评分及排名。如果我们需要在查询结果中进行过滤,并且不希望过滤条件影响评分,那么就不要把过滤条件作为查询条件来用。而是使用filter方式:

GET /yx/_search
{"query": {"bool": {"must": {"match": {"title": "小米手机"}},"filter": {"range": {"price": {"gt": 2000.00, "lt": 3800.00}}}}}
}

响应结果:

{"took": 71,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 2,"max_score": 1.1143606,"hits": [{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": 1.1143606,"_source": {"title": "小米手机","images": "http://image.yx.com/12479122.jpg","price": 2699}},{"_index": "yx","_type": "goods","_id": "1","_score": 0.2876821,"_source": {"title": "大米手机","images": "http://image.yx.com/12479122.jpg","price": 2899}}]}
}

运行上述代码响应结果见下:

2.无查询条件直接过滤

如果一次查询只有过滤,没有查询条件,不希望进行评分,我们可以使用constant_score取代只有filter语句的bool查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。

GET /yx/_search
{"query": {"constant_score": {"filter": {"range": {"price": {"gt": 2000.00, "lt": 3800.00}}}}}
}

响应结果:

{"took": 16,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 2,"max_score": 1,"hits": [{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": 1,"_source": {"title": "小米手机","images": "http://image.yx.com/12479122.jpg","price": 2699}},{"_index": "yx","_type": "goods","_id": "1","_score": 1,"_source": {"title": "大米手机","images": "http://image.yx.com/12479122.jpg","price": 2899}}]}
}

运行上述代码响应结果见下:

三. 结果排序

1.单字段排序

sort可以让我们按照不同的字段进行排序,并且通过order属性指定排序的方式。

属性

描述

asc

升序排序

desc

降序排序

演示案例:

GET /yx/_search
{"query": {"match": {"title": "小米手机"}},"sort": [{"price": {"order": "desc"}}]
}

响应结果:

{"took": 31,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 5,"max_score": null,"hits": [{"_index": "yx","_type": "goods","_id": "4","_score": null,"_source": {"title": "Apple手机","images": "http://image.yx.com/12479122.jpg","price": 6899},"sort": [6899]},{"_index": "yx","_type": "goods","_id": "2","_score": null,"_source": {"title": "IPhone手机","images": "http://image.yx.com/12479122.jpg","price": 6299,"stock": 200,"saleable": true,"subTitle": "IPhone 15 Pro"},"sort": [6299]},{"_index": "yx","_type": "goods","_id": "5","_score": null,"_source": {"title": "小米电视4A","images": "http://images.com","price": 3999},"sort": [3999]},{"_index": "yx","_type": "goods","_id": "1","_score": null,"_source": {"title": "大米手机","images": "http://image.yx.com/12479122.jpg","price": 2899},"sort": [2899]},{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": null,"_source": {"title": "小米手机","images": "http://image.yx.com/12479122.jpg","price": 2699},"sort": [2699]}]}
}

2.多字段排序

假定我们想要结合使用price和_score(得分)进行查询,并且匹配的结果首先按照价格排序,然后再按照相关性得分降序排序:

GET /yx/_search
{"query": {"bool": {"must": { "match": { "title": "小米手机" }},"filter": {"range": {"price": {"gt": 2000,"lt": 3000}}}}},"sort": [{ "price": { "order": "desc" }},{ "_score": { "order": "desc" }}]
}

响应结果:

{"took": 10,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 2,"max_score": null,"hits": [{"_index": "yx","_type": "goods","_id": "1","_score": 0.2876821,"_source": {"title": "大米手机","images": "http://image.yx.com/12479122.jpg","price": 2899},"sort": [2899,0.2876821]},{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": 1.1143606,"_source": {"title": "小米手机","images": "http://image.yx.com/12479122.jpg","price": 2699},"sort": [2699,1.1143606]}]}
}

四. 分页查询

Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回。那么,如果要实现分页查询该怎么办呢?

Elasticsearch的分页与MySQL数据库非常相似,都是指定两个值:

属性

描述

from

目标数据的偏移值(开始位置),默认from为0

size

每页大小

演示案例:

GET /yx/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"}}],"from": 1,"size": 3
}

响应结果:

{"took": 17,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 5,"max_score": null,"hits": [{"_index": "yx","_type": "goods","_id": "2","_score": null,"_source": {"title": "IPhone手机","images": "http://image.yx.com/12479122.jpg","price": 6299,"stock": 200,"saleable": true,"subTitle": "IPhone 15 Pro"},"sort": [6299]},{"_index": "yx","_type": "goods","_id": "3","_score": null,"_source": {"title": "小米电视4A","images": "http://image.yx.com/12479122.jpg","price": 3899},"sort": [3899]}]}
}

五. 高亮显示

1.高亮显示原理

高亮显示的原理介绍见下:

  • 服务端搜索数据,得到搜索结果。
  • 把搜索结果中,搜索关键字都加上约定好的标签。
  • 前端页面提前写好标签的CSS样式,即可高亮显示。

Elasticsearch中实现高亮的语法比较简单,高亮显示语法格式见下:

GET /索引库名/_search
{"query": {"match": {"字段": "字段值"}},"highlight": {"pre_tags": "前置标签","post_tags": "后置标签","fields": {"高亮字段名": {}}}
}

在使用match查询的同时,加上一个highlight属性。highlight属性提供以下属性:

属性

描述

pre_tags

前置标签

post_tags

后置标签

fields

需要高亮的字段(例如这里声明title字段需要高亮)

2.高亮显示案例

演示案例:

GET /yx/_search
{"query": {"match": {"title": "手机"}},"highlight": {"pre_tags": "<span>","post_tags": "</span>","fields": {"title": {}}}
}

响应结果:

{"took": 19,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 4,"max_score": 0.2876821,"hits": [{"_index": "yx","_type": "goods","_id": "1","_score": 0.2876821,"_source": {"title": "大米手机","images": "http://image.yx.com/12479122.jpg","price": 2899},"highlight": {"title": ["大米<span>手机</span>"]}},{"_index": "yx","_type": "goods","_id": "lNC7KYUB35ub5htYEZMU","_score": 0.13353139,"_source": {"title": "小米手机","images": "http://image.yx.com/12479122.jpg","price": 2699},"highlight": {"title": ["小米<span>手机</span>"]}},{"_index": "yx","_type": "goods","_id": "2","_score": 0.13353139,"_source": {"title": "IPhone手机","images": "http://image.yx.com/12479122.jpg","price": 6299,"stock": 200,"saleable": true,"subTitle": "IPhone 15 Pro"},"highlight": {"title": ["IPhone<span>手机</span>"]}},{"_index": "yx","_type": "goods","_id": "4","_score": 0.13353139,"_source": {"title": "Apple手机","images": "http://image.yx.com/12479122.jpg","price": 6899},"highlight": {"title": ["Apple<span>手机</span>"]}}]}
}

运行上述代码响应结果见下:

六. 结语

关于Elasticsearch高级查询篇相关的内容我们就给大家介绍完了,来复习回顾下这一章节的主要内容。本文从结果过滤查询、结果排序、分页查询、检索查询、关键字查询、高亮显示、过滤查询等几个方面通过实例讲解了Elasticsearch的高级查询。如果还没有掌握的小伙伴,一定要通过文章中大量的案例来进行实操演练从而巩固这一部分知识。下一小节我们将为大家带来Elasticsearch中聚合操作相关的内容。

今天的内容就分享到这里吧。关注「袁庭新」,干货天天都不断!

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

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

相关文章

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块&#xff1a;管理员登录进入4S…

少儿编程热潮背后的冷思考、是不是“智商税”?

在科技飞速发展的今天&#xff0c;编程已成为一项基础技能&#xff0c;如同数学和语言一样&#xff0c;被认为是未来社会的重要通行证。随之而来的是少儿编程教育的火爆&#xff0c;各种编程班、在线课程如雨后春笋般涌现&#xff0c;吸引了无数家长的目光。然而&#xff0c;这…

测试环境搭建整套大数据系统(七:集群搭建kafka(2.13)+flink(1.14)+dinky+hudi)

一&#xff1a;搭建kafka。 1. 三台机器执行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下俩内容 1.三台机器分别给予各自的broker_id…

MapGIS农业信息化解决方案(2)

农业资源采集与调查 农业各项生产活动与农业资源息息相关,对农业资源进行调查,摸清农业家底, 为构筑农业“一张图”核心数据库奠定数据基础。MapGIS 农业资源采集与调查系统集成遥感、手持终端等调查技术,为农业资源采集提供实用、简捷的采集调查和信息录入工具,实现农田…

PCB设计十大黄金准则

PCB设计十大黄金准则 控制走线长度控制走线长度&#xff0c;顾名思义&#xff0c;即短线规则&#xff0c;在进行PCB设计时应该控制布线长度尽量短&#xff0c;以免因走线过长引入不必要的干扰&#xff0c;特别是一些重要信号线&#xff0c;如时钟信号走线&#xff0c;务必将其…

linux查看socket信息

netstat netstat 是一个用于显示网络相关信息的命令行工具。它可以显示当前系统的网络连接状态、路由表、接口统计信息等。 下面是一些常见的 netstat 命令选项和用法&#xff1a; 显示所有活动的网络连接&#xff1a; netstat -a 显示所有正在监听的端口&#xff1a; ne…

深度学习 精选笔记(4)线性神经网络-交叉熵回归与Softmax 回归

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

现代化数据架构升级:毫末智行自动驾驶如何应对年增20PB的数据规模挑战?

毫末智行是一家致力于自动驾驶的人工智能技术公司&#xff0c;其前身是长城汽车智能驾驶前瞻分部&#xff0c;以零事故、零拥堵、自由出行和高效物流为目标&#xff0c;助力合作伙伴重塑和全面升级整个社会的出行及物流方式。 在自动驾驶领域中&#xff0c;是什么原因让毫末智行…

【设计模式】5种创建型模式详解

创建型模式提供创建对象的机制,能够提升已有代码的灵活性和复用性。 常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。不常用的有:原型模式。一、单例模式 1.1 单例模式介绍 1 ) 定义 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,此模…

Jupyterlab 和 JupyternoteBook 修改默认路径

Jupyterlab 和 JupyternoteBook 修改默认路径 在使用 JupyterLab 或 Jupyter Notebook 进行数据分析、机器学习项目时&#xff0c;经常会遇到需要修改默认工作目录的需求。默认情况下&#xff0c;JupyterLab 和 Jupyter Notebook 会在启动时打开你的用户目录&#xff08;例如&…

Linux 不同架构、不同系统的问题

文章目录 一、麒麟V10&#xff08;kylin&#xff09;操作系统中&#xff0c;sudo执行程序后&#xff0c;其环境变量依然为用户家目录。&#xff08;1&#xff09;背景&#xff08;2&#xff09;原因&#xff08;3&#xff09;解决办法 二、统信&#xff08;UOS&#xff09;操作…

GDB之(1)入门指令参数介绍

GDB之(1)基础入门指令参数介绍 Author&#xff1a;Once Day Date: 2022年7月29日/2024年2月26日 漫漫长路&#xff0c;才刚刚开始… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-CSDN博客 推荐参考文档&#xff1a; GDB: The GNU Project Debugger (sourceware.o…

机器学习 | 基本概念梳理——数据集评估,任务,训练和测试,期望结果

文章目录 1 整体概念梳理1.1 数据集与数据术语——原材料1.2 任务术语——目标1.3 训练和测试术语——怎么做1.4 结果——预期期望 整体框架 机器学习的基本概念全梳理 我们通过一个生动形象的例子来介绍这些概念 我们假设有一个任务是根据地理天气等特征位置预测经纬度 1 整…

2023 re:Invent 用 Amazon Q 打造你的知识库

前言 随着 ChatGPT 的问世&#xff0c;我们迎来了许多创新和变革的机会。一年一度的亚马逊云科技大会 re:Invent 也带来了许多前言的技术&#xff0c;其中 Amazon CEO Adam Selipsky 在 2023 re:Invent 大会中介绍 Amazon Q 让我印象深刻&#xff0c;这预示着生成式 AI 的又一…

VUE从0到1创建项目及基本路由、页面配置

一、创建项目:(前提已经安装好vue和npm) 目录:E:\personal\project_pro\ windows下,win+R 输入cmd进入命令行: cd E:\personal\project_pro E:# 创建名为test的项目 vue create test# 用上下键选择vue2或vue3,回车确认创建本次选择VUE3 创建好项目后,使用…

Nginx之rewrite重写功能

一、rewrite概述 1、rewrite功能 访问重写 rewrite 是 Nginx HTTP 请求处理过程中的一个重要功能&#xff0c;它是以模块的形式存在于代码中的&#xff0c;其功能是对用户请求的 URI 进行 PCRE 正则重写&#xff0c;然后返回 30 重定向跳转或按条件执行相关配置。 Nginx服务…

idea 创建打包 android App

1、使用 idea 创建 android 工程 2、 配置构建 sdk 3、配置 gradle a、进入 gradle 官网&#xff0c;选择 install &#xff08;默认是最新版本&#xff09; b、选择包管理安装&#xff0c;手动安装选择下面一个即可 c、安装 sdk 并通过 sdk 安装 gradle 安装 sdk&#xff1a…

软件无线电SDR加人工智能算法实现无人机频谱探测

通用软件无线电接收机作为传感器实时接收探测无线电信号&#xff0c;加上深度学习算法实现频谱识别&#xff0c;(https://img-blog.csdnimg.cn/5a6c4d89a047453a94f763f4e67aeb17.png)

合并果子(哈夫曼树)NOIP2004提高组

在一个果园里&#xff0c;达达已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。 达达决定把所有的果子合成一堆。 每一次合并&#xff0c;达达可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。 可以看出&#xff0c;所有…