Elasticsearch教程:索引、搜索与分析实战
Elasticsearch 教程:索引、搜索与分析实战
Elasticsearch 是一个基于 Lucene 库的开源搜索引擎,它提供了一个分布式、支持多租户的全文搜索引擎,具有 HTTP Web 接口和无模式 JSON 文档。Elasticsearch 是用 Java 开发的,并在 Apache 许可下作为开源软件发布。它可以快速地存储、搜索和分析海量数据。
本教程将带领你深入了解 Elasticsearch 的核心概念,并通过实战演练,让你掌握如何使用 Elasticsearch 进行索引、搜索和分析。我们将涵盖以下主题:
一、 基础概念
- 1.1 文档 (Document):Elasticsearch 是面向文档的,文档是所有可搜索数据的最小单位。例如,一篇博客文章、一个产品信息或一条用户评论都可以表示为一个文档。文档以 JSON 格式存储。
- 1.2 索引 (Index):索引是具有相似特征的文档的集合。例如,你可以拥有一个客户数据的索引,另一个产品目录的索引。索引由一个名称来标识,该名称必须是全部小写。
- 1.3 类型 (Type):在 Elasticsearch 7.x 版本之前,一个索引可以包含多个类型,类型是索引的逻辑分类或分区,允许你在同一索引中存储不同结构的文档。从 Elasticsearch 7.x 版本开始,单个索引只能有一个类型,8.x 版本将完全移除类型的概念, 默认使用
_doc
。 - 1.4 字段 (Field):文档由字段组成,每个字段包含一个或多个值。例如,一个产品文档可能包含名称、描述、价格和类别等字段。
- 1.5 映射 (Mapping):映射定义了索引中每个字段的数据类型和属性,例如文本字段、数字字段、日期字段等。映射还定义了如何分析这些字段,以便于搜索。
- 1.6 节点 (Node):一个节点是 Elasticsearch 集群中的一个运行实例,负责存储数据和执行搜索操作。
- 1.7 集群 (Cluster):集群由一个或多个节点组成,它们协同工作以提供索引和搜索功能。集群由一个名称来标识。
- 1.8 分片 (Shard):为了处理大规模数据,Elasticsearch 可以将一个索引分成多个分片。每个分片本身就是一个完全功能的“索引”,可以托管在集群中的任何节点上。分片可以提高性能和可扩展性。
- 1.9 副本 (Replica):副本是分片的复制,用于提供高可用性和故障转移。如果一个节点发生故障,副本可以接管其工作。
二、安装与配置
本教程假设你已经安装了 Elasticsearch 和 Kibana。如果没有,请参考官方文档进行安装。
- 2.1 Elasticsearch 安装:可以从 Elasticsearch 官网下载相应版本的安装包,支持多种操作系统。安装完成后,可以通过
bin/elasticsearch
命令启动 Elasticsearch。 - 2.2 Kibana 安装:Kibana 是一个开源的数据可视化平台,它可以与 Elasticsearch 配合使用,让你能够直观地查看和分析数据。安装完成后,可以通过
bin/kibana
命令启动 Kibana。 - 2.3 配置文件:Elasticsearch 的配置文件位于
config/elasticsearch.yml
,可以在其中配置集群名称、节点名称、网络设置等。Kibana 的配置文件位于config/kibana.yml
。
三、索引操作实战
-
3.1 创建索引
我们可以使用 Kibana 的 Dev Tools 来执行 Elasticsearch 的 API 请求。打开 Kibana,导航到 Dev Tools,然后输入以下命令来创建一个名为
products
的索引,其中包含一些示例文档的映射:json
PUT /products
{
"mappings": {
"properties": {
"name": { "type": "text" },
"description": { "type": "text" },
"price": { "type": "double" },
"category": { "type": "keyword" }
}
}
}这个命令创建了一个名为
products
的索引,并定义了四个字段:name
、description
、price
和category
。每个字段都有一个特定的数据类型,例如text
用于全文搜索,double
用于存储浮点数,keyword
用于精确匹配。 -
3.2 索引文档
创建索引后,我们可以开始索引文档。以下命令索引了一个新的产品文档到
products
索引中:json
POST /products/_doc/1
{
"name": "Elasticsearch 实战教程",
"description": "一本详细介绍 Elasticsearch 的实用指南",
"price": 99.99,
"category": "书籍"
}这个命令将一个 JSON 文档索引到
products
索引中,并指定了文档 ID 为1
。可以根据需要索引更多文档。 -
3.3 更新文档
可以使用
_update
API 来更新已有的文档。例如,以下命令更新了 ID 为1
的文档的价格:json
POST /products/_update/1
{
"doc": {
"price": 88.88
}
} -
3.4 删除文档
可以使用
_delete
API 来删除文档。例如,以下命令删除了 ID 为1
的文档:json
DELETE /products/_doc/1 -
3.5 删除索引
可以使用
DELETE
请求来删除整个索引。例如,以下命令删除了products
索引:json
DELETE /products请谨慎使用删除索引操作,因为它会永久删除索引及其所有文档。
四、搜索操作实战
Elasticsearch 提供了强大的搜索功能,可以通过各种查询条件来检索文档。
-
4.1 基本搜索
最简单的搜索是使用
_search
API,不带任何查询条件。这将返回索引中的所有文档:json
GET /products/_search -
4.2 查询字符串搜索 (Query String Search)
查询字符串搜索允许你在查询字符串中指定搜索条件。例如,以下命令搜索
name
字段中包含 "Elasticsearch" 的文档:json
GET /products/_search?q=name:Elasticsearch -
4.3 查询 DSL (Domain Specific Language)
查询 DSL 是一种更强大、更灵活的搜索方式,它使用 JSON 格式来构建查询。以下是一些常用的查询类型:
-
4.3.1 匹配查询 (Match Query)
匹配查询用于执行全文搜索。例如,以下命令搜索
description
字段中包含 "实用指南" 的文档:json
GET /products/_search
{
"query": {
"match": {
"description": "实用指南"
}
}
} -
4.3.2 精确值查询 (Term Query)
精确值查询用于查找包含指定精确值的文档。例如,以下命令搜索
category
字段值为 "书籍" 的文档:json
GET /products/_search
{
"query": {
"term": {
"category": "书籍"
}
}
} -
4.3.3 范围查询 (Range Query)
范围查询用于查找指定范围内的值。例如,以下命令搜索
price
字段值在 50 到 100 之间的文档:json
GET /products/_search
{
"query": {
"range": {
"price": {
"gte": 50,
"lte": 100
}
}
}
} -
4.3.4 布尔查询 (Bool Query)
布尔查询允许你组合多个查询条件。它支持
must
、should
、must_not
和filter
子句。must
:文档必须匹配所有must
子句中的查询。should
:文档应该匹配should
子句中的一个或多个查询。must_not
:文档不能匹配must_not
子句中的任何查询。filter
:类似于must
,但filter
子句中的查询不参与评分。
例如,以下命令搜索
category
字段值为 "书籍" 且price
字段值小于 100 的文档:json
GET /products/_search
{
"query": {
"bool": {
"must": [
{ "term": { "category": "书籍" } },
{ "range": { "price": { "lt": 100 } } }
]
}
}
}
-
-
4.4 过滤搜索结果
除了使用
filter
子句,还可以使用post_filter
来过滤搜索结果。post_filter
在查询执行后应用,因此它不会影响评分。json
GET /products/_search
{
"query": {
"match": {
"description": "实用指南"
}
},
"post_filter": {
"term": {
"category": "书籍"
}
}
} -
4.5 排序
可以使用
sort
参数对搜索结果进行排序。例如,以下命令按price
字段降序排序:json
GET /products/_search
{
"query": {
"match_all": {}
},
"sort": [
{ "price": { "order": "desc" } }
]
} -
4.6 分页
可以使用
from
和size
参数对搜索结果进行分页。from
指定起始文档的偏移量,size
指定返回的文档数量。例如,以下命令返回从第 11 个文档开始的 10 个文档:json
GET /products/_search
{
"query": {
"match_all": {}
},
"from": 10,
"size": 10
}
五、分析操作实战
分析是将文本转换为适合搜索的词条的过程。Elasticsearch 提供了强大的分析功能,可以通过配置不同的分析器、分词器和过滤器来实现。
-
5.1 分析器 (Analyzer)
分析器负责将文本分解成词条。Elasticsearch 内置了多种分析器,例如
standard
、simple
、whitespace
等。你也可以自定义分析器。 -
5.2 分词器 (Tokenizer)
分词器将文本分割成单个词条。例如,
standard
分词器将文本按单词边界分割,并删除大多数标点符号。 -
5.3 过滤器 (Token Filter)
过滤器对分词器生成的词条进行进一步处理,例如转换为小写、删除停用词、添加同义词等。
-
5.4 测试分析器
可以使用
_analyze
API 测试分析器的效果。例如,以下命令使用standard
分析器分析文本 "Elasticsearch 实战教程":json
GET /_analyze
{
"analyzer": "standard",
"text": "Elasticsearch 实战教程"
}返回结果将显示分析后的词条列表。
-
5.5 自定义分析器
你可以在创建索引时自定义分析器。例如,以下命令创建了一个名为
my_index
的索引,并定义了一个名为my_analyzer
的自定义分析器,该分析器使用standard
分词器和lowercase
过滤器:json
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}这个例子中,
content
字段使用了自定义的my_analyzer
分析器。
六、总结
本教程介绍了 Elasticsearch 的核心概念,包括索引、搜索和分析。我们通过实战演练,演示了如何创建索引、索引文档、执行各种搜索操作以及配置分析器。Elasticsearch 是一个功能强大的搜索引擎,可以应用于各种场景,例如全文搜索、日志分析、数据分析等。希望本教程能够帮助你入门 Elasticsearch,并将其应用于你的实际项目中。
为了更深入地学习 Elasticsearch,建议你阅读官方文档并进行更多的实践练习。你还可以探索 Elasticsearch 的高级功能,例如聚合、脚本、地理空间搜索等。祝你在 Elasticsearch 的学习之旅中取得成功!