百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Elasticsearch详解

toyiye 2024-06-21 11:57 10 浏览 0 评论

Elasticsearch是什么

Elasticsearch是使用Lucene 为基础建立的开源可用全文搜索引擎,它可以快速地储存、搜索和分析海量数据

Elasticsearch的特点和传统的关系数据库对比

  • 关系型数据库查询性能,数据量超过百万级千万级之后下降厉害,本质是索引的算法效率不行,B+ 树算法不如倒排索引算法高效。
  • 关系型数据库索引最左原则限制,查询条件字段不能任意组合,否则索引失效,相反 Elasticserach 可以任意组合,此场景在数据表关联查询时特别明显
  • 关系型数据库聚合性能低下,数据量稍微多点,查询列基数多一点性能下降很快,Elasticsearch 在聚合上采用的是列式存储,效率极高。
  • 传统数据库更均衡,拥有事务隔离机制
  • Elasticsearch 在数据分析领域,产品能力偏弱一些,简单通用的场景需求可以大规模使用,不适合复杂聚合、大规模 Rollup(可以将某些索引中的数据进行周期性自定义化聚合,然后将聚合后的数据写入到新的索引中,整个流程叫做 Rollup,从而减少存储空间和计算资源的消耗)、大规模的 Key-Value。
  • Elasticsearch对结果支持相关度排序,支持高亮显示等。

Elasticsearch核心概念

  • Cluster:集群,由一个或多个 Elasticsearch 节点组成。
  • Node:节点,组成 Elasticsearch 集群的服务单元,同一个集群内节点的名字不能重复。通常在一个节点上分配一个或者多个分片。
  • Shards:分片,当索引上的数据量太大的时候,我们通常会将一个索引上的数据进行水平拆分,拆分出来的每个数据库叫作一个分片。在一个多分片的索引中写入数据时,通过路由
  • shard = hash(routing) % number_of_primary_shards
  • 来确定具体写入那一个分片中,所以在创建索引时需要指定分片的数量,并且分片的数量一旦确定就不能更改。
  • 分片后的索引带来了规模上(数据水平切分)和性能上(并行执行)的提升。每个分片都是 Luence 中的一个索引文件,每个分片必须有一个主分片和零到多个副本分片。
  • 对文档的新建、索引和删除请求都是写操作,必须在主分片上面完成之后才能被复制到相关的副本分片。所有的副本分片都报告写成功才会向客户端报告成功
  • Replicas:备份也叫作副本,是指对主分片的备份。主分片和备份分片都可以对外提供查询服务,写操作时先在主分片上完成,然后分发到备份上。
  • 当主分片不可用时,会在备份的分片中选举出一个作为主分片,所以备份不仅可以提升系统的高可用性能,还可以提升搜索时的并发性能。但是若副本太多的话,在写操作时会增加数据同步的负担。
  • Index:索引,由一个和多个分片组成,通过索引的名字在集群内进行唯一标识。
  • Type:类别,指索引内部的逻辑分区,通过 Type 的名字在索引内进行唯一标识。在查询时如果没有该值,则表示在整个索引中查询。
  • Document:文档,索引中的每一条数据叫作一个文档,类似于关系型数据库中的一条数据通过 _id 在 Type 内进行唯一标识。
  • Settings:对集群中索引的定义,比如一个索引默认的分片数、副本数等信息。
  • Mapping:类似于关系型数据库中的表结构信息,用于定义索引中字段(Field)的存储类型、分词方式、是否存储等信息。Elasticsearch 中的 Mapping 是可以动态识别的。
  • 如果没有特殊需求,则不需要手动创建 Mapping,因为 Elasticsearch 会自动根据数据格式识别它的类型,但是当需要对某些字段添加特殊属性(比如:定义使用其他分词器、是否分词、是否存储等)时,就需要手动设置 Mapping 了。一个索引的 Mapping 一旦创建,若已经存储了数据,就不可修改了。
  • Analyzer:字段的分词方式的定义。一个 Analyzer 通常由一个 Tokenizer、零到多个 Filter 组成。
  • 比如默认的标准 Analyzer 包含一个标准的 Tokenizer 和三个 Filter:Standard Token Filter、Lower Case Token Filter、Stop Token Filter。

Elasticsearch 的节点的分类如下:

①主节点(Master Node):也叫作主节点,主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch 中的主节点的工作量相对较轻。

用户的请求可以发往任何一个节点,并由该节点负责分发请求、收集结果等操作,而并不需要经过主节点转发。

通过在配置文件中设置 node.master=true 来设置该节点成为候选主节点(但该节点不一定是主节点,主节点是集群在候选节点中选举出来的),在 Elasticsearch 集群中只有候选节点才有选举权和被选举权。其他节点是不参与选举工作的。

②数据节点(Data Node):数据节点,负责数据的存储和相关具体操作,比如索引数据的创建、修改、删除、搜索、聚合。

所以,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统 CPU、Memory 和 I/O 的性能消耗都很大。

通常随着集群的扩大,需要增加更多的数据节点来提高可用性。通过在配置文件中设置 node.data=true 来设置该节点成为数据节点。

Elasticsearch集群的状态

有 Green、Yellow 和 Red 三种,如下所述:

  • Green:绿色,健康。所有的主分片和副本分片都可正常工作,集群 100% 健康。
  • Yellow:黄色,预警。所有的主分片都可以正常工作,但至少有一个副本分片是不能正常工作的。此时集群可以正常工作,但是集群的高可用性在某种程度上被弱化。
  • Red:红色,集群不可正常使用。集群中至少有一个分片的主分片及它的全部副本分片都不可正常工作。
  • 这时虽然集群的查询操作还可以进行,但是也只能返回部分数据(其他正常分片的数据可以返回),而分配到这个分片上的写入请求将会报错,最终会导致数据的丢失。
GET /_cluster/health

Elasticsearch如何搜索的

name

content

静夜思

床前明月光,疑是地上霜。举头望明月,低头思故乡。

春晓

春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。

望庐山瀑布

日照香炉生紫烟,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。

如果用像 MySQL 这样的数据库来存储古诗的话,我们应该会查询带前的古诗句

select name from poems where content like "%前%";

这种会使用顺序扫描法,无法使用索引,效率低

像Elasticsearch之类的搜索引擎,会如何去做呢

  • 内容分词,提取关键词
  • 根据关键词建立倒排索引

倒排索引建立的样子

关键字

名称

静夜思

静夜思,望庐山瀑布

Elasticsearch查询逻辑的几个术语

  • 词条(Term):索引里面最小的存储和查询单元,对于英文来说是一个单词,对于中文来说一般指分词后的一个词,相当于上面的单个关键字
  • 词典(Term Dictionary):或字典,是词条 Term 的集合。搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。相当于上面关键字的集合。
  • 倒排表(Post list):一个文档通常由多个词组成,倒排表记录的是某个词在哪些文档里出现过以及出现的位置,相当于上面的名称的集合。
  • 倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

Term查询的方式

term dictionary,ES 为了能快速查找到 term,将所有的 term 排了一个序,二分法查找。是不是感觉有点眼熟,这就是 MySQL 的索引方式的,直接用 B+树建立索引词典指向被索引的数据。

Elasticsearch

  1. es删除文档的时候不会立刻释放空间,删除索引的时候会释放空间,删除文档后可以调用合并接口立刻释放资源,不过一般es会有自动合并的一些措施。
  2. es并不是实时搜索的,插入数据后,会现在缓存,一般是1s,定期刷新到磁盘。

Elasticsearch使用

  1. 创建索引
  2. $ curl -X PUT 'localhost:9200/weather'
  1. 删除索引
  2. $ curl -X DELETE 'localhost:9200/weather'
  1. 新增记录
  2. $ curl -X PUT 'localhost:9200/accounts/person/1' -d '
    {
    "user": "张三",
    "title": "工程师",
    "desc": "数据库管理"
    }
    '

 $ curl -X POST 'localhost:9200/accounts/person' -d '
 {
   "user": "李四",
   "title": "工程师",
   "desc": "系统管理"
 }'
  1. 查看记录
  2. $ curl 'localhost:9200/accounts/person/1?pretty=true'
  1. 更新记录
  2. $ curl -X PUT 'localhost:9200/accounts/person/1' -d '
    {
    "user" : "张三",
    "title" : "工程师",
    "desc" : "数据库管理,软件开发"
    }
    '
  1. 查询所有
  2. $ curl 'localhost:9200/accounts/_type/_search'
  1. 查询符合条件的
  2. $ curl 'localhost:9200/accounts/person/_search' -d '
    {
    "query" : { "match" : { "desc" : "软件" }}
    }
    '
  1. 查询or 软件或者系统
  2. $ curl 'localhost:9200/accounts/person/_search' -d '
    {
    "query" : { "match" : { "desc" : "软件 系统" }}
    }
    '
  1. 执行多个关键词的and搜索
 $ curl 'localhost:9200/accounts/person/_search'  -d '
 {
   "query": {
     "bool": {
       "must": [
         { "match": { "desc": "软件" } },
         { "match": { "desc": "系统" } }
       ]
     }
   }
 }'
  1. 删除记录
 $ curl -X DELETE 'localhost:9200/accounts/person/1' 

Elasticsearch的一些优化处理

  1. 不要把所有的数据都写在es里,我们可以把需要搜索的数据和id存入,其他不需要查询的存在mysql/hbase里,就是es+mysql/hbase这样一个架构
  2. es机器的内存大的话,有利于查询
  3. 可以做数据预热,经常访问的数据,每隔一会儿,自己的后台系统去搜索一下热数据,刷到 filesystem cache
  4. 冷热分离,就是说将大量的访问很少、频率很低的数据,单独写一个索引,然后将访问很频繁的热数据单独写一个索引。最好是将冷数据写入一个索引中,然后热数据写入另外一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在 filesystem os cache 里,别让冷数据给冲刷掉。
  5. 批量写入,看每条数据量的大小,一般都是几百到几千。

参考

Elasticsearch用得好,下班下得早 https://mp.weixin.qq.com/s/Vawue5I2ZnaEIf_OlT7wJQ

全文搜索引擎 Elasticsearch 入门 https://mp.weixin.qq.com/s/Cvf4_b0nmLCvN9TaeK0VoA

倒排索引的秘密 https://mp.weixin.qq.com/s/vwTrRSfgJ-7bWQUJWhfaHQ

看完这篇还不会Elasticsearch,我跪搓衣板!https://mp.weixin.qq.com/s/PIl9_1ogyKVDd0nxz8PhUw

掌握它才说明你真正懂Elasticsearch https://mp.weixin.qq.com/s/cgpWEXGLYMitTgXaH5EvLA

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码