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

6.4 KiB
Raw Blame History

ElasticSearch

简介

ElasticSearch是一个分布式的搜索和分析引擎、可缩放的数据存储、矢量数据库vector database

用例场景

如下是ElasticSearch的用例场景

  • 日志es可以用于收集、存储和分析日志
  • full-text search通过倒排索引es可以用于构建全文本搜索方案

安装

下列安装示例基于Ubuntu 22.04

add elasticsearch GPG keys

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

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
sudo apt update && sudo apt install elasticsearch

Indices, documents, and fields

在ES中index是存储的基本单元是存储数据的逻辑namespace位于同一index下的存储数据共享相似的特征。

在ES服务部署之后需要创建index并在index中存储数据。

index是一系列document的集合通过namealias唯一标识,在查询或其他操作中,通过unique name来定位index。

Documents and fields

ElasticSearch以json文档的格式来序列化和存储数据。一个document是fields的集合field则是对应的key-value pair。每个document都有一个唯一的id文档id可以手动指定也可以让ES自动生成。

一个ES文档的格式如下所示

{
  "_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

返回相应结构如下,代表索引创建成功:

{
  "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。

{
  "_index": "books", 
  "_id": "O0lG2IsBaSa7VYx_rEia", 
  "_version": 1, 
  "result": "created", 
  "_shards": { 
    "total": 2, 
    "successful": 2, 
    "failed": 0 
  },
  "_seq_no": 0, 
  "_primary_term": 1 
}