Files
rikako-note/elastic search/elastic search.md
2024-10-17 21:04:25 +08:00

177 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ElasticSearch
## 简介
ElasticSearch是一个分布式的搜索和分析引擎、可缩放的数据存储、矢量数据库vector database
### 用例场景
如下是ElasticSearch的用例场景
- 日志es可以用于收集、存储和分析日志
- full-text search通过倒排索引es可以用于构建全文本搜索方案
### 安装
下列安装示例基于Ubuntu 22.04
#### add elasticsearch GPG keys
```bash
wget -q https://artifacts.elastic.co/GPG-KEY-elasticsearch -O- | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
```
#### Add Elasticsearch 8.x APT Repository
```bash
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
```
#### install elastic search
```bash
sudo apt update && sudo apt install elasticsearch
```
### Indices, documents, and fields
在ES中index是存储的基本单元是存储数据的逻辑namespace位于同一index下的存储数据共享相似的特征。
在ES服务部署之后需要创建index并在index中存储数据。
index是一系列document的集合通过`name``alias`唯一标识,在查询或其他操作中,通过`unique name`来定位index。
#### Documents and fields
ElasticSearch以json文档的格式来序列化和存储数据。一个document是fields的集合field则是对应的key-value pair。每个document都有一个唯一的id文档id可以手动指定也可以让ES自动生成。
一个ES文档的格式如下所示
```json
{
"_index": "my-first-elasticsearch-index",
"_id": "DyFpo5EBxE8fzbb95DOa",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source": {
"email": "john@smith.com",
"first_name": "John",
"last_name": "Smith",
"info": {
"bio": "Eco-warrior and defender of the weak",
"age": 25,
"interests": [
"dolphins",
"whales"
]
},
"join_date": "2024/05/01"
}
}
```
#### metadata field
一个indexed document包含data和metadata。
metadata fields为系统fields用于存储document的相关信息在elastic search中metadata field以下划线`_`开头例如如下field为metadata field
- `_id`文档id文档id在每个index中都是唯一的
- `_index`标识该文档存储在哪个index中
#### Mappings and data types
每个index都有mapping或schema用于指定document中的fields如何被索引。
一个`mapping`定义了每个field的data type以及该field如何被索引、该field如何被存储。
在将document添加到index时对于`mapping`有如下两种选择:
- `Dynamic Mapping`让ES自动检测data type并创建mapping。在引入dynamic mapping后可能会针对某些用例场景产生次优结果
- `Explicit Mapping`针对每个field手动指定data type
### 向ElasticSearch中添加数据
#### General content
General content是不包含时间戳的数据对于general content可以通过如下方式添加到ES中
- API可以通过HTTP API向ES中添加数据
#### Timestamped data
Timestamped data代表包含timestamp field的数据如果使用了`Elastic Common Schema(ECS)`那么timestamp field的名称为`@timestamp`,这些数据可能是`logs, metrics, traces`
### 查询和分析数据
可以通过如下方式来查询和分析数据
#### Rest Api
可以通过rest api来管理elastic search集群并索引和查询数据。
#### query language
ES提供了多种查询语言来和数据进行交互
- Query DSL: ES主要的查询语言
- ES|QL: 8.11中新增的piped query language和计算引擎
##### Query DSL
query DSL是一种json格式的查询语言支持复杂的查询、过滤、聚合操作是ES最原始也是功能最强的查询语言
`_search` endpoint接收Query DSL格式的查询
query DSL支持如下查询
- 全文本搜索:搜索已经被分析和索引过的文本,支持短语或临近查询、模糊匹配等
- 关键词查询:支持精确的关键词匹配
- 语义查询
- 向量查询
- 地理位置查询
##### Query DSL分析
如果要通过Query DSL对elastic search数据进行分析那么Aggregations是主要的工具。
Aggregations允许根据数据构建复杂的数据摘要并获取指标、模式和趋势。
aggregations利用了和查询相同的数据结构故而聚合的速度十分快可以实时的对数据进行分析和可视化。
在使用ES时可以在同一时刻对相同的数据同时进行文档查询、结果过滤、数据分析操作聚合是在查询请求的上下文中进行计算的。
ES支持如下类型的Aggregations
- Metric计算metrics例如field的总和或平均
- Bucket基于field value、范围或其他指标对文档进行分组
- Pipeline在其他聚合操作结果集的基础上执行聚合操作
##### ES | QL
Elasticsearch Query Language是一个piped query language用于对数据进行过滤、transforming、分析。ES|QL基于新的计算引擎查询、聚合、transformation方法是直接在Elasticsearch中执行的。在Kibana工具中可以使用ES|QL语法。
ES|QL支持Query DSL中的部分特性例如聚合、过滤、transformation
## 使用ElasticSearch Api索引和查询数据
### 创建索引
可以通过如下方式来创建一个名为`books`的索引:
```
PUT /books
```
返回相应结构如下,代表索引创建成功:
```json
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "books"
}
```
### 向索引中添加数据
可以向ElasticSearch中添加json形式的数据json格式数据被称为document。ElasticSearch将添加的数据保存到可搜索的索引中。
#### 向索引中添加单个document
```
POST books/_doc
{
"name": "Snow Crash",
"author": "Neal Stephenson",
"release_date": "1992-06-01",
"page_count": 470
}
```
该请求的返回体中包含ElasticSearch为该document生成的元数据包含索引范围内唯一的`_id`在索引范围内唯一标识该document。
```json
{
"_index": "books",
"_id": "O0lG2IsBaSa7VYx_rEia",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
```