袁庭新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://xiahunao.cn/news/2812720.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Unity零基础到进阶 | Unity中的 RectTransformUtility 方法整理汇总

Unity零基础到进阶 ☀️| RectTransformUtility 方法整理汇总一、RectTransformUtility 官方文档1.1 RectTransformUtility.CalculateRelativeRectTransformBounds&#xff08;重&#xff09;1.2 RectTransformUtility.FlipLayoutAxes1.3 RectTransformUtility.FlipLayoutOnAxi…

前端-Vue3递归组件自定义Tree

需求 PS&#xff1a;写在前面&#xff0c;需求想要一个Tree 形结构展示当前的组织机构&#xff0c;最末层节点可以选择&#xff0c;层级明确。第一选择网上npm官网或者github 找找成型的东西 element-ui Tree 没有组织结构线js-tree 好看&#xff0c;但是适配Vue3 有点费劲&a…

等时圈API对比

有时候&#xff0c;我们用地图是为了查路线&#xff0c;以及了解到目的地所需要的时间。等时地图可以让你很清楚地了解到路上需要多长时间。 等时地图用不同的颜色表示从固定位置出发需要的时间范围&#xff0c;比如绿色表示10分钟、黄色表示10-20分钟等等。 这种地图一目了然…

卡玛网52. 携带研究材料(第七期模拟笔试)

题目&#xff1a; 代码(首刷看解析&#xff09;&#xff1a; #include<bits/stdc.h> using namespace std;int help(int N, int bagSize, vector<vector<int>>& materals) {vector<int> dp(bagSize 1, 0);for (int i 0; i < N; i) {for (int…

【数据结构】线性表 顺序表(动态、静态分配,插入删除查找基本操作)解析+完整代码

1.线性表的基本概念 定义 线性表&#xff08;Linear List&#xff09;是具有相同数据类型的n个数据元素的有限序列。 n为表长&#xff0c;n0时线性表是个空表 前驱、后继 前驱&#xff1a;其中一个数据元素的前一个元素。第一个元素没有前驱。后继&#xff1a;其中一个数据元素…

Internet协议

文章目录 Internet协议网络层协议IPV4协议IP地址&#xff1a;IPv4数据报格式IP数据报的封装和分片 Internet路由协议路由信息协议RIP开放最短路径优先协议OSPF外部网关协议BGP组播协议PIM和MOSPF ARP和RARPARP协议&#xff1a;RARP协议&#xff1a; Internet控制报文协议ICMPIP…

redis八股

文章目录 数据类型字符串实现使用场景 List 列表实现使用场景 Hash 哈希实现使用场景 Set 集合实现使用场景 ZSet 有序集合实现使用场景 BitMap实现使用场景 Stream使用场景pubsub为什么不能作为消息队列 数据结构机制SDS 简单动态字符串压缩列表哈希表整数集合跳表quicklistli…

数学建模论文、代码百度网盘链接

1.[2018中国大数据年终总决赛冠军] 金融市场板块划分与轮动规律挖掘与可视化问题 2.[2019第九届MathorCup数模二等奖] 数据驱动的城市轨道交通网络优化策略 3.[2019电工杯一等奖] 露天停车场停车位的优化设计 4.[2019数学中国网络数模一等奖] 基于机器学习的保险业数字化变革…

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

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

线激光转台拼接重建

单线激光在进行三维重建的时候每次只能重建一条激光线,为了得到一个完整的物体需要借助外部结构。而基于转台的方式可以很好的完成这一操作。整个系统包括了相机标定、激光线标定与重建、转台标定、转台拼接。将相机和激光器固定在特定位置&#xff0c;然后让转台带动物体进行旋…

消息中间件篇之Kafka-数据清理机制

一、Kafka文件存储机制 Kafka文件存储结构&#xff1a;一个Topic有多个分区。每一个分区都有多个段&#xff0c;每个段都有三个文件。 为什么要分段&#xff1f;1. 删除无用文件方便&#xff0c;提高磁盘利用率。 2. 查找数据便捷。 二、数据清理机制 1.日志的清理策略方案1 根…

运维管理制度优化:确保IT系统稳定运行的关键策略

1、总则 第一条&#xff1a;为保障公司信息系统软硬件设备的良好运行&#xff0c;使员工的运维工作制度化、流程化、规范化&#xff0c;特制订本制度。 第二条&#xff1a;运维工作总体目标&#xff1a;立足根本促发展&#xff0c;开拓运维新局面。在企业发展壮大时期&#x…

服务器被黑该如何查找入侵痕迹以及如何防御攻击

当公司的网站服务器被黑&#xff0c;被入侵导致整个网站&#xff0c;以及业务系统瘫痪&#xff0c;给企业带来的损失无法估量&#xff0c;但是当发生服务器被攻击的情况&#xff0c;作为服务器的维护人员应当在第一时间做好安全响应&#xff0c;对服务器以及网站应以最快的时间…

Java 学习和实践笔记(22):package(包机制)、JDK常见的包、类的导入

前面学的类&#xff0c;每创建一个类&#xff0c;在电脑上就是创建了一个对应的类文件。而package 相当于文件夹对文件的管理作用。主要用于管理类、用于解决类的重名问题。这个含义很简单。因为实际的程序&#xff0c;类可能有成千上万个&#xff0c;这样就需要把不同功能的类…

Vue3 isProxy,isReactive,isReadonly 三者解析

1、isProxy 作用&#xff1a;判断当前数据是否为代理数据。 注意&#xff1a;它只对通过 reactive&#xff0c;readonly&#xff0c;shallowReactive&#xff0c;shallowReadonly 这四个方法包裹的数据返回true&#xff0c;对于 ref 以及通过 new Proxy 代理的数据返回都是fal…

如何使用ArcGIS Pro为栅格图添加坐标信息

在某些时候&#xff0c;我们从网上获取的资源是一张普通的栅格图&#xff0c;没有任何的坐标信息&#xff0c;如果想要和带坐标信息的数据一起使用就需要先添加坐标信息&#xff0c;在GIS上&#xff0c;我们把这个过程叫做地理配准&#xff0c;这里为大家介绍一下地理配准的方法…

【惠友小课堂】骨质疏松≠老年人“专利”,年轻人也不能忽视(文末附自我测试)

虽说现在大家对于骨质疏松并不陌生&#xff0c;许多中老年人甚至年轻人都开始认识到“维护骨骼要趁早”&#xff0c;但依旧有人对骨质疏松存在一些“误解”&#xff0c;今天就来一一解开。&#xff08;PS&#xff1a;文末有骨质疏松自我测试哦~&#xff09; 某在读大学生 “我这…

指针数组,模拟二维指针

arr[i] *(arri) arr为数组首地址&#xff0c;地址后移再解引用等于此地址内容。 模拟二维指针 arr[i][j] *(*(arri)j) 存放数组的指针叫指针数组&#xff0c;先指针后数组

构建高效人才招聘系统:源码开发与技术实践

随着互联网的发展&#xff0c;传统的招聘方式已经无法满足企业快速获取人才的需求。因此&#xff0c;利用现代技术手段构建一套高效的人才招聘系统成为了迫切需要解决的问题。下文&#xff0c;小编将从源码开发与技术实践的角度&#xff0c;为读者呈现如何构建一款高效人才招聘…

通胀变化央行如何应对?Anzo Capital昂首资本只看一个指标

通胀变化央行如何应对&#xff1f;Anzo Capital昂首资本认为通常情况下&#xff0c;如果通胀预期上升&#xff0c;央行会收紧货币政策&#xff0c;而如果通胀压力下降&#xff0c;央行会放松货币政策&#xff0c;从而调节银行体系的流动性&#xff0c;从而因货币贬值而刺激经济…