死磕ES-第一章

一句话介绍

ElasticSearch「实时」分布式搜索分析引擎」,内部使用 Lucene 做索引与搜索。

主要功能

  • 分布式搜索引擎

  • 大数据近实时分析引擎

产品特性

  • 高性能
  • 易用
  • 易扩展

Lucene

  • 是基于Java语言开发的类库
  • 具有高性能、易扩展的特点
  • 具有局限性
    • 只能基于Java语言开发
    • 类库的接口学习曲线陡峭
    • 原生并不支持水平扩展

与Lucene关系

ES是基于Lucene开发的,主要扩展点在于

  • 支持分布式
  • 可水平扩展
  • 降低了全文检索的学习曲线
  • 可以被其他编程语言调用

生态圈

死磕ES-第一章

与数据库集成

死磕ES-第一章
  • 单独使用ES存储
  • 与数据库并存,集成
    • 与现有系统的集成
    • 需要考虑事务性
    • 数据更新频繁

日志分析

死磕ES-第一章

本地部署与水平扩展

死磕ES-第一章

基本概念

死磕ES-第一章

Index索引

介绍

死磕ES-第一章

  • 索引是文档的容器,是一类文档的结合
    • index体现了逻辑空间的概念,每个索引都有自己的mapping定义,由于定义包含的文档的字段名和字段类型
    • shard体现了物理空间的概念,索引中的数据分散在Shard上
  • 索引的「Mapping」「Settings」
    • 「Mapping」定义文档字段的类型
    • 「Setting」定义不同的数据分布

索引的不同语义

死磕ES-第一章

Type 类型

7.0之前一个Index可以设置多个Types

6.0之后Type被废弃,7.0之后索引只可以设置一个Type

Document 文档

介绍

  • ES是面向文档的,文档是所有可搜索数据的最小单位

    • 日志中的文件项
    • 一部电影中的具体信息
  • 文档会被序列化成JSON格式保存在ES中

  • 每个文档都有一个Unique ID

    可以自己指定也可以由ES生成

JSON文档

  • 一篇文档包含了一系列的字段。类似数据库的一条记录
  • 格式灵活不需要预先定义格式
    • 字段的类型可以指定或者通过ES自动推算
    • 支持数组、支持嵌套

元数据

用于标注文档的相关信息

  • _index :文档所属的索引名
  • _type :文档所属的类型名
  • _id :文档唯一id
  • _score :相关性得分
  • _source :文档的原始JSON数据
  • _all :整合所有字段内容到该字段,已被废除
  • _version :文档的版本信息

死磕ES-第一章

分片

主分片

用来解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上

副本

用来解决数据高可用的问题。副本分片是主分片的拷贝

  • 副本分片数可以动态调整
  • 增加副本数可以一定程度提高服务可用性

分片的设定

分片数设定过小

  • 后续无法增加节点实现水平扩展
  • 单个分片的数据量太大,导致数据重新分配耗时

分片数设定过大

7.0开始默认主分片设置为1,解决了over-sharding的问题

  • 影响搜索结果的相关性打分,影响统计结果的准确性
  • 单个节点过多分片,资源浪费,牺牲性能

倒排索引

介绍

正排和倒排的区别

正排
死磕ES-第一章
倒排
死磕ES-第一章
图书和搜索引擎的类比
  • 图书

    • 正排索引-目录页
    • 倒排索引-英文首字母索引页
  • 搜索引擎

    • 正排索引-文档id到文档内容和单词的关联
    • 倒排索引-单词到文档id的关系
图片举例
死磕ES-第一章

核心组成

单词词典

记录所有文档的单词,记录单词和倒排列表的关联关系。

单词词典一般比较大,通过B+树或哈希拉链法实现,以满足高性能的插入与查询。

倒排列表

记录了单词对应的文档结合,由倒排索引项组成

「倒排索引项」

  • 文档ID

  • 词频TF

    该单词在文档中出现的次数,用于相关性评分

  • 位置

    单词在文档中分词的位置。用于语句搜索

  • 偏移

    记录单词的开始结束位置,实现高亮显示

图片举例

死磕ES-第一章

ES的倒排索引

  • ES的JSON文档中每个字段都有自己的倒排索引
  • 可以指定对某些字段不做索引
    • 优点:节省存储空间
    • 缺点:字段无法被搜索

ES和RDBMS的类比

死磕ES-第一章

ES分布式特性

ES分布式架构好处

  • 存储的水平扩容
  • 提高系统可用性,部分节点停止服务整个集群的服务不受影响

ES的分布式架构

  • 不同集群通过不同名字区分,默认名字elasticsearch
  • 通过配置文件修改
  • 一个集群多个节点

Master-eligible nodes 和Master Node

  • 每个节点启动后默认是Master eligible节点
    • 可以设置node.maser:false 来禁止
  • Master-eligible节点可以参加选主流程,成为Master节点
  • 当第一个节点启动时候,它会将自己选举为Master节点
  • 每个节点上都保存了集群的状态,只有Master节点才能修改集群状态信息
    • 所有节点信息
    • 所有索引和相关的Mapping和Setting信息
    • 分片的路由信息
    • 集群状态,维护了一个集群中必要的信息
    • 任意节点都能修改信息会导致数据的不一致性

Data Node & Coordinating Node

Data Node

可以保存数据的节点,叫做 DataNode。

负责保存分片的数据。

数据扩展中它是很重要的角色

Coordinating Node

负责接收Client的请求,将请求分发到合适的节点,最终把结果汇集到一起。

集群的健康情况

Green

主分片和副本都能正常分配

Yellow

主分片全部正常分配

有副本分片未能正常分配

Red

有主分片未能正常分配

文档的基本CRUD与批量操作

死磕ES-第一章

Create

死磕ES-第一章

Get

死磕ES-第一章

Index

死磕ES-第一章

Update

死磕ES-第一章

Bulk API

每行需要指定index信息,也可以在URI中指定

mget

批量读取,可以减少网络连接产生的开销

msearch

批量查询

常见错误返回

死磕ES-第一章

Analyzer

Analysis与Analyzer

Analysis的意思是文本分析。把「全文本」转换为「一系列单词」的过程,也叫「分词」

Analysis是通过Analyzer实现的,Analyzer叫分词器。

可以使用ES内置的分词器,也可以按照需求自制分词器。

除了在写入数据的时候转换词条,匹配Query语句时候也需要用相同的分析器对查询语句进行分析。

死磕ES-第一章

组成

分词器是专门处理分词的软件,Analyzer有三部分组成

Character Filters

针对原始文本进行处理,例如去除HTML

Tokenizer

按照规则切分单词

Token Filter

将切分的单词进行加工,小写,删除stopwords,增加同义词

步骤举例

死磕ES-第一章

ES内置的分词器

死磕ES-第一章

Standard Analyzer

  • 默认分词器
  • 按词切分
  • 小写处理

死磕ES-第一章

Simple Analyzer

  • 按照非字母切分,非字母的都去除
  • 小写处理

死磕ES-第一章

While Space

按照空格切分

死磕ES-第一章

Stop Analyzer

相比于Simple Analyzer多了Stop Filter 会把 the ,a,is 等修饰语去除

死磕ES-第一章

Keyword Analyzer

不分词直接将整个当一个term输出

死磕ES-第一章

Pattern Analyzer

  • 通过正则分词
  • 默认是 W+ 非字符的符号进行分隔

死磕ES-第一章

Language Analyzer

按照语言

中文分词的难点

  • 中文句子切分成一个一个词而不是一个一个字
  • 英文中有天然的空格作为间隔
  • 一句中文,在不同的上下文中可能有不同的意思

中文分词器:ICU Analyzer

死磕ES-第一章

Search API

URI Search

在URL中使用查询参数

死磕ES-第一章

通过URI Query实现搜索

死磕ES-第一章

Query String  Syntax(语法)

死磕ES-第一章
死磕ES-第一章
死磕ES-第一章
死磕ES-第一章

Request Body Search

ES提供的基于JSON格式的 Query Domain Specific Language(DSL)

死磕ES-第一章

分页

死磕ES-第一章

排序

死磕ES-第一章

_source filtering

死磕ES-第一章

脚本字段

死磕ES-第一章

使用查询表达式

死磕ES-第一章

短语搜索

死磕ES-第一章

指定查询的索引

死磕ES-第一章

搜索Response

死磕ES-第一章

Query String & Simple Query String

Query String Query

死磕ES-第一章

Simple Query String Query

死磕ES-第一章

搜索的相关性 Relevance

死磕ES-第一章

Web搜索

死磕ES-第一章

电商搜索

死磕ES-第一章

衡量相关性

死磕ES-第一章

Precision & Recall

死磕ES-第一章

Dynamic Mapping 和常见字段类型

Mapping

死磕ES-第一章

字段的数据类型

死磕ES-第一章

什么是Dynamic Mapping

死磕ES-第一章

类型的自动识别

死磕ES-第一章

能否更改Mapping的字段类型

死磕ES-第一章

控制Dynamic Mappings

死磕ES-第一章

显示Mapping设置与常见参数介绍

如何显示地定义一个Mapping

死磕ES-第一章

自定义Mapping的建议

死磕ES-第一章

控制当前字段是否被索引

死磕ES-第一章

Index Options

死磕ES-第一章

Null Value

死磕ES-第一章

Copy_to设置

死磕ES-第一章

数组类型

死磕ES-第一章

多字段特性及配置自定义分词器

多字段类型

死磕ES-第一章

Exact Values VS Full Text

死磕ES-第一章

死磕ES-第一章

自定义分词

死磕ES-第一章

死磕ES-第一章

Index Template 和 Dynamic Template

管理很多的索引

死磕ES-第一章

Index Template

死磕ES-第一章
死磕ES-第一章

工作方式

死磕ES-第一章

Dynamic Template

死磕ES-第一章
死磕ES-第一章

匹配规则参数

死磕ES-第一章

写在最后

学习资料:极客时间课程->《ElasticSearch核心技术与实战》

课程课件地址:https://gitee.com/geektime-geekbang/geektime-ELK

学习感受:目前学了30%,感觉视频如果想连贯学习下来还是会容易分心的,必须学完几节课,然后看着课件自己整理笔记,像我这样,不然就容易忘记看过的视频都主要讲了什么。还有就是ES的学习资源不多,这也是为数不多的课程了,ES我觉得还是先知道怎么用再来看这些吧,不然感觉底层的东西太多了,而且这个很大一部分都在介绍API的使用,实际场景可能用不到这么多。


原文始发于微信公众号(0error):死磕ES-第一章

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/21858.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!