Elasticsearch 教程:轻松掌握全文搜索与数据分析
Elasticsearch 是一款基于 Apache Lucene 构建的开源、分布式、RESTful 搜索引擎,以其强大的全文搜索能力、近实时的数据分析能力以及可扩展性,被广泛应用于日志分析、应用监控、电商搜索、企业搜索等众多领域。本教程将带您深入了解 Elasticsearch,从基础概念到高级应用,助您轻松掌握全文搜索与数据分析。
一、 Elasticsearch 核心概念
理解 Elasticsearch 的核心概念是学习的基础。以下是几个关键术语:
-
Index (索引): 类似于关系型数据库中的数据库,用于存储相关文档的集合。例如,您可以创建一个名为 “products” 的索引来存储您的电商商品数据。
-
Document (文档): 类似于关系型数据库中的行,是 Elasticsearch 中存储的基本单元。文档通常以 JSON 格式表示,包含多个字段 (Fields)。 例如,一个 “product” 文档可能包含 “name”、”description”、”price” 和 “category” 等字段。
-
Type (类型): 在 Elasticsearch 7.x 之前,一个 Index 可以包含多个 Type,类似于关系型数据库中的表。但从 Elasticsearch 7.x 开始,Type 已经被弃用,取而代之的是单个 “_doc” 类型。这意味着一个 Index 只能包含一种类型的文档。
-
Field (字段): 类似于关系型数据库中的列,是 Document 中的一个属性。例如,”product” 文档中的 “name” 字段用于存储商品名称。
-
Mapping (映射): 定义了索引中每个字段的数据类型以及索引方式。Mapping 告诉 Elasticsearch 如何索引和搜索数据。例如,您可以将 “name” 字段映射为
text
类型,允许全文搜索;将 “price” 字段映射为double
类型,允许数值范围搜索。 -
Shard (分片): 为了提高性能和可扩展性,Elasticsearch 将 Index 分割成多个 Shard。每个 Shard 都是一个独立的 Lucene 索引,可以分布在不同的节点上。
-
Replica (副本): 为了保证数据的可靠性和高可用性,Elasticsearch 可以创建 Shard 的多个 Replica。Replica 是 Shard 的拷贝,可以用于读取请求,也可以在主 Shard 发生故障时自动顶替。
-
Node (节点): 是 Elasticsearch 集群中的一个服务器实例。每个节点都可以存储数据,参与索引和搜索操作。
-
Cluster (集群): 由一个或多个节点组成,共同存储和处理数据。
二、 Elasticsearch 安装与配置
-
下载 Elasticsearch: 访问 Elasticsearch 官网 (https://www.elastic.co/downloads/elasticsearch) 下载对应您操作系统的 Elasticsearch 安装包。
-
解压安装包: 将下载的安装包解压到您选择的目录。
-
启动 Elasticsearch: 进入解压目录下的
bin
目录,执行以下命令启动 Elasticsearch:- Linux/macOS:
./elasticsearch
- Windows:
elasticsearch.bat
- Linux/macOS:
-
验证安装: 在浏览器中访问
http://localhost:9200
,如果看到包含 Elasticsearch 版本信息的 JSON 响应,则表示安装成功。 -
配置 Elasticsearch (可选): 您可以修改
config/elasticsearch.yml
文件来配置 Elasticsearch 集群。常用的配置项包括:cluster.name
: 集群名称node.name
: 节点名称network.host
: 监听地址http.port
: HTTP 端口discovery.seed_hosts
: 用于发现其他节点的地址列表 (在集群环境中)。
三、 Elasticsearch REST API 基本操作
Elasticsearch 提供了强大的 REST API,允许您通过 HTTP 请求与集群交互。以下是一些基本操作:
-
创建索引:
bash
PUT /products
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "ik_max_word" // 使用中文分词器
},
"description": {
"type": "text",
"analyzer": "ik_max_word"
},
"price": {
"type": "double"
},
"category": {
"type": "keyword" // 不进行分词
}
}
}
}PUT /products
: 创建名为 “products” 的索引。settings
: 配置索引的参数,例如分片数和副本数。mappings
: 定义字段的映射。number_of_shards
: 设置索引的分片数。number_of_replicas
: 设置每个分片的副本数。analyzer
: 指定分词器,ik_max_word
是一款流行的中文分词器。如果没有安装,需要先安装并配置。type
: 指定字段的数据类型。text
用于全文搜索,keyword
用于精确匹配,double
用于数值类型。
-
索引文档:
bash
POST /products/_doc
{
"name": "小米13 Ultra",
"description": "小米最新旗舰手机,拥有徕卡光学影像系统。",
"price": 5999.00,
"category": "手机"
}POST /products/_doc
: 将一个文档添加到 “products” 索引中。_doc
: 指定文档类型(在 Elasticsearch 7.x 及以上版本中,始终为 “_doc”)。
-
获取文档:
bash
GET /products/_doc/YOUR_DOCUMENT_IDGET /products/_doc/YOUR_DOCUMENT_ID
: 根据文档 ID 获取文档。你需要将YOUR_DOCUMENT_ID
替换为实际的文档 ID。
-
更新文档:
bash
POST /products/_doc/YOUR_DOCUMENT_ID/_update
{
"doc": {
"price": 6499.00
}
}POST /products/_doc/YOUR_DOCUMENT_ID/_update
: 更新指定文档 ID 的文档。doc
: 包含需要更新的字段。
-
删除文档:
bash
DELETE /products/_doc/YOUR_DOCUMENT_IDDELETE /products/_doc/YOUR_DOCUMENT_ID
: 删除指定文档 ID 的文档。
-
删除索引:
bash
DELETE /productsDELETE /products
: 删除 “products” 索引。
四、 Elasticsearch 搜索
Elasticsearch 提供了强大的搜索功能,可以使用各种查询来查找文档。
-
Match Query:
bash
GET /products/_search
{
"query": {
"match": {
"name": "小米"
}
}
}match
: 对字段进行全文搜索。Elasticsearch 会对查询字符串进行分词,并查找包含这些词的文档。
-
Term Query:
bash
GET /products/_search
{
"query": {
"term": {
"category": "手机"
}
}
}term
: 对字段进行精确匹配。不会对查询字符串进行分词。
-
Range Query:
bash
GET /products/_search
{
"query": {
"range": {
"price": {
"gte": 5000, // 大于等于
"lte": 7000 // 小于等于
}
}
}
}range
: 对数值或日期字段进行范围搜索。gte
: 大于等于。lte
: 小于等于。gt
: 大于。lt
: 小于。
-
Boolean Query:
bash
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "小米" } },
{ "range": { "price": { "gte": 5000 } } }
],
"must_not": [
{ "term": { "category": "配件" } }
],
"should": [
{ "match": { "description": "徕卡" } }
],
"minimum_should_match": 1
}
}
}bool
: 用于组合多个查询条件。must
: 必须满足的条件 (相当于 AND)。must_not
: 必须不满足的条件 (相当于 NOT)。should
: 应该满足的条件 (相当于 OR),满足的条件越多,相关性得分越高。minimum_should_match
:should
子句中必须满足的最少条件数。
-
Highlighting:
bash
GET /products/_search
{
"query": {
"match": {
"description": "徕卡光学"
}
},
"highlight": {
"fields": {
"description": {}
}
}
}highlight
: 高亮显示搜索结果中的关键词。
-
Aggregation (聚合):
bash
GET /products/_search
{
"size": 0, // 不返回具体文档
"aggs": {
"category_counts": {
"terms": {
"field": "category"
}
}
}
}aggs
: 定义聚合操作。terms
: 按照字段进行分组统计。size
: 设置返回结果的数量,设置为 0 表示只返回聚合结果。
五、 Elasticsearch 数据分析
Elasticsearch 不仅仅是一个搜索引擎,也是一个强大的数据分析工具。通过聚合 (Aggregation) 功能,您可以对数据进行各种统计和分析。
-
Metric Aggregations: 计算字段的各种指标,例如平均值、最大值、最小值、总和等。例如:
bash
GET /products/_search
{
"size": 0,
"aggs": {
"average_price": {
"avg": {
"field": "price"
}
}
}
} -
Bucket Aggregations: 将文档按照字段进行分组,例如按照日期、类别、地理位置等。例如:
bash
GET /products/_search
{
"size": 0,
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 3000 },
{ "from": 3000, "to": 6000 },
{ "from": 6000 }
]
}
}
}
}range
: 按照价格范围进行分组。
六、 Elasticsearch 进阶主题
-
Analyzer (分词器): Elasticsearch 使用 Analyzer 将文本分解成一个个 Token,以便进行索引和搜索。选择合适的分词器对于搜索效果至关重要。常用的分词器包括:
standard
、whitespace
、simple
、stop
、keyword
、ik_max_word
(中文)、ik_smart
(中文) 等。您还可以自定义分词器。 -
Scripting (脚本): Elasticsearch 允许您使用脚本来执行复杂的计算和逻辑。常用的脚本语言包括 Painless (Elasticsearch 官方推荐) 和 Groovy。
-
Plugins (插件): Elasticsearch 提供了丰富的插件,可以扩展其功能,例如添加新的分词器、分析器、存储引擎等。
-
Performance Tuning (性能优化): 可以通过调整 Elasticsearch 的配置参数、优化索引结构、使用缓存等方式来提高性能。
-
Security (安全): Elasticsearch 提供了安全特性,例如身份验证、授权、审计等,可以保护您的数据安全。
七、 总结
本教程介绍了 Elasticsearch 的基本概念、安装配置、REST API 操作、搜索功能和数据分析能力。通过学习本教程,您应该能够掌握 Elasticsearch 的基本用法,并将其应用于实际项目中。 Elasticsearch 是一个功能强大的搜索引擎和数据分析工具,希望您能深入学习和探索,充分利用其优势。 记住,实践是最好的老师,多多练习,您将会更加熟练地掌握 Elasticsearch!