分布式搜索引擎ElasticSearch

简介: ElasticSearch是基于Lucene的分布式开源搜索引擎,支持海量数据的快速检索、日志分析与实时监控。通过倒排索引实现高效模糊查询,结合Kibana、Logstash等组件构成ELK技术栈,广泛应用于搜索、日志统计与系统监控场景。

分布式搜索引擎ElasticSearch

  1. 初识elasticsearch
    1.1.了解ES
    1.1.1.elasticsearch的作用
    elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容,例如:
    在GitHub搜索代码
    在电商网站搜索商品
    在百度搜索答案
    在打车软件搜索附近的车
    1.1.2.ELK技术栈
    elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。 被广泛应用在日志数据分析、实时监控等领域:
    而elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。
    1.1.3.elasticsearch和lucenee
    elasticsearch底层是基于lucene来实现的。 Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。 官网地址:https://lucene.apache.org/
    elasticsearch的发展历史:
    2004年Shay Banon基于Lucene开发了Compass
    2010年Shay Banon 重写了Compass,取名为Elasticsearch。
    1.1.4.为什么不是其他搜索技术?
    目前比较知名的搜索引擎技术排名:
    虽然在早期,Apache Solr是最主要的搜索引擎技术,但随着发展elasticsearch已经渐渐超越了Solr,独占鳌头:
    1.1.5.总结
    什么是elasticsearch?
    一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能
    什么是elastic stack(ELK)?
    是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
    什么是Lucene?
    是Apache的开源搜索引擎类库,提供了搜索引擎的核心API
    1.2.倒排索引
    倒排索引的概念是基于MySQL这样的正向索引而言的。
    1.2.1.正向索引
    那么什么是正向索引呢? 例如给下表(tb_goods)中的id创建索引:
    如果是根据id查询,那么直接走索引,查询速度非常快。 但如果是基于title做模糊查询,只能是逐行扫描数据,流程如下:
    1)用户搜索数据,条件是title符合"%手机%"
    2)逐行获取数据,比如id为1的数据
    3)判断数据中的title是否符合用户搜索条件
    4)如果符合则放入结果集,不符合则丢弃。 回到步骤1
    逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。 当数据量达到数百万时,就是一场灾难。
    1.2.2.倒排索引
    倒排索引中有两个非常重要的概念:
    文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。 例如一个网页、一个商品信息
    词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。 例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
    创建倒排索引是对正向索引的一种特殊处理,流程如下:
    将每一个文档的数据利用算法分词,得到一个个词条
    创建表,每行数据包括词条、词条所在文档id、位置等信息
    因为词条唯一性,可以给词条创建索引,例如hash表结构索引
    如图:
    倒排索引的搜索流程如下(以搜索"华为手机"为例):
    1)用户输入条件"华为手机"进行搜索。
    2)对用户输入内容分词,得到词条:华为、手机。
    3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。
    4)拿着文档id到正向索引中查找具体文档。
    如图:
    虽然要先查询倒排索引,再查询倒排索引,但是无论是词条、还是文档id都建立了索引,查询速度非常快! 无需全表扫描。
    1.2.3.正向和倒排
    那么为什么一个叫做正向索引,一个叫做倒排索引呢?
    正向索引是最传统的,根据id索引的方式。 但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。
    而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。 是根据词条找文档的过程。
    是不是恰好反过来了? 那么两者方式的优缺点是什么呢?
    正向索引:
    优点:
    可以给多个字段创建索引
    根据索引字段搜索、排序速度非常快
    缺点:
    根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
    倒排索引:
    优点:
    根据词条搜索、模糊搜索时,速度非常快
    缺点:
    只能给词条创建索引,而不是字段
    无法根据字段做排序
    2.小节
    由于ES课程API文档较多,这里统一汇总如下,有需自取
    EN.xmind
    (387 KB)
相关文章
|
16天前
|
缓存 运维 监控
一次内存诊断,让资源利用率提升 40%:揭秘隐式内存治理
阿里云云监控 2.0 推出 SysOM 底层操作系统诊断能力,基于 eBPF + BTF 协同分析,无需侵入业务,即可一键完成从物理页到文件路径、再到容器进程的全栈内存归因,让“黑盒内存”无所遁形。
417 68
|
4天前
|
Kubernetes Cloud Native Nacos
MCP 网关实战:基于 Higress + Nacos 的零代码工具扩展方案
本文会围绕如何基于 Higress 和 Nacos 的 docker 镜像在 K8s 集群上进行分角色部署。
|
1天前
|
消息中间件 缓存 Java
消息中间件RabbitMQ(基础)
RabbitMQ是基于AMQP协议的开源消息中间件,使用Erlang语言开发,实现应用解耦、异步通信与流量削峰。通过生产者、消费者、交换机、队列等组件,支持多种消息模型,如简单队列、发布订阅、路由匹配等,提升系统性能与可靠性。
15 0
|
22天前
|
存储 运维 监控
Java云门诊管理系统源码 HIS诊所门诊信息管理系统源码 多租户SaaS模式
SaaS云门诊系统是基于云端的SaaS医疗信息化平台,覆盖挂号、诊疗、收费、药房、库存、医保等全流程管理。支持多租户、快速部署,实现数据共享与业务协同,助力基层医疗机构数字化升级,提升服务效率与患者体验。
105 5
|
1天前
|
存储 SpringCloudAlibaba 负载均衡
Nacos注册中心
Nacos是SpringCloud Alibaba的核心组件,集服务注册发现与配置管理于一体,支持AP+CP模式。本文详解其安装部署、服务分级模型、负载均衡、权重控制、环境隔离及实例类型,助你掌握Nacos如何替代Eureka,实现高效微服务治理。
20 0
|
1天前
|
存储 缓存 NoSQL
分布式缓存Redis(高级)
本课程深入讲解Redis高级应用,涵盖持久化机制(RDB/AOF)、主从同步、哨兵集群、分片集群搭建与故障转移,结合SpringBoot实战RedisTemplate集成,助力掌握高可用、高性能的分布式缓存架构设计与落地。
13 0
|
2天前
|
监控 算法 Unix
Thread.sleep(0) 到底有什么用(读完就懂)
Thread.sleep(0)看似无用,实则能触发操作系统立即重新进行CPU竞争,让其他线程获得执行机会,避免界面假死。它并非真正“休眠”,而是主动放弃当前时间片,提升多线程协作效率。
24 0
|
2天前
|
存储 缓存 算法
零拷贝
零拷贝技术通过减少上下文切换和内存拷贝提升文件传输性能。传统方式需频繁系统调用与数据拷贝,开销大;零拷贝利用内核机制(如PageCache、SG-DMA)实现磁盘到网络的高效传输,适用于小文件或高并发场景。大文件则推荐异步IO+直接IO避免缓存污染。
22 0
|
2天前
|
缓存 算法 Java
线程池
线程池是一种复用线程资源的机制,通过池化技术管理多个线程,避免频繁创建和销毁线程带来的开销。它支持任务提交、调度及执行,提升系统性能与资源利用率,适用于高并发场景。Java中通过Executor框架实现,核心类包括ThreadPoolExecutor和ScheduledThreadPoolExecutor,结合阻塞队列、线程工厂与拒绝策略,灵活控制线程生命周期与任务调度。
19 0
|
2月前
|
缓存 并行计算 监控
vLLM 性能优化实战:批处理、量化与缓存配置方案
本文深入解析vLLM高性能部署实践,揭秘如何通过continuous batching、PagedAttention与前缀缓存提升吞吐;详解批处理、量化、并发参数调优,助力实现高TPS与低延迟平衡,真正发挥vLLM生产级潜力。
532 0
vLLM 性能优化实战:批处理、量化与缓存配置方案