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

入门ElasticSearch :为什么选择ES作为搜索引擎?

介绍

随着数据量的不断增长,搜索和分析大规模数据集变得越来越重要。传统数据库在面对这种需求时往往表现不佳,这时候就需要一种专门用于搜索和分析的引擎。ElasticSearch (简称ES)就是这样一款强大的搜索引擎,它具有许多优势,使得它成为许多企业和开发者的首选。

简单的说:ElasticSearch 是一个实时分布式存储搜索分析的引擎

在我看来ES最强的其实是它的模糊搜索功能。
那有的人就会问了:我数据库一样可以实现模糊搜索啊?

select * from student where name like '%宁正%'

例如这个sql就可以查出姓名中带有宁正两字的学生
的确,这这样做是可以模糊搜索的,但是name like '%宁正%'这种写法它是不走索引的,所以就意味着:如果你的数据量很大比如上千万,上亿条,那你不管如果去优化代码,你的查询也肯定是秒级的

并且还有一个情况,我们大部分搜索的时候,输入的信息其实并不是很准确,例如我想搜索ElasticSearch 有关的信息,但我一不小心打成了ElesticSearch ,如果按sql语句去进行模糊搜索你就无法找到和es有关的信息

所以在这种情况就可以使用ElasticSearch ,它就是为了搜索而生的。

因此,我这边就把es的优点罗列出来,并进行浅显的分析:

ES对于全文的模糊搜索非常擅长

原因:ES是基于倒排索引,使得ES能够快速匹配关键字并返回相关结果,而不需要像传统数据库那样进行全表扫描。倒排索引在存储和查询大规模文本数据时具有较高的效率。

那有些小伙伴看了可能就会问了:倒排索引是什么?倒排索引和正排索引有什么区别?我们日常使用的数据库可以使用倒排索引吗?

那接下来就一个一个回答:

倒排索引是什么?

倒排索引是一种基于关键词的索引结构,常用于全文搜索引擎和信息检索系统中。它是一种将文档中的关键词映射到对应的文档ID的数据结构。

具体来说,倒排索引将文档中的每个关键词与包含该关键词的文档ID建立映射。对于每个关键词,倒排索引记录了出现该关键词的文档列表,包括它们的词频、位置等信息。这使得在给定关键词的情况下,可以快速找到包含该关键词的相关文档。

倒排索引和正排索引有什么区别?

正排索引是一种文档ID进行排序的索引结构,它存储了文档和文档中的每个词条的详细信息。

我有一个通俗易懂的方法来表达:

正排索引就想我们看书时的目录,可以直接通过页码找到对应页码的内容

而倒排索引就是将整本书中的词汇提取出来,并记录改词汇存在于哪些页码中,形成映射关系,当我想要查找一个词汇出现在哪些页中时,便只要根据这个映射表就可以快速找到想要的页数

这么一解释,大家应该就清楚了。

我们日常使用的数据库可以使用倒排索引吗?

实际上,数据库是可以支持倒排索引的,但是与传统的正排索引相比,数据库倒排索引的实现相对有些复杂,而且数据库的主要设计目标是支持高效的数据管理和事务处理,而不是专注于全文搜索等复杂的查询需求

ES的查询语法更灵活,可以精确控制查询条件和权重,以及进行更复杂的模糊搜索

Elasticsearch的查询语法相当灵活,可以根据需要控制查询条件和权重,以及执行诸如布尔查询、范围查询、模糊查询,地理位置等复杂查询。通过使用查询语法,可以实现更精确的搜索。

我这边写一个基于自身地理位置查询的一个demo

geoDistanceQuery是一种地理位置查询,用于查询距离某个地理坐标点一定距离范围内的文档。只需要提供一个地理点的经纬度坐标和一个距离,以及一个单位:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
GeoDistanceQueryBuilder geoQuery = QueryBuilders.geoDistanceQuery("local").point(lat, lon) // 地理位置坐标.distance(distance, DistanceUnit.KILOMETERS); // 查询距离sourceBuilder.query(geoQuery);
SearchRequest searchRequest = new SearchRequest("indexName");
searchRequest.source(sourceBuilder);// 执行查询
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

在上面的demo中,我们创建了一个geoDistanceQuery来查询location字段在给定地理位置坐标的一定距离范围内的文档。这里使用的是公里作为单位。

ES提供了丰富的聚合和分析功能

ES原生的提供了丰富的聚合和分析功能,可以对结果进行聚合分组排序等多种操作,并且ES还提供了许多其他的分析功能,如词频统计日期直方图等。这些功能可以帮助用户更深入地理解数据,生成仪表板和可视化图表。

我在这边也写一个较为简单的demo,看一看就好,详细的之后的博客会讲解

假设我们有一个索引存储了电影信息,包含字段:title(电影标题)、genre(电影类型)和rating(电影评分)。
现在,我们希望对不同类型的电影进行聚合,并计算每个类型的平均评分。
首先,我们需要构建一个聚合查询,指定按genre字段进行分组,并计算每个分组的平均值。

GET movies/_search
{"size": 0,//指定聚合操作的容器"aggs": { //聚合操作起的一个名字"genres": { //指定分组字段的聚合操作类型"terms": { // 指定要分组的字段"field": "genre"},"aggs": {//平均值聚合操作起的一个名字"avg_rating": {//计算均值的聚合操作类型"avg": {//操作的字段"field": "rating"}}}}}
}

在上面的查询中,我们使用terms聚合将电影按照genre字段进行分组,并使用avg聚合计算每个分组的rating字段的平均值。
就会得到以下类似的结果:

"aggregations" : {"genres" : {"buckets" : [{"key" : "Action","doc_count" : 100,"avg_rating" : {"value" : 4.2}},{"key" : "Drama","doc_count" : 80,"avg_rating" : {"value" : 3.8}},...]}
}

Action类的电影有100部平均评分4.2, Drama类的电影有80部平均评分3.8

这只是聚合和分析功能的一个简单示例,实际上ES提供了更多丰富的聚合操作和分析功能,可以根据具体需求进行更复杂的操作

ES使用分布式架构,能够更好地处理大规模数据和高并发查询

ES分布式架构在水平扩展上的表现出色,通过将数据分片存储在多个节点上,ES可以处理大规模数据,并且能够通过并行化查询和分布式计算来提高查询性能。

这个在这就不细讲了,之后具体介绍的是会讲述。

那我们是无脑上ES吗,还是说要在一个特定的情况下呢?

第一个问题的回答,显而易见的当然是不能无脑上ES!

  1. ES虽然功能强大,但也很复杂。使用它需要一定的学习和理解。如果没有适当的培训或经验,可能会遇到配置错误、性能问题、索引和查询错误等
  2. ES是一个分布式系统,需要适当的硬件和资源支持才能正常运行。如果部署不当就会导致性能问题或资源浪费。
  3. ES需要进行适当的管理和维护,包括监控集群健康状况、备份和恢复数据、更新和升级等。如果没有正确进行管理和维护,可能会遇到数据丢失、性能下降或安全风险
  4. 成本!成本!还是成本!

第二个问题,那我们什么时候才要用ES呢?

在我看来可以从以下几个方法来考虑:

  1. 数据规模,如果你要处理的数据高到百万甚至上亿,那你完全可以使用ES来处理大量的数据集
  2. 搜索复杂度,如果你需要经常的对全文数据进行复杂的文本查询和顾虑,那ES是一个比较好的选择
  3. 实时性,如果你需要快速地分析实时数据,那ES是一个合适的选择,它支持实时数据索引和查询,可以在数据到达时即时进行分析和可视化
  4. 分布式和高可用性需求,如果你需要一个可扩展的,具有高可用性和容错性的数据存储和分析解决方案,那ES是一个合适的选择

所以不要因为这个技术比较厉害就无脑的去使用该技术,在使用技术的时候也要考虑到它所带来的风险

相关文章:

入门ElasticSearch :为什么选择ES作为搜索引擎?

介绍 随着数据量的不断增长,搜索和分析大规模数据集变得越来越重要。传统数据库在面对这种需求时往往表现不佳,这时候就需要一种专门用于搜索和分析的引擎。ElasticSearch (简称ES)就是这样一款强大的搜索引擎,它具有许…...

汽车安全及标准

汽车安全及标准 我们的测试系统如何处理整个标准? 您是否需要处理汽车行业的一系列标准? 不同的标准侧重于驱动逆变器的安全性和功能性: 功能安全(ISO 26262)信号和低压车载网络(LV 124、LV 148 和 VDA …...

APP备案流程详细解读

背景介绍 2023年8月4日,工信部发布《工业和信息化部关于开展移动互联网应用程序备案工作的通知》。 在中华人民共和国境内从事互联网信息服务的APP主办者,应当依照《中华人民共和国反电信网络诈骗法》《互联网信息服务管理办法》(国务院令第…...

ES 集群常用排查命令

说明:集群使用非默认端口9200,使用的是7116端口举例 一、常用命令 #1.集群健康状态 [wlsadminelastic-01~]$ curl -XGET "http://10.219.27.00:7116/_cluster/health?pretty" { cluster name":"cluster" "status"…...

Nougat 深度剖析

Nougat 深度剖析 项目地址:https://github.com/facebookresearch/nougat 论文地址:Nougat: Neural Optical Understanding for Academic Documents 0 背景 近日,MetaAI又放了大招,他们提出了一种全新的端到端的OCR模型&#x…...

ffmpeg的使用

本文章记录ffmpeg 源码下载,编译,及使用。 一、FFMPEG 源码下载解压 源码官网地址:http://ffmpeg.org/download.html#releases 下载最新版本ffmpeg6.0。 使用命令tar xvJf ffmpeg-6.0.tar.xz 解压。 二、了解FFMPEG源码 (一&am…...

深度强化学习算法的参数更新时机

深度强化学习算法的参数更新时机 深度强化学习中往往涉及到多个神经网络来拟合策略函数、值函数等,什么时候更新参数因算法而异,与具体算法架构/算法思想紧密相关。 算法参数更新时机架构DQN先收集一定经验,然后每步更新Off Policy Value-B…...

【进阶篇】MySQL的MVCC实现机制详解

文章目录 0.前言1.基础介绍1.1. 什么是MVCC?1.1. 什么是当前读和快照读?1.1. 当前读,快照读和MVCC的关系1.1. MVCC能解决什么问题,好处是?1.1.1. 提高并发性能1.1.2. 避免死锁1.1.3. 解决脏读、不可重复读和幻读等问题1.1.4. 实现…...

Git 命令行查看仓库信息

目录 查看系统config ​编辑查看当前用户(global)配置 查看当前仓库配置信息 查看系统config git config --system --list 1 查看当前用户(global)配置 git config --global --list 1 查到的是email , name 等ssl签名信息&a…...

【爬虫】8.1. 深度使用tesseract-OCR技术识别图形验证码

深度使用tesseract-OCR技术识别图形验证码 文章目录 深度使用tesseract-OCR技术识别图形验证码1. OCR技术2. 准备工作3. 简单作用了解3.1. 验证码图片爬取-screenshot_as_png3.2. 识别测试-image_to_string3.2.1. 正确识别3.2.2. 错误识别3.2.3. 灰度调节 3.3. 识别实战-使用im…...

【PythonRS】基于GDAL修改栅格数据的DN值

遥感工作者离不开栅格数据,有时候我们可能需要修改栅格数据的值,但ENVI和ArcGIS中并没有直接修改DN值的工具,只有栅格计算器、Band math这些工具去计算整个波段的值,或者Edit Classification Image工具可以修改ENVI分类后的像元值…...

mysql课堂笔记 mac

目录 启动mac上的mysql 进入mysql mac windows 创建数据库 创建表 修改字段数据类型 修改字段名 增加字段 删除字段 启动mac上的mysql sudo /usr/local/mysql/support-files/mysql.server start 直接输入你的开机密码即可。 编辑 进入mysql mac sudo /usr/local…...

2023年数学建模国赛A 定日镜场的优化设计思路分析

构建以新能源为主体的新型电力系统,是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件,其底座由…...

【QT】QMessageBox消息框的使用(16)

在实际项目中,弹出消息框是一个很常见的操作,包含错误信息提示、警告信息提示、关于信息提示、还包括判断信息选择等操作,那么今天通过这一节来好好了解下消息框的使用方法。 一.环境配置 1.python 3.7.8 可直接进入官网下载安装&#xf…...

XL-LightHouse 与 Flink 和 ClickHouse 流式大数据统计系统

一个Flink任务只能并行处理一个或少数几个数据流,而XL-LightHouse一个任务可以并行处理数万个、几十万个数据流; 一个Flink任务只能实现一个或少数几个数据指标,而XL-LightHouse单个任务就能支撑大批量、数以万计的数据指标。 1、XL-LightHo…...

【postgresql 基础入门】创建数据库的方法,存储位置,决定自己的数据的访问用户和范围

创建数据库 ​专栏内容: postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君…...

科技云报道:AI时代,对构建云安全提出了哪些新要求?

科技云报道原创。 随着企业上云的提速,一系列云安全问题也逐渐暴露出来,云安全问题得到重视,市场不断扩大。 Gartner 发布“2022 年中国 ICT 技术成熟度曲线”显示,云安全已处于技术萌芽期高点,预期在2-5年内有望达到…...

如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?

:::info 本文是“在Serverless平台上构建AIGC应用”系列文章的第一篇文章。 ::: 前言 随着ChatGPT 以及 Stable Diffusion,Midjourney 这些新生代 AIGC 应用的兴起,围绕AIGC应用的相关开发变得越来越广泛,有呈井喷之势,从长远看这波应用的爆…...

Linux内核源码分析 (B.2)虚拟地址空间布局架构

Linux内核源码分析 (B.2)虚拟地址空间布局架构 文章目录 Linux内核源码分析 (B.2)虚拟地址空间布局架构一、Linux内核整体架构及子系统二、Linux内核内存管理架构 一、Linux内核整体架构及子系统 Linux内核只是操作系统当中的一部分,对下管理系统所有硬件设备&…...

Spring系列文章:Spring使用JdbcTemplate

一、简介 JdbcTemplate是Spring提供的⼀个JDBC模板类&#xff0c;是对JDBC的封装&#xff0c;简化JDBC代码。 当然&#xff0c;你也可以不⽤&#xff0c;可以让Spring集成其它的ORM框架&#xff0c;例如&#xff1a;MyBatis、Hibernate等。 第一步&#xff1a;引入依赖 <d…...

[matlab]cvx安装后测试代码

测试环境&#xff1a; windows10 x64 matlab2023a 代码来自官方网站&#xff1a;CVX: Matlab Software for Disciplined Convex Programming | CVX Research, Inc. m 20; n 10; p 4; A randn(m,n); b randn(m,1); C randn(p,n); d randn(p,1); e rand; cvx_beginva…...

【css】margin:auot什么情况下失效

margin&#xff1a;auto只对块级元素有效果&#xff0c;并且在正常文档流margin&#xff1a;automargin&#xff1a;0 auto&#xff0c;css默认在正常文档流里面margin-top和margin-bottom是0 为什么margin: auto能实现水平居中&#xff0c;而垂直居中不行&#xff1f; 一般子…...

linux的dirty page回写磁盘过程中是否允许并发写入更新page?

概述 众所周知Linux内核write系统调用采用pagecache机制加速写入过程,避免write系统调用长时间block应用进程,用户态进程执行write调用的时候,内核只是将用户态buffer copy到内核的pagecache当中,write系统调用就返回了,完全不需要等待数据完全写入存储设备,因为存储设备…...

Docker-基础命令使用

文章目录 前言命令帮助命令执行示意图docker rundocker psdocker inspectdocker execdocker attachdocker stopdocker startdocker topdocker rmdocker prune参考说明 前言 本文主要介绍Docker基础命令的使用方法。 命令帮助 Docker命令获取帮助方法 # docker -h Flag shor…...

【Python 程序设计】Python 中的类型提示【06/8】

目录 一、说明 二、什么是动态类型&#xff1f; 2.1 为什么要使用类型提示&#xff1f; 2.2 局限性 三、基本类型提示 3.1 声明变量的类型 3.2 函数注释 四、Python 中的内置类型 4.1 原子类型与复合类型 五、函数注释 5.1 如何指定函数的参数类型和返回类型 5.2 在函数签名中…...

78 # koa 中间件的实现

上上节实现了上下文的&#xff0c;上一节使用了一下中间件&#xff0c;这一节来实现 koa 的中间件这个洋葱模型。 思路&#xff1a; 储存用户所有的 callback将用户传递的 callback 全部组合起来&#xff08;redux 里的 compose&#xff09;组合成一个线性结构依次执行&#…...

国产操作系统麒麟v10中遇到的一些问题

下载pycharm&#xff1a;直接在应用商店 目标&#xff1a;主机1安装了虚拟机&#xff0c;主机2要ping通主机1安装的虚拟机。 前提&#xff1a;主机1&#xff0c;主机2在同一局域网下&#xff0c;同一网段。 网络配置 因为虚拟机的网段不在局域网网段内&#xff0c;局域网下…...

Gridea+GitPage+Gittalk 搭建个人博客

&#x1f44b;通过GrideaGitPage 搭建属于自己的博客&#xff01; &#x1f47b;GitPage 负责提供 Web 功能&#xff01; &#x1f63d;Gridea 作为本地编辑器&#xff0c;方便 push 文章&#xff01; &#x1f3f7;本文讲解如何使用 GrideaGitPage 服务域名&#xff08;可选&a…...

代码质量保障第2讲:单元测试 - 浅谈单元测试

代码质量保障第2讲&#xff1a;单元测试 - 浅谈单元测试 本文是代码质量保障第2讲&#xff0c;浅谈单元测试。单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。这是基础&#xff0c;所以围绕着单元测试&#xff0c;我从…...

“五度晟企通”企业发展服务平台正式发布,帮扶企业行稳致远!

在数字中国建设的大背景下&#xff0c;“五度易链”以企业实际发展需求为牵引&#xff0c;以帮扶企业行稳致远为目标&#xff0c;基于全体量产业大数据&#xff0c;运用NLP、AI等新一代信息技术&#xff0c;打造了数字化ToB企业发展服务平台“五度晟企通”&#xff0c;旨在以数…...

广州网站建设电话大全/百度模拟点击

题目&#xff1a;计算阶乘n!n*(n-1)*(n-2)*…3*2*1用递归函数来表示为&#xff1a;def f(x):if x1:return 1return x*f(x-1)代码截图运行结果计算5的阶乘5&#xff01;&#xff0c;运行正确。接着计算大一点的数1000&#xff01;&#xff1a;代码截图运行结果运行结果可以看到运…...

云服务器怎么样做网站/seo整站优化新站快速排名

本文面向需要在不同版本的 TensorFlow 之间向后兼容&#xff08;针对代码或者数据&#xff09;的用户&#xff0c;以及想要修改 TensorFlow 并同时保持兼容性的开发者。 语义化版本控制 2.0 TensorFlow 的公开 API 遵循语义化版本控制 2.0 (semver)。每个版本的 TensorFlow 都采…...

会泽做网站/知乎关键词排名

许可是VDI的关键组件。VMware对Horizon View提供了两个主要的许可选项&#xff1a;单个用户模型和单个并发连接模型。 VMware Horizon View&#xff0c;以前称为VMware View&#xff0c;是Horizon标准版的一部分。因此&#xff0c;希望使用Horizon View的组织必须对Horizon Sta…...

哪个国家的绘本网站做的好/百度怎么搜索网址打开网页

每篇一句 具备了技术深度&#xff0c;遇到问题可以快速定位并从根本上解决。有了技术深度之后&#xff0c;学习其它技术可以更快&#xff0c;再深入其它技术也就不会害怕 相关阅读 【小家Spring】聊聊Spring中的数据转换&#xff1a;Converter、ConversionService、TypeConvert…...

网站建设设计设计公司哪家好/爱站网络挖掘词

在Windows 运维过程中&#xff0c;经常会遇到问题&#xff0c;需要故障重现&#xff0c;以下是模拟操作系统蓝屏的方法&#xff0c;a) 当问题再次发生&#xff0c;我们可以收集full memory dump.配置的具体方法&#xff1a;1. 关闭 ASR 功能 防止计算机在收集dump时重启2. 在系…...

企业做国外网站多少钱/北京seo关键词排名优化软件

函数&#xff1a; heappush(heap, item)&#xff1a;将 item 元素加入堆。heappop(heap)&#xff1a;将堆中最小元素弹出。heapify(heap)&#xff1a;将堆属性应用到列表上。heapreplace(heap, x)&#xff1a;将堆中最小元素弹出&#xff0c;并将元素x 入堆。merge(*iterables…...