当前位置: 首页 > news >正文

Elasticsearch基础_4.ES搜索功能

文章目录

  • 一、搜索辅助功能
    • 1.1、指定返回的字段
    • 1.2、结果计数
    • 1.3、结果分页
  • 二、搜索匹配功能
    • 2.1、查询所有文档
    • 2.2、term级别查询
      • 2.2.1、term查询
      • 2.2.2、terms查询
      • 2.2.3、range查询
      • 2.2.4、exists查询
    • 2.3、布尔查询
      • 2.3.1、must,should,must_not
      • 2.3.2、filter
    • 2.4、全文搜索
      • 2.4.1、match查询
      • 2.4.2、multi_match查询
      • 2.4.3、match_phrase查询
  • 三、按字段值排序

一、搜索辅助功能

1.1、指定返回的字段

  考虑到性能问题,需要对搜索结果进行“瘦身”——指定返回的字段。在ES中,可以通过_source子句可以设定返回结果的字段。_source指向一个JSON数组,数组中的元素是希望返回的字段名称。

GET /hotel/_search
{"_source":["title","city"],"query":{"term":{"city":{"value":"成都"}}}
}

1.2、结果计数

  为提升搜索体验,需要给前端传递搜索匹配结果的文档条数,即需要对搜索结果进行计数。针对这个需求,ES提供了_countAPI功能,在该API中,用户提供query子句用于结果匹配,ES会返回匹配的文档条数。下面的DSL功能会返回城市为“成都”的酒店个数:

GET /hotel/_count
{"query":{"term":{"city":{"value":"成都"}}}
}

返回结果为:

{"_count":3,"_shards":{...}
}

1.3、结果分页

  在实际的搜索应用中,分页是必不可少的功能。用户可以通过fromsize来设置搜索位置和每页显示的文档数量,from表示查询结果的起始下标,默认值为0,size表示从起始下标开始返回的文档个数,默认值为10。例如:

GET /hotel/_search
{"from":0,"size":20,"query":{"term":{"city":{"value":"成都"}}}
}

  在默认情况下,用户最多可以取得10000个文档,如果请求超过该值,ES会返回报错信息。如果确实需要返回多于10000条数据,可以适当调整max_result_window的值:

PUT /hotel/_settings
{"index":{"max_result_window":20000}
}

  注意,如果将配置修改的很大,一定要有足够的硬件作为支撑。

二、搜索匹配功能

2.1、查询所有文档

  在ES中可以使用match_all实现查询所有文档的数据,使用match_all查询文档时,ES不对文档进行打分计算,默认情况下给每一个文档赋予1.0的得分。

GET /hotel/_search
{"_source":["title","city"],"query":{"match_all":{...}}
}

2.2、term级别查询

2.2.1、term查询

  term查询是结构化精准查询的主要查询方式,用于查询待查字段和查询值是否完全匹配,其请求形式如下:

GET /hotel/_search
{"query":{"term":{"${FIELD}":{"value":"${VALUE}"}}}
}

其中FIELD和VALUE分别代表字段名称和查询值,例如搜索城市为成都的酒店:

GET /hotel/_search
{"query":{"term":{"city":{"value":"成都"}}}
}

2.2.2、terms查询

  terms查询是term查询的扩展形式,用于查询一个或多个值与待查字段是否完全匹配,以下是搜索城市为“北京”或者“成都”的酒店实例:

GET /hotel/_search
{"query":{"terms":{"city":["北京","成都"]}}
}

2.2.3、range查询

  range查询用于范围查询,一般是对数值型和日期型数据的查询使用range进行范围查询时,用户可以根据需求中是否包含边界数值进行选项设置可供组合的选项如下:

  • gt:大于
  • lt:小于
  • gte:大于或等于
  • lte:小于或等于

  以下为数值类型的查询示例,查询住宿价格大于300(不包含边界值)的酒店:

GET /hotel/_search
{"query":{"range":{"price":{"gt":300}}}
}

2.2.4、exists查询

  在某些场景下,我们希望找到某个字段不为空的文档,可以使用exists搜索,字段不为空的条件有:

  • 值存在且不为null
  • 值不是空数组
  • 值是数组,但不是[null]

例如:

GET /hotel/_search
{"query":{"exists":{"field":"tag" //字段名}}
}

2.3、布尔查询

  复合搜索,顾名思义,是一种在一个搜索语句中包含一种或多种搜索子句的查询,布尔查询是常用的复合查询。它把多个子查询组合成一个布尔表达式,这些子查询之间的逻辑关系是,即所有子查询的结果都为true,布尔查询的结果才为真。

  布尔查询支持的子查询有四种,各子查询的名称和功能如下所示:

  • must:必须匹配该查询条件
  • should:可以匹配该查询条件
  • must_not:必须不匹配该查询条件
  • filter:必须匹配过滤条件,不进行打分计算

2.3.1、must,should,must_not

  这三种查询ES会将子查询与文档的匹配程度值加入到总得分里,搜索时后面都可以包含一个数组,例如:

GET /hotel/_search
{"query":{"bool":{"must":[                  // must查询,数组内可以封装各类子查询{                       // 第一个子查询:城市为成都"term":{"city":{"value":"成都"}}},{                       // 第二个子查询:价格>=350且价格<=450"range":{"price":{"gte":350,"lte":450}}}]}}
}

2.3.2、filter

  filter查询即过滤查询,该查询是布尔查询里非常独特的一种查询,其他布尔查询关注的是查询条件和文档的匹配程度,并按照匹配程度进行打分。而filter查询关注的是查询条件和文档是否匹配,不进行相关的打分计算(这可以减少不小的时间开销),但是会对部分匹配结果进行缓存

GET /hotel/_search
{"query":{"bool":{"filter":[                // filter查询,数组内可以封装各类子查询{                       // 第一个子查询:城市为成都"term":{"city":{"value":"成都"}}},{                       // 第二个子查询:价格>=350且价格<=450"range":{"price":{"gte":350,"lte":450}}}]}}
}

2.4、全文搜索

  不同于结构化搜索,全文搜索首先对查询词进行分析,然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据(text类型)。结构化搜索关注的是数据是否匹配,全文搜索关注的是匹配的程;结构化搜索一般用于精确匹配,而全文搜索用于部分匹配。

2.4.1、match查询

  match查询是全文搜索的主要代表。对于最基本的match搜索来说,只要分词结果中的一个或者多个词在文档中存在即可,例如搜索金都酒店:

GET /hotel/_search
{"_source":["title"],        //只返回title字段"query":{"match":{                 //匹配title字段为“金都酒店”的文档"title":"金都酒店"}} 
}

或者按照如下方式搜索:

GET /hotel/_search
{"_source":["title"],        //只返回title字段"query":{"match":{                 //匹配title字段为“金都酒店”的文档"title":{"query":"金都酒店"}}} 
}

2.4.2、multi_match查询

  有时用户需要在多个字段中查询关键词,除了使用布尔查询封装多个match查询之外,可替代的方案是使用multi_match。可以在multi_match的query子句中组织数据匹配规则,并在fields子句中指定需要搜索的字段列表:

GET /hotel/_search
{"_source":["title","amenities"],        //匹配的关键字为“假日”"query":{"multi_match":{                       //设置匹配的字段为title和amenities"query":"假日","fields":["title","amenities"]}} 
}

2.4.3、match_phrase查询

  match_phrase用于匹配短语,与match查询不同的是,match_phrase用于搜索确切的短语或临近的词语。

三、按字段值排序

  在默认情况下,ES对搜索结果是按照相关性降序排序的,有时需要按照某些字段的值进行升序或者降序排序。ES提供了sort子句,可以对数据进行排序。sort子句一般是按照字段信息进行排序,不受相关性影响,而且打分步骤需要耗费一定的硬件资源和时间,因此默认情况下不对文档进行打分

  使用sort字句对字段值进行排序时,需要指定排序的字段。ES默认的是按照字段值进行升序,排序可以设置sort参数为ascdesc,指定按照字段值进行升序或者降序排序。

  以下示例为搜索名称包含“金都”的酒店,并对酒店按照价格进行降序排列:

GET /hotel/_search
{"_source":["title","price"],        //只返回部分字段"query":{                           //搜索条件"match":{                      "title":"金都"}},{"sort":[                          //按照价格降序排序{"price":{"order":"desc"}}]}
}

相关文章:

Elasticsearch基础_4.ES搜索功能

文章目录 一、搜索辅助功能1.1、指定返回的字段1.2、结果计数1.3、结果分页 二、搜索匹配功能2.1、查询所有文档2.2、term级别查询2.2.1、term查询2.2.2、terms查询2.2.3、range查询2.2.4、exists查询 2.3、布尔查询2.3.1、must&#xff0c;should&#xff0c;must_not2.3.2、f…...

Elasticsearch要点简记

Elasticsearch要点简记 1、ES概述2、基础概念&#xff08;1&#xff09;索引、文档、字段&#xff08;2&#xff09;映射&#xff08;3&#xff09;DSL 3、架构原理4、索引字段的数据类型5、ES的三种分页方式&#xff08;1&#xff09;深度分页&#xff08;fromsize&#xff09…...

【通信协议】IIC通信协议详解

IIC&#xff08;Inter-Integrated Circuit&#xff09;通信协议&#xff0c;又称为I2C&#xff08;Inter-Integrated Circuit 2&#xff09;协议&#xff0c;是一种广泛使用的串行通信协议。它由Philips Semiconductor&#xff08;现NXP Semiconductors&#xff09;开发&#x…...

2024年中国科技核心期刊目录(社会科学卷)

2024年中国科技核心期刊目录 &#xff08;社会科学卷&#xff09; 序号 期刊代码 期刊名称 1 SC02 JOURNAL OF S…...

用Python集成免费IP归属地查询API

IP查询的优势是什么&#xff1f; IP查询是一种强大的工具&#xff0c;能够快速提供关于IP地址的信息&#xff0c;如地理位置、互联网服务提供商&#xff08;ISP&#xff09;、连接类型等。这些数据在多种场景下都非常有用&#xff0c;帮助用户理解网络环境和用户行为。 首先&…...

C 数组

C 数组 数组是C语言中的一种基本数据结构&#xff0c;用于存储一系列相同类型的数据。它是连续的内存分配&#xff0c;允许通过索引快速访问元素。本文将详细介绍C数组的概念、使用方法、以及注意事项。 1. 数组的概念 数组是一个集合&#xff0c;可以存储一定数量的元素。在…...

【Unity】unity安卓打包参数(个人复习向/有不足之处欢迎指出/侵删)

1.Texture Compression 纹理压缩 设置发布后的纹理压缩格式 Use Player Settings:使用在播放器设置中设置的纹理压缩格式 ETC&#xff1a;使用ETC格式&#xff08;兼容&#xff09; ETC2&#xff1a;使用ETC2格式&#xff08;很多设备不支持&#xff09; ASTC&#xff1a;使用…...

C0016.Clion中qDebug()打印输出中文时,都是问号??????的解决办法

问题描述 在clion中使用qDebug打印输出中文内容时&#xff0c;都是&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;如下图&#xff1a; 注意&#xff1a;修改该文件的编码格式就行&#xff0c;该文件名为apr.cpp&#xff1b; 解决办法...

C++ priority_queue 优先队列构造大根堆和小根堆

priority_queue的三个参数 template <class T, class Container std::vector<T>, class Compare std::less<typename Container::value_type>> class priority_queue;1、元素类型 2、底层容器类型&#xff0c;默认vector 3、比较函数&#xff08;传入的是…...

音视频入门基础:FLV专题(9)——Script Tag简介

一、SCRIPTDATA 根据《video_file_format_spec_v10_1.pdf》第75页到76页&#xff0c;如果某个Tag的Tag header中的TagType值为18&#xff0c;表示该Tag为Script Tag&#xff08;脚本Tag&#xff0c;又称Data Tag、SCRIPTDATA tag&#xff09;。这时如果Filter的值不为1表示未加…...

Vue页面,基础配置

最简单页面 日期范围及字符搜索&#xff0c;监听器处理日期范围搜索控件清空重置问题导出、导出文件文件名称带日期时间表格日期指定格式显示。。。 <template><div class"app-container"><el-form :model"queryParams" ref"queryForm…...

(杨辉三角) 攻防世界--->notsequence

学习笔记。(不想看可以直接跳正文。) 前言&#xff1a;仿佛又回到高中 - - 只不过&#xff0c;是以另一种形式再次出现。 学习思维为主&#xff0c;做题位次。&#xff08;后面再补。&#xff09; 前置知识&#xff1a; 什么是杨辉三角&#xff1a; 杨辉三角_百度百科 (bai…...

【CTF Web】Pikachu CSRF(get) Writeup(CSRF+GET请求+社会工程学)

CSRF(跨站请求伪造)概述 Cross-site request forgery 简称为“CSRF”&#xff0c;在CSRF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09;&#xff0c;然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击就完成…...

智能工厂的软件设计 作为“程序Program”的中台 之2

Q11、现在&#xff0c;我们再重新理解一下前面所说&#xff1a;三种中台&#xff08;数据中台、技术中台和业务中台&#xff09;作为这个整体的三个整子Holon&#xff0c;合起来是一个 融合了三分法&#xff08; 三分部 的三个中台构成三段式 程序框架&#xff0c;分别用 <h…...

GB28181信令交互流程及Android端设备对接探讨

GB28181规范必要性 好多开发者在做比如执法记录仪、智能安全帽、智能监控等设备端视频回传技术方案选型的时候&#xff0c;不清楚到底是用RTSP、RTMP还是GB28181&#xff0c;对GB28181相对比较陌生&#xff0c;我们就GB28181规范的必要性&#xff0c;做个探讨&#xff1a; 实现…...

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…...

c语言学习(书本目录)

关键字 变量 3.typedef的使用&#xff1a; 定义一个结构体&#xff0c;名字是Person&#xff1a; struct Person { char name[50]; int age; }; 给结构体取一个别名&#xff1a;struct Person---》Person typedef struct Person Person; 上面带标签的结构体等效于 …...

2024年最新版本神马TV8.5影视APP源码 293TV影视点播系统源码搭建教程 神马TV8.2加强版反编译教程 保姆级小白可搭建 完整版本视频教程

2024年最新版的神马TV影视APP源码&#xff0c;版本号8.5&#xff0c;提供了前所未有的定制化选项和高级功能。用户可以轻松更换应用的包名和名称&#xff0c;确保品牌个性化。此外&#xff0c;该应用采用了动态域名加密技术&#xff0c;增强了数据传输的安全性。它支持自动切换…...

衍生品交易的隐藏风险:认识CCR和xVA

作为一名资深的量化交易专家和金融自媒体人&#xff0c;我经常被问到&#xff1a;"衍生品交易真的像传说中那么危险吗&#xff1f;"这个问题背后&#xff0c;隐藏着许多投资者对金融市场的担忧和好奇。今天&#xff0c;让我们一起揭开衍生品交易中两个关键概念的面纱…...

我的项目管理生涯

1 前言 从好几年前就想写几篇关于自己职业生涯的文章了&#xff0c;一直由于各种原因没有写成&#xff0c;正好借新的工作机会&#xff0c;尤其是项目管理这段工作经历&#xff0c;计划通过这一二篇文章进行总结和反思一下&#xff0c;以期更顺利的开展相关工作或是自己能更上…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...