Elasticsearch基础

本文介绍了Elasticsearch,一个基于Lucene的实时分布式搜索分析引擎,适合中等数据量业务。它支持文档存储、实时搜索、分片等特性,可用于日志分析和搜索引擎开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简介

Elasticsearch是实时的分布式搜索分析引擎,内部使用Lucene做索引与搜索。

何谓实时?新增到 ES 中的数据在1秒后就可以被检索到,这种新增数据对搜索的可见性称为“准实时搜索”。分布式意味着可以动态调整集群规模,弹性扩容,而这一切操作起来都非常简便,用户甚至不必了解集群原理就可以实现。按官方的描述,集群规模支持“上百”个节点,相比HDFS等上千台的集群,这个规模“小了点”。影响集群规模上限的原因将在后续的章节中分析。因此,目前我们认为ES适合中等数据量的业务,不适合存储海量数据

Lucene是Java语言编写的全文搜索框架,用于处理纯文本的数据,但它只是一个库,提供建立索引、执行搜索等接口,但不包含分布式服务,这些正是 ES 做的。什么是全文?对全部的文本内容进行分析,建立索引,使之可以被搜索,因此称为全文。

基于ES,你可以很容易地搭建自己的搜索引擎,用于分析日志,或者配合开源爬虫建立某个垂直领域的搜索引擎。ES 易用的产品设计使得它很容易上手。除了搜索,ES 还提供了大量的聚合功能,所以它不单单是一个搜索引擎,还可以进行数据分析、统计,生成指标数据。而这些功能都在快速迭代,目前每2周左右就会发布新版本。

1.1、索引结构

ES是面向文档的。各种文本内容以文档的形式存储到ES中,文档可以是一封邮件、一条日志,或者一个网页的内容。一般使用 JSON 作为文档的序列化格式,文档可以有很多字段,在创建索引的时候,我们需要描述文档中每个字段的数据类型,并且可能需要指定不同的分析器,就像在关系型数据中“CREATE TABLE”一样。

在存储结构上,由_index、_type和_id唯一标识一个文档。

_index指向一个或多个物理分片的逻辑命名空间,_type类型用于区分同一个集合中的不同细分,在不同的细分中,数据的整体模式是相同或相似的,不适合完全不同类型的数据。多个_type可以在相同的索引中存在,只要它们的字段不冲突即可(对于整个索引,映射在本质上被“扁平化”成一个单一的、全局的模式)。_id文档标记符由系统自动生成或使用者提供。

1.2、分片(shard)

在分布式系统中,单机无法存储规模巨大的数据,要依靠大规模集群处理和存储这些数据,一般通过增加机器数量来提高系统水平扩展能力。因此,需要将数据分成若干小块分配到各个机器上。然后通过某种路由策略找到某个数据块所在的位置。

### Elasticsearch 基础教程与入门指南 Elasticsearch 是一种基于 Lucene 的分布式全文搜索引擎,广泛应用于日志分析、实时数据分析以及复杂查询场景。以下是关于其基础知识的详细介绍: #### 1. 核心概念 - **Index**: 类似于传统关系型数据库中的“数据库”,用于存储一组具有相似特征的文档集合[^4]。 - **Document**: 表示一条记录或对象,类似于关系型数据库中的行。它是 Elasticsearch 中最基本的数据单位[^1]。 - **Type (已废弃)**: 在早期版本中,`Type` 被用来区分同一索引下的不同类型数据;然而,在 Elasticsearch 6.x 版本之后逐步弱化,并最终在 7.x 完全移除[^4]。 #### 2. 查询机制 Elasticsearch 使用倒排索引来实现高效的搜索能力。相比于传统的正向索引(需逐一扫描所有文档),它通过预先构建关键词与其关联文档之间的映射来显著提升检索效率[^5]。 #### 3. 配置管理 为了满足特定需求或者优化性能表现,可以通过修改配置文件来自定义行为模式。如果采用 Docker 方式部署,则可以借助 `-v` 参数挂载外部定制化的 YAML 文件至容器内部标准路径下完成设置覆盖[^3]。 #### 4. 数据建模注意事项 尽管支持一定形式上的结构间联系表达(如父-子模型),但由于缺乏原生事务保障加之额外开销影响等原因,在实际项目开发过程中往往推荐采取扁平化设计思路——即将原本可能涉及多方交互的信息直接嵌入单一JSON实体之中保存起来从而减少对外部参照依赖程度进而达到提高读写速度的目的[^2]。 ```python from elasticsearch import Elasticsearch es_client = Elasticsearch("http://localhost:9200") response = es_client.search( index="example_index", body={ "query": { "match": {"field_name": "value"} } } ) print(response['hits']['total']) ``` 以上代码片段展示了如何利用 Python SDK 对目标索引执行简单的匹配查找操作并获取结果总数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值