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"}}]}
}

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

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

相关文章

25重庆长安深蓝控制器开发面试经验 深蓝最常见面试问题总结

【面试经历】 秋招气氛组选手的第一场面试,9.17网申,9.24电话约面,9.26线上面试。问得很细,全长约1个小时 1. 自我介绍、项目介绍 2.项目细节,遇到了哪些困难;有没有PCB设计经验DC-DC芯片选型,电源噪声的原因、怎么消除、 3.画BUCK和BOOST拓扑图,讲原理 4.了解MCU的主…

西电25考研 VS 24考研专业课大纲变动汇总

01专业课变动 西安电子科技大学专业课学长看到953网络安全基础综合变为 893网络安全基础综合&#xff0c;这是因为工科要求都必须是8开头的专业课&#xff0c;里面参考课本还是没变的&#xff0c;无非就是变了一个名字 对于其他变动专业课也是同理的 02专业课考纲内容变化 对于…

uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app

uniapp一个很是用的功能&#xff0c;就是在我们发布新版本的app后&#xff0c;需要提示用户进行app更新&#xff0c;并告知用户我们新版的app更新信息&#xff0c;以使得用户能及时使用上我们新开发的功能&#xff0c;提升用户的实用度和粘性。注意:这个功能只能在app端使用 效…

创建django项目时,不同的编译类型有什么区别

这里主要提及的是 project venv 和 Custom environment 两种类型。 简单来说&#xff0c;project venv 是Python 3.3及以上版本中自带的虚拟环境管理工具&#xff0c;使用venv可以为每个项目创建一个独立的环境&#xff1a;python -m venv myprojectenv &#xff08;项目名后e…

【3D目标检测】激光雷达和相机联合标定(一)——ROS同步解包

ROS同步解包 引言1 鱼香ROS一键安装ros-docker脚本&#xff1a;2 指定目录映射3 数据解包3.1 解包脚本3.2 依赖安装3.3 运行脚本&#xff0c;解包 引言 总结步骤如下&#xff1a; 采集同步数据&#xff1a;ROS录制&#xff08;推荐&#xff09;&#xff0c;或者代码同步触发采…

如何使用工具删除 iPhone 上的图片背景

在 iPhone 上删除背景图像变得简单易行。感谢最近 iOS 更新中引入的新功能。如今&#xff0c;iOS 用户现在可以毫不费力地删除背景&#xff0c;而无需复杂的应用程序。在这篇文章中&#xff0c;您将学习如何使用各种方法去除 iPhone 上的背景。这可确保您可以选择最适合您偏好的…

通信工程学习:什么是IP网际协议

IP&#xff1a;网际协议 IP网际协议&#xff08;Internet Protocol&#xff0c;简称IP&#xff09;是整个TCP/IP协议栈中的核心协议之一&#xff0c;它负责在网络中传送数据包&#xff0c;并提供寻址和路由功能。以下是对IP网际协议的详细解释&#xff1a; 一、对IP网际协议的…

哈尔滨自闭症学校寄宿条件与优势解析

自闭症儿童的希望之光&#xff1a;广州星贝育园寄宿制学校深度解析 在当今社会&#xff0c;自闭症儿童作为一群需要特别关注和照顾的群体&#xff0c;其教育与康复问题日益受到社会各界的重视。自闭症儿童不仅需要专业的康复训练&#xff0c;还需要一个稳定、温馨且充满爱的环…

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序&#xff1a;所谓的排序&#xff0c;就是使一串记录&#xff0c;按照某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个…

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…

Redis中String类型的常用命令(append,getrenge,setrange等命令)

Redis----String命令 前言.常见的String存储类型. 常见命令1. set 命令2. get 命令3. mget命令与mset命令4. setnx命令5. setex与psetex命令6. incr与incrby与incrbyfloat命令7. decr与decrby命令8. append命令9. getrange和setrange命令10. strlen命令. 前言. 常见的String存…

关于Generator,async 和 await的介绍

在本篇文章中我们主要围绕下面几个问题来介绍async 和await &#x1f370;Generator的作用&#xff0c;async 及 await 的特点&#xff0c;它们的优点和缺点分别是什么&#xff1f;await 原理是什么&#xff1f; &#x1f4c5;我的感受是我们先来了解Generator&#xff0c;在去…

【AI学习】Mamba学习(二):线性注意力

上一篇《Mamba学习&#xff08;一&#xff09;&#xff1a;总体架构》提到&#xff0c;Transformer 模型的主要缺点是&#xff1a;自注意力机制的计算量会随着上下文长度的增加呈平方级增长。所以&#xff0c;许多次二次时间架构&#xff08;指一个函数或算法的增长速度小于二次…

linux下yum安装时出现Loaded plugins: fastestmirror的解决办法

一、centos7修改源 在CentOS 7中&#xff0c;修改系统软件源可以通过编辑/etc/yum.repos.d/目录下的.repo文件来实现。以下是一个基本的步骤和示例代码&#xff0c;用于将默认的软件源修改为阿里云的源。 备份当前的CentOS-Base.repo文件&#xff1a; sudo cp /etc/yum.repos.…

PD协议芯片ECP5701+充电管理芯片+升压芯片搭配应用TYPE-C口充电及升压供电系统

以往的电子设备需要有专门的电源适配器来供电&#xff0c;不仅需要大家区分不同设备的充电器&#xff0c;还要专门找地方来放置&#xff0c;还给用户带来了诸多不便。然而&#xff0c;TYPE-C接口&#xff0c;全称USB Type-C&#xff0c;迅速取代了传统的USB接口&#xff0c;成为…

[linux 驱动]input输入子系统详解与实战

目录 1 描述 2 结构体 2.1 input_class 2.2 input_dev 2.4 input_event 2.4 input_dev_type 3 input接口 3.1 input_allocate_device 3.2 input_free_device 3.3 input_register_device 3.4 input_unregister_device 3.5 input_event 3.6 input_sync 3.7 input_se…

排序算法剖析

文章目录 排序算法浅谈参考资料评价指标可视化工具概览 插入排序折半插入排序希尔排序冒泡排序快速排序简单选择排序堆排序归并排序基数排序 排序算法浅谈 参考资料 数据结构与算法 评价指标 稳定性&#xff1a;两个相同的关键字排序过后相对位置不发生变化时间复杂度空间复…

C# Blazor Server 调用海康H5Player播放摄像头画面

目标 调用海康综合安防平台api&#xff0c;通过摄像头的cameraIndexCode调用【获取监控点预览取流URLv2】api&#xff0c;得到websocket 的url&#xff0c;然后在blazor server中使用htplayer.js播放摄像头实时画面。 步骤 根据摄像头名字&#xff0c;调用【查询监控点列表v2…

python配置环境变量

方法一&#xff1a;首先卸载重新安装&#xff0c;在安装时勾选增加环境变量 方法二&#xff1a;我的电脑-属性-高级系统配置 手动添加环境变量&#xff0c;路径为python的安装路径 检查&#xff1a;查看环境变量是否安装成功 安装第三方lib winr&#xff0c;输入cmd pip ins…

线程互斥函数的例子

代码 #include<stdio.h> #include<pthread.h> #include<sched.h> void *producter_f(void *arg); void *consumer_f(void *arg); int buffer_has_item0; pthread_mutex_t mutex; int running1; int main(void) {pthread_t consumer_t;pthread_t producter_t…