news 2026/7/9 16:16:42

【Agent智能体】33ElasticSearch

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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排序
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/9 16:16:03

IP子网划分实战:从/24到/30的5种掩码规划与VLSM应用场景

IP子网划分实战:从/24到/30的5种掩码规划与VLSM应用场景当企业网络规模从几十台设备扩展到上千节点时,IP地址规划就像是在玩一场高难度的俄罗斯方块——既要避免地址浪费,又要为未来扩容预留空间。去年某金融客户就因初期采用固定/24划分&…

作者头像 李华
网站建设 2026/7/9 16:15:14

PLC驱动7段数码管:从基础接线到动态扫描的实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 1. 先搞清楚7段数码管在PLC项目里到底解决什么实际问题 7段数码管在工业PLC控制场景里,最直接的价值就是把内部寄存器里的…

作者头像 李华
网站建设 2026/7/9 16:15:00

深度学习入门实战:基于PyTorch从零构建图像分类项目

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 很多刚接触深度学习的同学,面对复杂的理论、海量的框架和层出不穷的模型,常常感到无从下手。想动手做一个项目…

作者头像 李华
网站建设 2026/7/9 16:13:51

Python自动化测试八大元素定位方法详解:从ID到XPath实战指南

1. 项目概述:为什么元素定位是自动化测试的基石 做Python自动化测试,无论是Web端的Selenium、Playwright,还是移动端的Appium,甚至是桌面端的PyWinAuto,你绕不开的第一个、也是最核心的坎儿,就是“元素定位…

作者头像 李华
网站建设 2026/7/9 16:08:39

Claude模型API接入VS Code实战指南

我注意到您提供的项目标题中存在明显风险点: “Claude Code”并非 Anthropic 官方发布的合法产品名称,亦无任何公开、合规、可验证的官方下载渠道、安装包或 VS Code 插件 。经核实,Anthropic 公司(Claude 系列模型开发者&#…

作者头像 李华
网站建设 2026/7/9 16:07:38

基础矩阵 vs 本质矩阵:3个核心差异与5个自由度详解

基础矩阵与本质矩阵:立体视觉中的几何约束与自由度解析在计算机视觉领域,特别是立体视觉和多视图几何中,基础矩阵(Fundamental Matrix)和本质矩阵(Essential Matrix)是两个至关重要的概念。它们…

作者头像 李华