diff --git a/elastic search/elastic search.md b/elastic search/elastic search.md new file mode 100644 index 0000000..b54d451 --- /dev/null +++ b/elastic search/elastic search.md @@ -0,0 +1,110 @@ +# 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支持如下查询: +- 全文本搜索:搜索已经被分析和索引过的文本,支持短语或临近查询、模糊匹配等 +- 关键词查询:支持精确的关键词匹配 +- 语义查询 +- 向量查询 +- 地理位置查询 + + + +