- Elasticsearch(ES)简介
- 定义与功能
- Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎。它基于 Lucene 库构建,用于存储、搜索和分析大量数据。其主要功能包括全文搜索、结构化搜索、数据分析等。例如,在一个电商网站中,可以使用 ES 来搜索商品名称、描述等文本信息(全文搜索),也可以根据价格、库存等数值或类别字段进行筛选(结构化搜索),同时还能进行一些数据分析,如统计热门商品、用户搜索行为分析等。
- 核心概念
- 索引(Index):类似于传统数据库中的数据库概念,是文档的集合。例如,一个电商网站可能有一个名为 “products” 的索引,用于存储所有商品信息相关的文档。
- 文档(Document):是可以被索引的基本信息单元,以 JSON 格式存储。在 “products” 索引中,每个商品的详细信息(如名称、价格、描述等)就是一个文档。
- 类型(Type):在较新版本的 ES 中,类型的概念被弱化。它曾经用于在一个索引中区分不同类别的文档。例如,在 “products” 索引中,可以有 “electronics” 类型和 “clothes” 类型的文档,分别代表电子产品和服装产品,但现在更推荐为不同类型的文档创建不同的索引。
- 字段(Field):文档由多个字段组成,每个字段存储文档的一个属性。如商品文档中的 “name”、“price” 等就是字段。
- 定义与功能
- ES 的使用
- 安装与配置
- 下载与安装:可以从 Elasticsearch 官方网站下载适合操作系统的安装包。安装完成后,通过命令行启动 ES 服务。例如,在 Linux 系统中,进入 ES 安装目录的
bin
文件夹,执行./elasticsearch
命令来启动服务。 - 配置文件修改:ES 的配置文件(
elasticsearch.yml
)可以用于修改一些重要的配置参数,如集群名称、节点名称、监听地址等。例如,可以修改cluster.name
参数来设置集群名称,不同的 ES 节点只有在集群名称相同的情况下才能组成一个集群。
- 下载与安装:可以从 Elasticsearch 官方网站下载适合操作系统的安装包。安装完成后,通过命令行启动 ES 服务。例如,在 Linux 系统中,进入 ES 安装目录的
- 数据操作
- 索引创建:通过 RESTful API 或相关的客户端库(如 Java High - Level REST Client)来创建索引。例如,使用
curl -X PUT "http://localhost:9200/my_index"
命令可以创建一个名为 “my_index” 的索引。 - 文档插入:向索引中插入文档,格式为 JSON。例如,使用
curl -X POST "http://localhost:9200/my_index/_doc" -H 'Content - Type: application/json' -d '{"name": "product1", "price": 10.0}'
可以向 “my_index” 索引中插入一个包含 “name” 和 “price” 字段的文档。 - 查询操作:
- 简单查询:可以进行简单的匹配查询,如查询 “my_index” 索引中 “name” 字段包含 “product” 的文档。使用
curl -X GET "http://localhost:9200/my_index/_search?q=name:product"
命令。 - 复杂查询(DSL - Query Domain Specific Language):使用 DSL 可以构建更复杂的查询。例如,查询价格大于 10 且小于 20 的商品文档,使用以下 JSON 格式的查询:
{ "query": { "range": { "price": { "gt": 10, "lt": 20 } } } }
通过
curl -X GET "http://localhost:9200/my_index/_search" -H 'Content - Type: application/json' -d '上述JSON查询内容'
来执行查询。 - 数据更新与删除:
- 更新:可以部分更新文档的字段。例如,使用
curl -X POST "http://localhost:9200/my_index/_update/文档ID" -H 'Content - Type: application/json' -d '{"doc": {"price": 15.0}}
来更新指定文档的价格字段。 - 删除:删除索引或文档。使用
curl -X DELETE "http://localhost:9200/my_index/_doc/文档ID"
可以删除指定文档,使用curl -X DELETE "http://localhost:9200/my_index"
可以删除整个索引。
- 更新:可以部分更新文档的字段。例如,使用
- 简单查询:可以进行简单的匹配查询,如查询 “my_index” 索引中 “name” 字段包含 “product” 的文档。使用
- 索引创建:通过 RESTful API 或相关的客户端库(如 Java High - Level REST Client)来创建索引。例如,使用
- ES 源码分析(以简单的角度)
- 启动流程分析
- 在 ES 启动时,
org.elasticsearch.bootstrap.Elasticsearch
类是入口点。它会加载配置文件,解析命令行参数,然后启动节点。主要的步骤包括初始化安全模块、插件服务、节点环境等。例如,在Node
类的构造函数中,会创建各种服务(如索引服务、集群服务等),这些服务的创建涉及到一系列的初始化操作,如加载索引元数据、建立集群通信等。
- 在 ES 启动时,
- 索引操作源码分析
- 索引创建:在
org.elasticsearch.indices.IndicesService
类中,createIndex
方法负责创建索引。它会进行一系列的验证和初始化操作,包括检查索引名称的合法性、创建索引的元数据(如映射信息)等。在创建过程中,会涉及到与存储模块(如磁盘存储)的交互,将索引的元数据持久化到磁盘上。 - 文档插入:文档插入操作主要涉及到
org.elasticsearch.action.index.IndexRequest
和org.elasticsearch.action.index.IndexResponse
类。当执行文档插入请求时,请求会经过一系列的处理器,如TransportIndexAction
类会处理索引操作在节点间的传输。在存储层,文档会被写入到 Lucene 索引中,这个过程涉及到对文档进行分词(如果是文本字段)、构建倒排索引等操作,这些操作主要在 Lucene 的相关类中实现,ES 通过封装 Lucene 来提供更高级的功能。
- 索引创建:在
- 查询操作源码分析
- 简单查询:对于简单查询(如通过
q
参数的查询),org.elasticsearch.rest.action.search.RestSearchAction
类会解析查询参数,然后构建一个基本的查询请求。这个请求会被传递到查询执行引擎,在引擎内部,会根据查询类型(如全文查询或结构化查询)进行不同的处理。 - 复杂查询(DSL):当使用 DSL 进行查询时,
org.elasticsearch.search.SearchRequest
和org.elasticsearch.search.SearchResponse
类参与其中。SearchRequest
用于构建复杂的查询请求,它包含了查询条件、排序方式、分页信息等。在查询执行过程中,会根据请求中的查询条件(如range
查询中的范围条件),通过解析器将其转换为 Lucene 能够理解的查询形式,然后在索引中进行查找。在结果返回阶段,会对查询结果进行封装和处理,如根据排序和分页要求返回相应的结果集。
- 简单查询:对于简单查询(如通过
- 启动流程分析
- 安装与配置