es 面向文档系统,josn格式
image.png

1 索引

image.png

  • 索引是文档的容器,是一类文档的结合

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

    • 「Mapping」定义文档字段的类型
    • 「Setting」定义不同的数据分布

      1.1 索引的不同语义

      image.png

      1.1.1 Type 类型

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

      2 Document 文档

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

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

  • 每个文档都有一个Unique ID
    可以自己指定也可以由ES生成

2.1 JSON文档

  • 一篇文档包含了一系列的字段。类似数据库的一条记录
  • 格式灵活不需要预先定义格式

    • 字段的类型可以指定或者通过ES自动推算
    • 支持数组、支持嵌套

      2.2 元数据

      用于标注文档的相关信息
  • _index :文档所属的索引名

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

image.png

分片

主分片

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

副本

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

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

    分片的设定

    分片数设定过小

  • 后续无法增加节点实现水平扩展

  • 单个分片的数据量太大,导致数据重新分配耗时

    分片数设定过大

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

  • 影响搜索结果的相关性打分,影响统计结果的准确性

  • 单个节点过多分片,资源浪费,牺牲性能

    倒排索引

    介绍

    正排和倒排的区别

    正排

    image.png

    倒排

    image.png

    图书和搜索引擎的类比

  • 图书

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

    • 正排索引-文档id到文档内容和单词的关联
    • 倒排索引-单词到文档id的关系

      图片举例

      image.png

      核心组成

      单词词典

      记录所有文档的单词,记录单词和倒排列表的关联关系。
      单词词典一般比较大,通过B+树或哈希拉链法实现,以满足高性能的插入与查询。

      倒排列表

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

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

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

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

图片举例

image.png

ES的倒排索引

  • ES的JSON文档中每个字段都有自己的倒排索引
  • 可以指定对某些字段不做索引

    • 优点:节省存储空间
    • 缺点:字段无法被搜索

      ES和RDBMS的类比

      image.png

      3 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与批量操作

      image.png

      Create

      image.png

      Get

      image.png

      Index

      image.png

      Update

      image.png

      Bulk API

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

      mget

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

      msearch

      批量查询

      常见错误返回

      image.png

      Analyzer

      Analysis与Analyzer

      Analysis的意思是文本分析。把「全文本」转换为「一系列单词」的过程,也叫「分词」
      Analysis是通过Analyzer实现的,Analyzer叫分词器。
      可以使用ES内置的分词器,也可以按照需求自制分词器。
      除了在写入数据的时候转换词条,匹配Query语句时候也需要用相同的分析器对查询语句进行分析。
      image.png

      组成

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

      Character Filters

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

      Tokenizer

      按照规则切分单词

      Token Filter

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

      步骤举例

      image.png

      ES内置的分词器

      image.png

      Standard Analyzer

  • 默认分词器

  • 按词切分
  • 小写处理

image.png

Simple Analyzer

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

image.png

While Space

按照空格切分
image.png

Stop Analyzer

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

Keyword Analyzer

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

Pattern Analyzer

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

image.png

Language Analyzer

按照语言

中文分词的难点

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

中文分词器:ICU Analyzer
image.png

Search API

URI Search

在URL中使用查询参数

image.png

通过URI Query实现搜索

image.png

Query String Syntax(语法)

image.png
image.png
image.png
image.png

Request Body Search

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

分页

image.png

排序

image.png

_source filtering

image.png

脚本字段

image.png

使用查询表达式

image.png

短语搜索

image.png

指定查询的索引

image.png

搜索Response

image.png

搜索的相关性 Relevance

image.png

Web搜索

image.png

电商搜索

image.png

衡量相关性

image.png

Precision & Recall

image.png

Dynamic Mapping 和常见字段类型

Mapping

image.png

字段的数据类型

image.png

什么是Dynamic Mapping

image.png

类型的自动识别

image.png

能否更改Mapping的字段类型

image.png

控制Dynamic Mappings

image.png

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

如何显示地定义一个Mapping

image.png

自定义Mapping的建议

image.png

控制当前字段是否被索引

image.png

Index Options

image.png

Null Value

image.png

Copy_to设置

image.png

数组类型

image.png

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

多字段类型

image.png

Exact Values VS Full Text

image.png
image.png

自定义分词

image.png
image.png

Index Template 和 Dynamic Template

管理很多的索引

image.png

Index Template

image.png
image.png

工作方式

image.png

Dynamic Template

image.png
image.png

匹配规则参数

image.png