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

【Elasticsearch】简单搜索(三)

简介:Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点,被广泛用于构建实时搜索、日志分析、数据可视化等应用。

这篇文章主要介绍检索相关的操作,单值、多值、范围、模糊等查询方式,使用bool支持多种条件复杂查询。

一、环境准备

版本

Docker version 20.10.22
elasticsearch:7.13.3
kibana:7.13.3
ps:具体启动命令参考第一篇ES博客

二、数据准备

下载官网测试数据

在ES官网中提供了简单的查询数据。点击下载示例数据 官方测试数据(bank)

使用postman导入到ES中

请求类型:POST
请求地址:http://127.0.0.1:9200/bank/account/_bulk?pretty
请求参数:binary类型,选择导入的json
image.png

Bank索引中的字段类型

执行命令GET bank/_mapping查看bank索引的字段类型为 “text”,在ES中 “text” 类型用于存储长文本数据,并进行全文索引。

address字段为例,其类型为 “text”,其中也存在子字段为 “keyword” 的字段,类型为 “keyword”。“keyword” 类型用于存储关键字或短文本数据,通常用于精确匹配和排序操作。
通过定义子字段,可以在同一个字段上同时使用不同类型的分析器和查询方式。对于 “address” 字段,你可以使用 “text” 类型进行全文搜索,同时也可以使用 “keyword” 类型进行精确匹配和排序。
ps:使用方式为 address.keyword

在这个示例中, “keyword” 子字段还定义了 “ignore_above” 属性,它指定了该子字段中的值超过256个字符时将被截断。这可以用来限制关键字的长度,以便控制索引大小和提高检索性能。

{"bank" : {"mappings" : {"properties" : {"account_number" : {"type" : "long"},"address" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}// 省略其他字段}}}
}

四、标准查询

匹配单个字段

通过以下命令查询索引 bank 中,地址含有 place 字样的数据,返回了 181 条。
此字段为 text,查询时会进行分词匹配,像 282 Kings Place会被ES进行分词,查询条件中含有分词后的单词,所以会被查出来。适合全文检索时使用。

其中 _score 返回值为匹配程度的一个得分,一定程度上讲,分值越大匹配越近似。

GET /bank/_search
{"query": {"match": {"address": "place"}}
}GET /bank/_search
{"query": {"term": {"address": "place"}}
}// 查询结果"hits" : [{"_index" : "bank","_type" : "account","_id" : "20","_score" : 1.7070332,"_source" : {"account_number" : 20,"balance" : 16418,"firstname" : "Elinor","lastname" : "Ratliff","age" : 36,"gender" : "M","address" : "282 Kings Place","employer" : "Scentric","email" : "elinorratliff@scentric.com","city" : "Ribera","state" : "WA"}},

精准匹配单个字段

上述查询在 address 后加上 keyword 的限制,那么这个字段就是 keyword 类型,只能进行精确查询,不再通过分词检索。age本身为数值型字段,不存在分词操作,查询全都是精确匹配。

GET /bank/_search
{"query": {"term": {"address.keyword": "282 Kings Place"}}
}GET /bank/_search
{"query": {"term": {"age": "32"}}
}

多值匹配单个字段

使用 terms 命令,可以对字段进行多种关键词搜索,效果如同关系型数据库的 in 查询。

GET /bank/_search
{"query": {"terms": {"age": ["32","33","34"]}}
}

范围查询

使用 range 关键词。参数含义如下

  • gt - 大于 ( > )
  • gte - 大于且等于 ( >= )
  • lt - 小于 ( < )
  • lte - 小于且等于 ( <= )
GET /bank/_search
{"query": {"range": {"age": {"gte": 32,"lte": 33}}}
}

模糊查询

模糊查询有多重方式,这里介绍两种,一种是模糊,一种是正则

GET /bank/_search
{"query": {"wildcard": {"firstname": {"value": "am*"}}}
}

四 、Bool组合查询

在ES中bool查询就是用来组合布尔查询条件,布尔查询条件,就是类似SQL中的and 、or 。
下面是一个复合查询语句,分别使用了mustfiltermust_notshould。下面的语句相当于SQL

SELECT* 
FROMbank 
WHEREgender = "M" AND state = "IA" AND city != "Healy" OR ( age = 39 OR age = 21)
POST bank/_search
{"query": {"bool": {"must": [{"match": {"gender.keyword": "M"}}],"filter": [{"match": {"state.keyword": "IA"}}],"must_not": [{"match": {"city.keyword": "Healy"}}],"should": [{"match": {"age": "39"}},{"match": {"age": "21"}}]}},"from": 0,"size": 10,"sort": [{"firstname.keyword": {"order": "desc"}}],"aggs": {}
}

查询关键词 Query Action

  1. 布尔查询:must,must_not,should等。类似SQL的and,or,! 等
  2. 匹配查询:match multi_match等。类似SQL的like
  3. 范围查询:range。类似SQL的大于,小于,等于
  4. term查询:term。类似SQL的 “=”
  5. 正则查询:regex 正则
  6. exists和missing查询:类似于SQL is null,is not null

查询语法总结

  • 最外层为query
  • 单重条件查询只需在 query 写入条件,复合查询条件包含在bool对象中

分页查询

from、size 分别对应 page 和 pageSize

排序

排序的写法就如一个对象,对象的 key 为字段名,value为排序规则,当然是可以多字段一起排序的,写入多个即可

查询关键词与分数关系

mustmust查询是必要条件,必须满足。参与相关性评分
filter与must类似,同样必须满足。不参与相关性评分,但结果集会被缓存
should如果只有一个 should 子句情况下与 must 子句结果一样,如果有多个should子句情况下,命中任何一个即可
must_not与must类似,同样必须不满足。不参与相关性评分,但结果集会被缓存

五、总结

  • 在ES中,如同普通SQL语句都有着类似API可以调用。
  • ES支持对内容进行分词,根据分词进行搜索,并对结果进行打分。适合对文章内容进行搜索,而关系型数据库例如 MySQL,对这个功能支持能力不强。
  • 查询语句在query内层套用 bool,可以支持多种条件过滤,同时也可以计算得分。

相关文章:

【Elasticsearch】简单搜索(三)

简介&#xff1a;Elasticsearch&#xff08;ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点&#xff0c;被广泛用于构建实时搜索、日志分析、数据可视化等应用。 这篇文章主要介绍检索相…...

【PMP/软考】软件需求的三个主要层次:业务需求、用户需求和功能需求解释及实例解析

简述 当进行需求分析时&#xff0c;通常着重考虑三个主要层次&#xff1a;业务需求、用户需求和功能需求。业务需求关注项目与组织战略目标的一致性&#xff0c;用户需求明确最终用户的期望&#xff0c;而功能需求定义具体的系统功能和特性。这三个层次为项目管理和软件工程提…...

Linux基础知识 总结

Linux基础知识 总结 1、Clion的简单介绍 CLion是以IntelliJ为基础&#xff0c;专为开发C及C所设计的跨平台IDE&#xff0c;可以在Windows、Linux及MacOS使用&#xff0c;这里我是在ubuntu 16.0.4基础上安装。2、下载 Linux版Clion的.tar.gz的压缩包 wget https://download.j…...

网上申请流量卡要不要身份证?填写的信息安全吗?

网上申请流量卡要不要身份证&#xff1f;当然是要的&#xff01; 现在直接从营业厅办理流量卡的很少了&#xff0c;都是直接在网上申请大流量卡&#xff0c;在这里小编提醒大家&#xff0c;在网上申请大流量卡和激活时都是需要提供个人证件的。 申请时提供身份证号是为了运营…...

关于计算机缺失vcruntime140.dll文件的解决方法分享

在计算机系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;是一种特殊的文件类型&#xff0c;它包含了可以被多个程序共享的代码和数据。其中&#xff0c;VCRuntime140.dll是一个由Microsoft Visual C Redistributable package提供的运行时库文件&#xff0c;它为许多M…...

华为乾坤区县教育安全云服务解决方案(2)

本文承接&#xff1a; https://blog.csdn.net/qq_37633855/article/details/133276200?spm1001.2014.3001.5501 重点讲解华为乾坤区县教育安全云服务解决方案的部署流程。 华为乾坤区县教育安全云服务解决方案&#xff08;2&#xff09; 课程地址解决方案部署整体流程组网规划…...

PL/SQL异常抓取

目录 1. -- 什么是异常 2. 如何捕获预定义异常? 3.捕获异常的两个函数 SQLCODE :为错误代码返回一个数值 SQLERRM : 返回字符串的数据,包含了与错误相关的信息. 1. -- 什么是异常 DECLARE V_JOB EMP.JOB%TYPE; BEGIN SELECT JOB INTO V_JOB FROM EMP WHERE JOB CLERK; D…...

Java 18的未来:新特性和编程实践

文章目录 引言新特性预览1. 基于值的类的进一步改进2. 模式匹配的增强3. 新的垃圾回收器4. 扩展的模块系统5. 更强大的异步编程 编程实践示例1&#xff1a;基于值的类示例2&#xff1a;模式匹配的增强示例3&#xff1a;新的垃圾回收器 结论 &#x1f389;欢迎来到Java学习路线专…...

2024快手校招面试真题汇总及其解答(三)

11. 联合索引 联合索引是指包含多个列的索引,与之概念相对的是单列索引,仅包含一个数据列。在大多数情况下,建立多列索引的好处都要多于单列索引。 联合索引的优点 联合索引的优点如下: 提高查询效率:联合索引可以提高查询效率,特别是对于复杂的查询条件。减少磁盘IO:…...

【QandA C++】内存泄漏、进程地址空间、堆和栈、内存对齐、大小端和判断、虚拟内存等重点知识汇总

目录 内存泄漏 内存模型 、进程地址空间 堆和栈的区别 内存对齐 大端小端及判断 虚拟内存有什么作用 内存泄漏 概念: 是指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况, 内存泄漏并不是指内存在物理上的消失, 而是应用程序分配了某段内存后, 因为设计错误…...

怒刷LeetCode的第12天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;双指针 方法二&#xff1a;KMP算法 方法三&#xff1a;indexOf方法 方法四&#xff1a;Boyer-Moore算法 方法五&#xff1a;Rabin-Karp算法…...

RabbitMQ实现秒杀场景示例

本文章通过MQ队列来实现秒杀场景 整体的设计如下图&#xff0c;整个流程中对于发送发MQ失败和发送到死信队列的数据未做后续处理 1、首先先创建MQ的配置文件 Configuration public class RabbitConfig {public static final String DEAD_LETTER_EXCHANGE "deadLetterE…...

如何提升网站排名优化(百度SEO优化,轻松提升排名)

在当今互联网时代&#xff0c;拥有一个优秀的网站是很重要的。而一个网站如果能够在搜索引擎上的排名很靠前&#xff0c;那么将会带来更多的流量、更多的用户和更多的利润。那么如何提升网站排名优化呢&#xff1f;蘑菇号www.mooogu.cn 百度SEO优化的5个规则 1.关键词选取要合…...

CountDownLatch 和 CyclicBarrier 用法以及区别

在使用多线程执行任务时&#xff0c;通常需要在主线程进行阻塞等待&#xff0c;直到所有线程执行完毕&#xff0c;主线程才能继续向下执行&#xff0c;主要有以下几种可选方式 1. 调用 main 线程的 sleep 方法 一般用于预估线程的执行时间&#xff0c;在主线程内执行线程sleep…...

9.9喝遍“茶、奶、果、酒”,茶饮价格战是因为“无活可整”?

“家人们谁懂啊&#xff0c;周一瑞幸周二奈雪周三茶百道周四库迪周五古茗周六coco&#xff0c;9块9根本喝不完&#xff01;” 紧随咖啡的9.9大战&#xff0c;茶饮们也在今年加速“蜜雪冰城化”&#xff0c;9.9变成了一种潮流。伴随着茶百道、coco、奈雪的茶等品牌把9.9玩出了更…...

echarts 学习网址

1、PPChart 网址&#xff1a;PPChart - 让图表更简单 2、YX-Chartlib 网址&#xff1a;http://chartlib.datains.cn3、isqqw 网址&#xff1a;echarts图表集4、makeapie 网址&#xff1a;makeapie echarts社区图表可视化案例5、Chart.Top 网址&#xff1a;chart.top - 让图…...

android源码编译

整包编译 导入环境变量 source ./build/envsetup.shlunch&#xff1a;选择平台编译选项make&#xff1a;执行编译 编译单个apk 进入到apk mk所在路径 mma...

盘点双电机驱动技术

对于电动汽车来说&#xff0c;双电机相对于单电机加主减速器或变速箱的方案在提高驱动效率方面的优势&#xff1a; 第一&#xff0c;单电机在低速、高速轻载等情况下&#xff0c;效率降低比较严重。 电动机的高效区间虽然比内燃机大得多&#xff0c;但是汽车的转速和转矩要求…...

ubuntu下用pycharm专业版连接AI服务器及其docker环境

一&#xff1a;用pycharm专业版连接AI服务器 1、首先在自己电脑上新建一个文件夹&#xff0c;后续用于映射服务器上自己所要用的项目文件 2、用pycharm专业版打开该文件夹&#xff0c;作为一个项目打开 3、然后在工具->部署->配置 4、配置中形式如下&#xff1a; 点击左…...

IntentFilter笔记

一、action <intent-filter>中可以有多个action&#xff0c;Intent只要匹配其中1个action即匹配成功<intent-filter>没有action&#xff0c;任何Intent无法与之匹配<intent-filter>中有action&#xff0c;Intent中没有action时可以与之匹配成功<intent-fi…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...