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

【Agent智能体】33ElasticSearch

章节三十三:ElasticSearch

1.1 Elasticsearch简介

Elasticsearch(简称ES):一个专门用来搜东西的搜索引擎。它底层基于Lucene(一个Java写的搜索库),对外提供RESTful接口,简单来说就是通过HTTP请求就能完成各种搜索操作。

RESTful:一种设计风格,意思是你可以用普通的网址访问(比如 GET、POST 请求)来操作数据,不需要写复杂的代码。

Lucene:Java开发的全文搜索库,是ES的"发动机"。

ES现在是企业级搜索的首选工具,第8版在速度、扩展性和易用性上都有很大提升。注意:ES 8最低需要JDK 17。

1.2 Elasticsearch的特性

  • 实时:数据写进去后大概1秒就能搜到,几乎感觉不到延迟。

  • 分布式、可扩展:天生支持多机器集群,加机器就能扩容,能支持上千台服务器、PB级数据。

  • 稳定可靠:大厂都在用,经历过考验。

  • 高可用:数据有多份拷贝,一台机器挂了不影响使用。

  • Rest API:统一的HTTP接口,各种编程语言都能调用,不用担心API混乱。

  • 高性能:基于Lucene,PB级数据也能秒级搜索。

  • 多客户端支持:Java、Python、Go、PHP等语言都有官方客户端。

  • 安全支持:提供登录认证、加密通信、权限控制,8版本默认开启HTTPS。

1.3 Elasticsearch应用场景

第一,搭建日志系统。用ELK套件(Elasticsearch + Logstash + Kibana)收集、存储、可视化日志,这是最常见的用法。

第二,搭建数据分析系统。配合Kibana做数据聚合、统计报表,从海量数据里找规律。

第三,搭建搜索系统。适合做站内搜索,比如电商App里的商品搜索、银行App里的服务搜索。

第四,作为独立数据库。ES本身能存数据、能查数据,某些场景下可以直接当数据库用。但要注意它不支持事务,写入性能也比MySQL稍弱,所以不适合银行转账这类需要强一致性的场景。

ES和MySQL的区别

第一,查询语言不同。MySQL用SQL(结构化查询语言),ES用基于JSON的DSL查询语法,更适合复杂搜索。

第二,索引结构不同。MySQL主要用B+树索引,适合有序数据的精确查找。ES用倒排索引,适合全文搜索和相似度计算。

第三,使用场景不同。MySQL适合事务性业务(如订单、支付),ES适合搜索和分析(如日志、全文检索)。

第四,架构不同。ES天生分布式,水平扩容方便。MySQL适合结构化数据和中等规模数据。

1.4 全文搜索引擎

全文搜索:就是根据关键词去找内容。传统数据库搜文本很弱,因为需要扫描整张表,数据量大的时候慢得无法接受。而且每次增删改都要重建索引,维护麻烦。

全文搜索引擎的工作原理:先扫描文章里的每个词,给每个词建一个索引表,记录这个词在哪些文章里出现过、出现几次、在什么位置。用户搜索时,直接查这个索引表,瞬间就能找到相关文章。就像查字典的"检索字表"一样快。

1.5 倒排索引

正排索引:文档 -> 关键字。先找到文档,再看里面有哪些词。

倒排索引:关键字 -> 文档。先找到词,再看哪些文档包含这个词。

倒排索引的构建步骤:

第一步:把数据按词条进行分词,同时记录每个词出现在哪个文档的哪个位置。

第二步:把相同的词条合并到一起。

第三步:对词条排序,方便后续快速查找。

搜索过程:

第一步:把用户输入的搜索词进行分词。

第二步:拿分好的词去倒排索引里查,找到包含这些词的文档ID。

第三步:根据文档ID取出真正的文档数据返回给用户。

3 Elasticsearch核心概念

3.1 ES对照数据库

可以把ES理解为一种特殊的数据库,但术语不一样:

  • 索引(Index):类似MySQL的"表",存着一类相似的数据。
  • 文档(Document):类似MySQL的"一行记录",ES里用JSON格式表示。
  • 字段(Field):类似MySQL的"列",是文档的一个属性。
  • 映射(Mapping):类似MySQL的"建表语句",定义字段的类型、是否分词等规则。

3.2 索引(Index)

索引:就是一类相似文档的集合。比如你可以有一个"客户"索引、一个"商品"索引、一个"订单"索引。索引名必须全小写。

ES里能搜索的数据必须建索引,就像字典前面的目录,目的是提高查询速度。

ES索引设计的精髓:一切都是为了提高搜索性能。

3.3 类型(Type)

类型:索引内部的逻辑分类。但ES从6版本开始逐步弱化type,7版本后默认只有一个类型_doc

为什么要弱化type?

第一,性能考虑。ES的核心优势是全文检索,依赖倒排索引,而倒排索引是基于索引而非type的,多个type反而增加复杂度。

第二,数据结构简化。同一个索引里不同type的同名字段底层用的是同一个存储,容易导致数据稀疏,影响压缩效率。

第三,避免误解。很多人把索引类比成数据库、type类比成表,但两者其实不一样,这种错误类比容易用错。

第四,逐步过渡。前期很多项目用了多type,所以ES采取渐进式废除,给开发者时间调整。

3.4 文档(Document)

文档:ES里存数据的最小单位,就是一条记录。用JSON格式表示,一个索引里可以存任意多条文档。

3.5 字段(Field)

字段:文档的属性,相当于表的列。比如一个商品文档可以有"名称"、“价格”、"类别"等字段。

3.6 映射(Mapping)

映射:定义字段的规则,比如字段类型(字符串、数字、日期)、是否建立索引、用什么分词器等。合理设置映射能大幅提升性能。

4 Elasticsearch基础功能

参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.5/elasticsearch-intro.html

操作演示在Kibana里进行。

4.1 分词器

分词器:决定一段话怎么被拆成一个个词。比如"我是中国人",不同的分词器拆法不一样。

ES自带的Standard分词器:默认分词器,对中文是单字切分(拆成"我"、“是”、“中”、“国”、“人”)。

IK分词器:第三方中文分词器,能按词语级别拆分(拆成"我"、“是”、“中国人"或"中国”、“人”)。

# 功能说明:测试分词效果# POST _analyze 调用分析接口# 指定analyzer和text,查看分词结果

4.2 索引操作

# 功能说明:索引(类似表)的增删查操作# PUT /索引名 创建索引# GET /_cat/indices?v 查看所有索引# GET /索引名 查看单个索引详情# DELETE /索引名 删除索引

4.3 文档操作

文档:ES里搜索数据的最小单位,格式灵活,不需要预先定义字段。

# 功能说明:文档(类似行记录)的增删改查# PUT /索引名/_doc/ID 创建或更新文档(需指定ID)# GET /索引名/_doc/ID 根据ID查文档# GET /索引名/_search 查询所有文档# POST /索引名/_update/ID 局部更新文档(只能改部分字段)# DELETE /索引名/_doc/ID 删除文档

注意:局部更新只能用POST方式。

4.4 映射(Mapping)

动态映射:写文档时ES自动识别字段类型,不用提前建表。比如写个字符串自动当成text类型,写个整数自动当成long类型。

静态映射:提前手动定义好每个字段的类型、分词器等规则,像MySQL建表一样。适合对性能有要求的场景。

常见字段类型:

  • text:长文本,支持分词,但不能排序和聚合。
  • keyword:不分词,适合精确匹配、排序、聚合。
  • long/integer/float/double:数值型。
  • date:日期型。
  • boolean:布尔型。
# 功能说明:创建索引时同时指定映射规则# PUT /索引名 {# "mappings": {# "properties": {# "title": {"type": "text", "analyzer": "ik_max_word"},# "price": {"type": "integer"}# }# }# }

5 DSL高级查询

5.1 DSL概述

DSL(Domain Specific Language):ES专用的查询语言,用JSON格式写查询条件。可以理解为ES的"SQL"。

DSL查询分为两类:

  • 叶查询:在特定字段里查特定值,比如match、term、range,可以单独使用。
  • 复合查询:组合多个查询条件,比如must(必须满足,相当于AND)、should(满足其一即可,相当于OR)、must_not(必须不满足,相当于NOT)、filter(过滤,不计算得分)。

5.2 DSL查询类型

match_all:查询所有文档,不做任何过滤。

match:全文搜索,会对搜索词进行分析后再匹配,有模糊匹配能力。比如搜"华为智能手机",可能匹配到"华为手机"。

multi_match:在多个字段里同时搜索。比如同时在"标题"和"分类"里搜关键词。

term:精确匹配,不会对搜索词分词。比如搜"华为手机",就必须完全匹配这四个字,不能是"华为"或"手机"。

terms:匹配多个值中的任意一个。比如搜"华为手机"或"vivo手机"。

bool组合查询:把多个条件组合起来。

  • must:所有条件都必须满足(AND关系)。
  • should:满足任意一个条件即可(OR关系)。
  • must_not:必须不满足所有条件(NOT关系)。
  • filter:效果和must一样,但不计算相关度得分,速度更快。
# 功能说明:DSL查询示例# match_all 查所有# match 全文模糊匹配# multi_match 多字段搜索# term/terms 精确匹配# bool + must/should/must_not/filter 组合条件查询

5.3 排序

# 功能说明:对搜索结果排序# 可以按字段排序(如价格升序asc、降序desc)# 也可以按相关度得分_score排序
http://www.jsqmd.com/news/1155296/

相关文章:

  • 夏季官渡区全套奢品变现 逸程当面核验货品当场转账 - 融媒生活
  • Milvus 源码学习系列 | 第 20 章:删除、TTL、可见性与 Compaction
  • 工业自动化中TPD2015FN与dsPIC30F4011的协同设计与应用
  • 【避坑指南】2026亨得利售后网络大升级:真实体验与数据验证(附全国热线) - 亨得利客户服务中心
  • 北京亨得利官方直营售后维修网点|官方门店地址及客服电话全新公告(2026年7月最新) - 亨得利售后服务官网
  • Vue3 自定义指令对比:3种 el-select 滚动加载方案性能与实现差异
  • AI如何自动诊断并解决Linux编译环境缺失C编译器问题
  • 2026常德黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐
  • 亨得利官方名表服务中心|详细地址与售后电话权威信息声明(2026年7月更新) - 亨得利钟表维修中心
  • Day18 | Agentic RAG——让模型自己决定查不查、查什么、查几次
  • 74LS138/151/160 三款经典芯片实战:从逻辑函数到6进制计数器设计
  • 2026厦门手表回收哪家价高?5家门店实测行情盘点 - 奢品小当家
  • 论文 Rebuttal 实战:针对 3 类常见负面意见(创新性/描述错误/效果)的回应策略与模板
  • 数字漫画永久收藏指南:从在线租赁到真正拥有的技术实践
  • OpenMetadata开源元数据管理平台:构建AI时代数据语义的终极解决方案
  • 2026美容培训TOP5实测:小班教学与就业链路深度解析 - 深度智识库
  • NBM5100A电池增强器与PIC18F4620的低功耗设计实践
  • 协汇云——协会管理小程序全新上线
  • 高压安全隔离技术:ISOM8710与STM32F746VG的黄金组合
  • Linux 网络排障利器:mii-tool 命令超全详解,网卡速率 / 双工模式一键掌控
  • 【3D Max】保姆级教程:3D Max 2026 版详细图文安装指南 专业三维设计软件下载部署详
  • 【本地 AI 自动化工具】 OpenClaw2.7.9 Windows 端完整落地教程(含安装包)
  • 2026 广州黄金回收深度测评|内行人才懂的选店逻辑 - 全国二奢机构参考
  • HDC 2.0 与 ADB 指令对照表:从 15 个高频场景看 OpenHarmony 调试差异
  • 从零到SRE:Linux运维与云原生实战学习路径全解析
  • Windows安全中心实时保护关不掉时如何用组策略和注册表彻底解决
  • 2026上新:南昌红谷滩除甲醛公司怎么选?实地测评对比,优先推荐江西森呼吸环保 - 专注室内空气检测治理
  • AI时代如何重建系统性信息探查与真伪甄别能力
  • 使用Xilinx FPGA完成HDMI LOOPBACK回环显示设计(一)
  • .NET数据可视化实战:如何用OxyPlot高效构建专业级图表