ES知识总结

本文深入探讨了Elasticsearch,一个分布式、高扩展、高实时的搜索与数据分析引擎。从其起源、发展历程到实际使用,涵盖了数据操作、查询操作、性能优化以及与MySQL的对比。文章强调了Elasticsearch在满足大量数据和实时性需求的同时,牺牲了部分精确度,特别是在聚合设计上的表现。此外,还讨论了如何通过设置参数和理解其工作原理来优化ES的性能。
摘要由CSDN通过智能技术生成

背景

简介

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。
在这里插入图片描述
从上图可以看到数据量、实时性、精确度只能满足两种,ES则是满足数据量和实时性,牺牲了部分精确度,主要体现在聚合的设计上,后续会具体分析

起源于Lucene

  • 基于Java开发
  • 创建于1999年,2005年成为Apache顶级开源项目
  • Lucene具有高性能、易扩展的优点
  • Lucene的局限性:
    • 只能基于Java语言开发
    • 类库的接口学习曲线陡峭
    • 原生并不支持水平扩展

发展历程

2004:Shay Banon创造了Elasticsearch的前身,称为Compass。
2010:Shay Banon在2010年2月发布了Elasticsearch的第一个版本。
2012:Elasticsearch BV成立于2012年,主要围绕Elasticsearch及相关软件提供商业服务和产品。

使用情况

https://db-engines.com/en/ranking

生态圈

在这里插入图片描述

客户端

在这里插入图片描述
go使用的是elastic/v7

ES的数据操作

创建索引

首先看下基本的创建索引语句

PUT /my_index
{
   
  "settings": {
   
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
   
    "properties": {
   
      "title": {
   
        "type": "text"
      },
      "description": {
   
        "type": "keyword"
      },
      "price": {
   
        "type": "float"
      }
    }
  }
}

其中:
settings: 索引级别的设置,包括分片数、副本数、分析器、过滤器等。
mappings: 字段映射,定义了索引中包含的字段及其数据类型、分析器等。

具体看下settings里面比较重要的几个参数
number_of_shards: 索引的分片数,决定了索引数据在集群中被分成多少个部分。每个分片都是一个独立的 Lucene 索引,可以在不同的节点上存储和处理。默认值为 5。该参数不能修改,修改时需要做数据迁移,因此设置要慎重,一般来说一个分片的规划容量不要超过50G
number_of_replicas: 索引的副本数,决定了每个分片有多少个副本。副本可以提高索引的可用性和容错性,当某个节点宕机时,可以从其它副本中恢复数据。默认值为 1。该参数可以修改

另外还有几个刷盘的参数,一般来说是使用默认(不重要的参数),如
refresh_interval: 刷新间隔,控制多久刷新一次内存中的索引数据到磁盘中,默认为1秒。
index.translog.sync_interval: 事务日志同步间隔,控制多久将内存中的事务日志写入磁盘中,默认为5秒。
index.translog.flush_threshold_ops: 内存中的事务日志达到多少条时触发写入磁盘操作,默认为5000条。
index.translog.flush_threshold_size: 内存中的事务日志达到多少大小时触发写入磁盘操作,默认为512MB。
index.translog.flush_threshold_period: 内存中的事务日志存储时间达到多久时触发写入磁盘操作,默认为30分钟。
从上面的各种参数可以看出,ES是在各种条件下才会将数据落盘,因此ES的数据写进去的时候不是立即能查到的

看完setting的参数,接下来简单看下mappings的参数(只解释最基本的操作,后续用到了再google查询即可)

  "mappings": {
   
    "properties": {
   
      "title": {
   
        "type": "text"
      },
      "description": {
   
        "type": "keyword"
      },
      "price": {
   
        "type": "float"
      },
      "date": {
   
      "type":"date",
      "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
      }
    }
  }

从上面看有title、description、price三个字段,三个字段的类型分别是text、keyword、float,下面是常用类型的表格

类型 说明
text 默认类型,不填则默认使用text,当一个字段需要用于全文搜索(会被分词), 比如产品名称、产品描述信息, 就应该使用text类型.
keyword 可理解为不需要分词的string,当一个字段需要按照精确值进行过滤、排序、聚合等操作时, 就应该使用keyword类型
byte 有符号的8位整数, 范围: [-128 ~ 127]
short 有符号的16位整数, 范围: [-32768 ~ 32767]
integer 有符号的32位整数, 范围: [−231 ~ 231 -1]
long 有符号的64位整数, 范围: [−263~ 263 -1]
float 32位单精度浮点数
double 64位双精度浮点数
date 包含格式化日期的字符串, “2018-10-01”, 或"2018/10/01 12:10:30",代表时间毫秒数的长整型数字,代表时间秒数的整数
boolean 布尔值
有些类型没列出来,等后续开发中用到了再去查询,现在全列出来也不一定能记住

添加文档

分为指定ID或不指定ID添加文档
指定ID添加文档

PUT /my_index/_doc/1
{
   
  "title": "Elasticsearch",
  "description": "Elasticsearch is a distributed, RESTful search and analytics engine",
  "price": 100.0
}

不指定ID添加文档

POST /my_index/_doc
{
   
  "title": "Elasticsearch",
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值