Elasticsearch 基础概念 Elasticsearch 基础概念详解与实践 核心概念 索引 (Index): 类似于关系型数据库中的数据库。它是一个存储相关文档的集合。 文档 (Document): 类似于关系型数据库中的行。它是可以被索引的基本信息单元,通常以 JSON 格式表示。 字段 (Field): 类似于关系型数据库中的列。文档由多个字段组成,每个字段都有一个名称和数据类型。 类型 (Type): 在 Elasticsearch 之前,一个索引可以有多个类型。但从 8.x 开始,类型已被移除。可以将类型理解为逻辑上的表。 映射 (Mapping): 定义了文档及其包含的字段是如何被存储和索引的。它类似于数据库中的 schema。
索引 (Index): 类似于关系型数据库中的数据库。它是一个存储相关文档的集合。
文档 (Document): 类似于关系型数据库中的行。它是可以被索引的基本信息单元,通常以 JSON 格式表示。
字段 (Field): 类似于关系型数据库中的列。文档由多个字段组成,每个字段都有一个名称和数据类型。
类型 (Type): 在 Elasticsearch 之前,一个索引可以有多个类型。但从 8.x 开始,类型已被移除。可以将类型理解为逻辑上的表。
映射 (Mapping): 定义了文档及其包含的字段是如何被存储和索引的。它类似于数据库中的 schema。
分片 (Shard): 索引被分割成多个分片,每个分片都是一个独立的 Lucene 索引。分片允许水平扩展 Elasticsearch 集群。
副本 (Replica): 每个分片可以有零个或多个副本。副本提供高可用性和读取性能。
集群 (Cluster): 由一个或多个节点组成的集合,它们共同存储整个数据。
节点 (Node): 集群中的一个服务器。它可以存储数据、参与集群索引和搜索操作。
首先,你需要下载并安装 Elasticsearch。你可以从 Elasticsearch 官网下载对应平台的安装包。
安装完成后,你可以修改 elasticsearch.yml 文件来配置 Elasticsearch。常见的配置包括:
cluster.name: 集群名称
node.name: 节点名称
network.host: 监听地址
http.port: HTTP 端口
discovery.seed_hosts: 集群发现地址
cluster.initial_master_nodes: 初始化主节点
Elasticsearch 提供了一组 REST API,用于执行各种操作,如索引、搜索、更新和删除文档。
创建索引:
PUT /my_index { "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "title": { "type": "text" }, "content": { "type": "text" }, "author": { "type": "keyword" }, "publish_date": { "type": "date" } } } }
详解:
PUT /my_index: 指定要创建的索引名称为 my_index。
settings: 定义索引的配置。
number_of_shards: 设置分片数量为 3。
number_of_replicas: 设置副本数量为 1。
mappings: 定义索引的映射。
properties: 定义文档的字段和类型。
title: 文本类型,用于全文搜索。
content: 文本类型,用于全文搜索。
author: 关键词类型,用于精确匹配。
publish_date: 日期类型,用于日期范围查询。
添加文档:
POST /my_index/_doc { "title": "Elasticsearch 基础", "content": "本文介绍了 Elasticsearch 的基础概念。", "author": "技术专家", "publish_date": "2023-10-27" }
详解:
POST /my_index/_doc: 指定要添加文档到 my_index 索引的 _doc 类型。
JSON 内容: 包含文档的字段和值。
获取文档:
GET /my_index/_doc/1
详解:
GET /my_index/_doc/1: 指定要从 my_index 索引的 _doc 类型中获取 ID 为 1 的文档。更新文档:
PUT /my_index/_doc/1 { "title": "Elasticsearch 基础进阶", "content": "本文深入介绍了 Elasticsearch 的基础概念。", "author": "技术专家", "publish_date": "2023-10-27" }
详解:
PUT /my_index/_doc/1: 指定要更新 my_index 索引的 _doc 类型中 ID 为 1 的文档。
JSON 内容: 包含更新后的文档字段和值。 注意: 这将替换整个文档。
或者使用 _update API 进行部分更新:
POST /my_index/_doc/1/_update { "doc": { "title": "Elasticsearch 基础高级" } }
详解:
POST /my_index/_doc/1/_update: 指定要更新 my_index 索引的 _doc 类型中 ID 为 1 的文档的部分内容。
doc: 包含要更新的字段和值。 只更新 title 字段。
删除文档:
DELETE /my_index/_doc/1
详解:
DELETE /my_index/_doc/1: 指定要从 my_index 索引的 _doc 类型中删除 ID 为 1 的文档。删除索引:
DELETE /my_index
详解:
DELETE /my_index: 指定要删除的索引名称为 my_index。 慎用!简单查询:
GET /my_index/_search?q=Elasticsearch
详解:
GET /my_index/_search: 指定要搜索 my_index 索引。
q=Elasticsearch: 使用 q 参数指定查询字符串,搜索包含 "Elasticsearch" 的文档。
使用 Query DSL:
GET /my_index/_search { "query": { "match": { "content": "Elasticsearch" } } }
详解:
GET /my_index/_search: 指定要搜索 my_index 索引。
query: 定义查询条件。
match: 执行全文匹配查询。
content: 指定要搜索的字段为 content。
Elasticsearch: 指定要搜索的关键词为 "Elasticsearch"。
范围查询:
GET /my_index/_search { "query": { "range": { "publish_date": { "gte": "2023-10-01", "lte": "2023-10-31" } } } }
详解:
GET /my_index/_search: 指定要搜索 my_index 索引。
query: 定义查询条件。
range: 执行范围查询。
publish_date: 指定要搜索的字段为 publish_date。
gte: 指定下限(大于等于)。
lte: 指定上限(小于等于)。
布尔查询:
GET /my_index/_search { "query": { "bool": { "must": [ { "match": { "content": "Elasticsearch" } }, { "match": { "author": "技术专家" } } ] } } }
详解:
GET /my_index/_search: 指定要搜索 my_index 索引。
query: 定义查询条件。
bool: 执行布尔查询。
must: 所有条件必须匹配。
match: 执行全文匹配查询,搜索 content 字段包含 "Elasticsearch" 的文档。
match: 执行全文匹配查询,搜索 author 字段包含 "技术专家" 的文档。
分页查询:
GET /my_index/_search { "from": 0, "size": 10, "query": { "match_all": {} } }
详解:
GET /my_index/_search: 指定要搜索 my_index 索引。
from: 指定起始位置(从 0 开始)。
size: 指定每页大小。
query: 定义查询条件。
match_all: 匹配所有文档。映射定义了文档中的字段是如何被索引的。例如,你可以指定字段的数据类型、是否要被索引、使用的分析器等。
PUT /my_index { "mappings": { "properties": { "title": { "type": "text", "analyzer": "standard" }, "content": { "type": "text", "analyzer": "ik_max_word" }, "author": { "type": "keyword" }, "publish_date": { "type": "date", "format": "yyyy-MM-dd" } } } }
详解:
title: 使用 standard 分析器进行分析,适合英文文本。
content: 使用 ik_max_word 分析器进行分析,适合中文文本 (需要安装 IK 分词器插件)。
author: keyword 类型,不会进行分词,适合精确匹配。
publish_date: date 类型,指定日期格式为 yyyy-MM-dd。
Elasticsearch 将索引分割成多个分片,每个分片都是一个独立的 Lucene 索引。副本是分片的拷贝,用于提供高可用性和读取性能。
分片: 允许水平扩展 Elasticsearch 集群,提高存储容量和搜索性能。
副本: 提高数据的可用性,防止数据丢失。当主分片发生故障时,副本可以自动升级为新的主分片。同时,副本也可以分担读取请求,提高搜索性能。
本文介绍了 Elasticsearch 的基础概念,包括索引、文档、字段、映射、分片、副本等。并通过代码示例和图表进行了说明。掌握这些基础概念是学习和使用 Elasticsearch 的关键。
希望本文能帮助你更好地理解 Elasticsearch! 请根据实际情况进行修改和调整。