Elasticsearch 索引是 Elasticsearch 中用于存储、组织和管理数据的核心概念。它是一种特殊的数据结构,旨在优化搜索速度。在功能上,索引可以类比为传统关系型数据库中的表,但其设计和使用方式有许多独特之处。
索引的关键概念
文档(Document):
- 索引是由多个文档组成的集合。每个文档都是一个独立的数据单元,通常以 JSON 格式表示。
- 文档包含了多个字段,每个字段可以有不同的数据类型,例如文本、数字、日期等。
分片(Shard) 和 副本(Replica):
- 分片 是索引的物理分割,每个索引可以被分割成多个分片,每个分片可以位于集群中的不同节点上,这有助于提高查询性能和系统的伸缩性。
- 副本 是分片的拷贝,主要用于数据冗余和提高读取性能。副本可以被放置在不同的节点上,以确保即使某个节点失败,数据仍然可用。
映射(Mapping):
- 映射定义了索引中每个字段的数据类型及其他相关设置,类似于关系型数据库中的表结构。
- 映射可以静态定义,也可以动态生成。动态映射允许 Elasticsearch 在首次遇到新字段时自动为其创建映射。
全文搜索:
- Elasticsearch 使用倒排索引技术来支持高效的全文搜索。当文档被索引时,其内容会被分析并转换成倒排索引,这使得搜索操作能够快速定位相关文档。
动态索引:
- Elasticsearch 支持动态索引,这意味着在插入新字段时,系统可以自动为这些字段创建映射,无需预先定义所有字段。
索引的操作
- 创建索引:可以通过 Elasticsearch 的 REST API 创建索引,并指定索引的设置(如分片和副本的数量)和映射。
- 写入文档:文档可以通过 API 写入索引,Elasticsearch 会对文档中的字段进行索引处理。
- 查询索引:可以执行各种查询操作,包括全文搜索、聚合分析等。
- 更新索引:虽然不能直接修改已有的文档,但可以通过重新索引来更新文档。
- 删除索引:当索引不再需要时,可以将其删除,所有相关的数据将被移除。
示例
创建一个名为 products
的索引,包含4个字段及其类型:
PUT /products
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"product_name": {
"type": "text" },
"price": {
"type": "integer" },
"description": {
"type": "text" },
"release_date": {
"type": "date" }
}
}
}
这个例子展示了如何定义索引的设置和映射,以满足特定的应用需求。