完整教程:Elasticsearch:分布式搜索引擎数据库

news/2025/11/30 18:52:13/文章来源:https://www.cnblogs.com/gccbuaa/p/19289923

目录

1、核心概念

2、核心价值

3、主要功能

4、限制

5、应用场景

6、使用代码示例(Java)


1、核心概念

Elasticsearch 是一个开源的分布式搜索和分析引擎,它基于 Apache Lucene 构建,能够快速地存储、搜索和分析海量数据。

概念描述
集群 (Cluster)由一个或多个节点组成,共同持有整个数据,提供联合索引和搜索能力。
节点 (Node)集群中的一个服务器,存储数据并参与索引和搜索。节点的类型可以不同(如主节点、数据节点、协调节点等)。
索引 (Index)具有相似特性的文档集合,可类比为数据库中的表。例如,可以有一个“用户”索引,一个“产品”索引。索引由一个名称(必须全部小写)标识。
文档 (Document)索引中的基本数据单元,使用JSON格式表示。每个文档都有一个唯一的 ID。
分片和副本 (Shards & Replicas)索引可以被分成多个分片以支持分布式存储,副本是分片的拷贝,用于提供高可用性。创建索引时,需要指定分片数量,之后无法修改。可以在创建索引后随时动态地更改副本数量。
映射 (Mapping)用于定义索引中的文档结构和字段类型。
查询 (Query)用于在索引中搜索和检索文档的操作。

核心技术:倒排索引

  • 通过内容中的关键词找到其所在的文档 ID。Keyword -> Document IDs

  • 例子:
    文档1:{ "content": "The quick brown fox" }
    文档2:{ "content": "Jumped over the lazy dog" }
    文档3:{ "content": "The quick red fox" }
    倒排索引列表(简化版)
    the -> [1, 2, 3]
    quick -> [1, 3]
    brown -> [1]
    fox -> [1, 3]
    ... ...
    当搜索 “quick fox” 时,ES 会分别查找 “quick” 和 “fox” 的文档ID列表,然后取交集,最终快速定位到文档1和文档3。

2、核心价值

Elasticsearch 的核心价值可以总结为三点:搜索日志处理 和 数据分析

  • 强大的搜索能力

    • 全文搜索: 支持复杂的查询,包括模糊查询、短语匹配、同义词、高亮等。

    • 结构化搜索: 对数字、日期、范围等结构化数据进行查询。

    • 相关性评分: 内置 TF-IDF 和 BM25 等算法,能够根据查询与文档的相关性对结果进行智能排序。

  • 可扩展性和可靠性

    • 分布式: 天生为分布式设计,能够轻松处理 PB 级别的数据。

    • 高可用: 通过分片副本机制,确保在部分节点故障时,服务依然可用。

  • 近实时分析

    • 数据在写入后1秒内即可被搜索和分析,非常适合监控、日志分析等需要快速洞察的场景。

3、主要功能

  • 数据索引与搜索: 核心功能,提供丰富的 RESTful API 进行数据的 CRUD 和复杂的查询(如 matchtermboolrange 等)。

  • 聚合:

    • 类比: SQL 中的 GROUP BY,但功能强大得多。

    • 功能: 提供从数据中提取统计信息的能力,如计算平均值、求和、创建直方图、进行分组等。这是其作为“分析引擎”的关键。

  • 自动完成与搜索建议: 通过 Completion Suggester 和 Search-as-you-type 等字段类型,实现高效的自动补全和搜索纠错(“你的意思是?”)功能。

  • 地理位置搜索与分析: 原生支持 Geo-point 和 Geo-shape,可以轻松实现“查找我附近1公里的餐厅”或“判断点是否在多边形内”等功能。

  • 数据可视化: 与 Kibana 紧密集成,可以将搜索和聚合的结果以丰富的图表、仪表盘形式展现出来。

  • 机器学习: 集成机器学习功能,可以自动检测时间序列数据中的异常,或进行预测性分析。

  • 监控与指标采集: ELK Stack 中的核心组件,专门用于收集和分析日志、指标数据。

  • 安全特性: 提供身份认证、授权、加密通信等安全功能。

4、限制

  • 非事务性:

    • 问题: 不支持 ACID 事务。无法保证跨多个文档的写入操作的原子性。

    • 场景: 不适合金融交易、库存扣减等需要强一致性的场景。

  • 实时性:

    • 问题: 近实时而非严格实时。对于要求毫秒级数据可见性的场景(如极高频的交易系统)可能不适用。

  • 更新开销大:

    • 问题: 更新一个文档实际上是“删除旧文档,索引新文档”的过程。频繁更新代价很高。

  • 资源消耗:

    • 问题: 对内存和 CPU 消耗较高,尤其是为了提升性能而将索引加载到内存中时。

  • 数据关系处理弱:

    • 问题: 不擅长处理复杂的关联关系(如多表 JOIN)。虽然有 nested 和 join 数据类型,但性能损耗大,使用复杂。它更适合“宽表”和“扁平化”的数据模型。

  • 脑裂问题:

    • 问题: 在分布式集群中,如果网络发生分区,可能导致出现多个“主节点”,造成数据不一致。需要通过合理的集群配置来避免。

5、应用场景

  • 网站搜索 / 电商平台搜索

    • 描述: 为网站或应用提供强大的搜索功能,支持关键词搜索、过滤器、排序、相关性排名、搜索建议等。

    • 例子: 维基百科、GitHub、电商网站的商品搜索。

  • 日志管理与分析

    • 描述:ELK Stack 的经典应用。收集来自各种服务器、应用程序、网络的日志,进行集中存储、搜索、分析和可视化。

    • 例子: 运维人员通过 Kibana 仪表板实时监控系统错误、追踪性能瓶颈、进行安全审计。

  • 应用程序性能监控

    • 描述: 收集应用程序的性能指标(如响应时间、错误率、吞吐量),通过聚合和分析来监控应用健康状态。

    • 例子: 使用 Elasticsearch 和 APM 服务来追踪微服务架构中的请求链路。

  • 安全分析

    • 描述: 分析来自防火墙、入侵检测系统、终端安全软件的安全事件日志,以检测潜在威胁和异常行为。

  • 商业智能与数据分析

    • 描述: 借助 Elasticsearch 强大的聚合(Aggregations) 功能,从数据中提取复杂的统计信息,进行用户行为分析或业务指标统计。

  • 全文检索与文档管理系统

    • 描述: 为企业内部文档、知识库、法律文书等提供全文检索能力。

  • 内容推荐

    • 描述:根据用户的历史行为和偏好,Elasticsearch 可以助力内容推荐系统,例如在音乐或视频平台上推荐相似内容。

6、使用代码示例(Java)

添加依赖:


co.elastic.clientselasticsearch-java8.11.3
org.elasticsearch.clientelasticsearch-rest-client8.11.3

com.fasterxml.jackson.corejackson-databind2.15.0

重要提示:选择客户端时,必须严格遵循官方发布的版本对照表,确保客户端与服务端版本兼容。例如,不能使用8.x的Java API Client连接6.x的ES实例

初始化客户端:

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
public class ElasticsearchClientFactory {public static ElasticsearchClient createClient() {// 创建底层 REST client,配置ES服务器地址和端口RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200, "http")).build();// 使用Jackson作为JSON映射器创建Transport层RestClientTransport transport = new RestClientTransport(restClient,new JacksonJsonpMapper());// 创建并返回类型安全的ElasticsearchClientreturn new ElasticsearchClient(transport);}
}

索引操作:创建索引、设置映射(Mapping)

import co.elastic.clients.elasticsearch.indices.CreateIndexTemplateRequest;
import co.elastic.clients.elasticsearch.indices.IndexTemplate;
import co.elastic.clients.elasticsearch.indices.put_index_template.IndexTemplateMapping;
// 使用经典模板方式创建索引和Mapping
CreateIndexTemplateRequest request = CreateIndexTemplateRequest.of(b -> b.name("my-index-template").indexPatterns("my-index-*").template(IndexTemplateMapping.of(m -> m.mappings(mapping -> mapping.properties("id", prop -> prop.long_(l -> l)).properties("name", prop -> prop.text(t -> t.store(true).analyzer("ik_smart"))) // 使用IK分词器.properties("age", prop -> prop.integer(i -> i.store(true))).properties("desc", prop -> prop.text(t -> t.store(true).analyzer("ik_max_word"))) // 使用IK分词器.properties("registerTime", prop -> prop.date(d -> d.format("yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")))))
);
esClient.indices().createIndexTemplate(request);

文档操作:添加/更新文档

import co.elastic.clients.elasticsearch.core.IndexRequest;
import co.elastic.clients.elasticsearch.core.IndexResponse;
// 准备一个简单的POJO作为文档数据,或者使用Map
public class User {private String id;private String name;private Integer age;private String desc;private String registerTime;// ... getters and setters
}
User user = new User();
user.setId("1");
user.setName("不焦躁的程序员");
user.setAge(10);
user.setDesc("这是一个测试用户");
user.setRegisterTime("2023-10-25 12:00:00");
IndexRequest indexRequest = IndexRequest.of(b -> b.index("testusers") // 索引名称.id(user.getId())   // 文档ID.document(user)     // 文档源
);
IndexResponse response = esClient.index(indexRequest);

文档操作:查询文档

import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
// 构建一个match查询
SearchRequest searchRequest = SearchRequest.of(s -> s.index("testusers").query(q -> q.match(t -> t.field("name").query("程序员")))
);
SearchResponse searchResponse = esClient.search(searchRequest, User.class);
// 处理搜索结果
for (Hit hit : searchResponse.hits().hits()) {User foundUser = hit.source();System.out.println("找到用户: " + foundUser.getName());
}

文档操作:删除文档

import co.elastic.clients.elasticsearch.core.DeleteRequest;
import co.elastic.clients.elasticsearch.core.DeleteResponse;
DeleteRequest deleteRequest = DeleteRequest.of(b -> b.index("testusers").id("1")
);
DeleteResponse deleteResponse = esClient.delete(deleteRequest);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/982117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsl基本使用以及使用过程中遇到的问题

使用 任务栏搜索框中输入“Ubuntu xx.xx”后,直接进入对应Linux系统问题 1.git clone失败 fatal: unable to access https://github.com/xxx/xxx.git/: GnuTLS recv error (-110): The TLS connection was non-proper…

人工智能之数据分析 Matplotlib:第五章 常见函数

人工智能之数据分析 Matplotlib:第五章 常见函数人工智能之数据分析 Matplotlib 第五章 常见函数@目录人工智能之数据分析 Matplotlib前言一、Matplotlib 图像处理三剑客:imread / imshow / imsave1. plt.imread() …

CTF基础介绍与入门讲解

什么是CTF夺旗赛 CTF(Capture The Flag,夺旗赛) 是一种流行的信息安全竞赛形式,起源于1996年的DEFCON大会。CTF竞赛通过解决各种网络安全相关的挑战,帮助参赛者提升技术能力,同时也为网络安全领域培养人才。 当然…

2025/11/29 今天上课所以没有自我学习

2025/11/29 今天上课所以没有自我学习今日没有学习新内容,把前两天的内容随笔写了一下

基于大数据的全国降水可视化分析预测框架

基于大数据的全国降水可视化分析预测框架pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

Day7-20251130

Java标识符与数据类型摘要: Java标识符命名规则:必须以字母、$或_开头,后续可包含数字,区分大小写且不能使用关键字。虽然支持中文命名但不推荐。 数据类型分为基本类型和引用类型。基本类型包括:数值类型:byte(…

Java项目中最常用的6个设计模式

在 Java 项目开发中,以下 6 种设计模式因实用性强、应用场景广泛而被高频使用: 1. 单例模式(Singleton Pattern) 用途:确保一个类仅有一个实例,并提供全局访问点。场景:线程池、数据库连接池、配置类、日志工具…

记录容器云基于debian镜像的自由组合

当然很多镜像都是有着专用的功能,这也是docker的设计目标,但是有时候我们也想把docker当vps使用。 所以,就想基于debian的镜像自由发挥。。。第一步:基于 debian:12-slim 开启一个容器 关键要设置:挂载一个目录,…

IDEA中使用http协议

IDEA中使用http协议三、如何使用协议 3.1使用http协议 项目右键-》Git -》 repository -》 remote -》选择http协议的地址3.2 使用ssh协议 首先Git Bash或软件生成SSH秘钥 生成秘钥请参考 SSH公钥默认存储在账户的主目…

详细介绍:Elasticsearch从入门到实践:核心概念到Kibana测试与C++客户端封装

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

C语言结构体全面解析与内存优化 - 实践

C语言结构体全面解析与内存优化 - 实践2025-11-30 18:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !…

OpenCSG x Dell联合发布面向AI原生企业的下一代IT解决方案

在全球迈向“智能体时代”的背景下,OpenCSG(开放传神)近日发布与戴尔科技基础设施深度集成的参考架构方案。该方案结合了 OpenCSG 的 CSGHub 企业级平台、Xnet 智能传输协议、Dell PowerScale 智能存储系统和 Dell …

ESP32C3开发指南(基于IDF):console控制台命令行交互功能 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vue+devtools下载地址

https://crxdl.com/search?q=vue+devtools 上传一个包到: https://files.cnblogs.com/files/stubborn-dude/hkddcnbhifppgmfgflgaelippbigjpjo_crxdl.com_v3_5.3.4.0.zip?t=1764497205&download=true

剑出鞘

锻造矛盾的综合无处不在 冥想似乎也无法摒弃的思绪 就让它随风飘散 文字的隐喻透露阴郁 至今已然明白 我们都面临抉择 但我确信 取舍最终归于同一 倘若非然 那便要“该出手时就出手” 倒计时还在迫近 也许是时候迈开双…

第4篇 Scrum 冲刺博客

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13474这个作业的目标 完…

渗透测试中的方法论

什么是渗透测试? 在网络安全领域,渗透测试是衡量组织防御体系有效性的关键手段。然而,一个真正专业、有价值的渗透测试,绝非简单的“黑客工具堆砌”或随机的攻击尝试。其背后是一套严谨、系统化的方法论。这套方法…

德国首个AI科学中心启动研究合作

某中心与马克斯普朗克学会合作成立科学中心,聚焦人工智能、计算机视觉和机器学习研究,包含博士奖学金项目和700万欧元初始资金,推动AI技术发展与应用创新。某中心与马克斯普朗克学会启动科学中心合作 这是某中心在美…

Google Benchmark:高性能C++代码基准测试框架

Google Benchmark是一个专业的C++微基准测试库,提供精确的性能测量、统计分析和复杂度计算,支持多线程测试和自定义计数器,帮助开发者优化代码性能。Google Benchmark:高性能C++代码基准测试框架 项目描述 Google …

医疗小程序02用户注册 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …