参考:https://my.oschina.net/u/4337264/blog/3454755
https://blog.csdn.net/u012211603/article/details/84163313?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-84163313-blog-108235285.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-84163313-blog-108235285.pc_relevant_paycolumn_v3&utm_relevant_index=1

关系型数据库和ES对比

关系型数据库 es
数据库 索引index
类型type
文档document
字段 属性field

Elasticsearch 近实时,延迟(通常是1秒内)。

索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。如订单索引、商品索引、客户索引。。。
类型(type)
类型是索引的一个逻辑上的分类/分区,一组共同字段的文档定义一个类型。
NOTE: 在5.x版本以前可以在一个索引中定义多个类型,6.x之后版本也可以使用,但是不推荐,在7~8.x版本中彻底移除一个索引中创建多个类型。

映射(Mapping)
Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema,用于定义一个索引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型。

文档(document)
一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。比如,你可以拥有某一个员工的文档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。

  • json object,由字段(field)组成,常见数据类型如下:
    • 字符串:text,keyword
    • 数值型:long,integer,short,byte,double,float,half_float,scaled_float
    • 布尔:boolean
    • 日期:date
    • 二进制:binary
    • 范围类型:integer_range,float_range,long_range,double_range,date_range
  • 每个文档有唯一的id标识
    • 自行指定
    • es自动生成

节点node
一个Elasticsearch的运行实例,是集群的构成单元
集群Cluster
由一个或多个节点组成,对外提供服务

索引

正排索引与倒排索引

  • 正排索引
    • 文档id到文档内容、单词的关联关系
  • 倒排索引
    • 单词到文档id的关联关系 | 单词 | 文档ID列表 | | —- | —- | | elasticsearch | 1 | | 流行 | 1 | | 搜索引擎 | 1,3 | | 世界 | 2 |

倒排索引详解

  • 倒排索引是搜索引擎的核心,主要包含两部分:
    • 单词字典(Term Dictionary)
    • 倒排列表(Posting List)
  • es存储的是一个json格式的文档,其中包含多个字段,每个字段会有自己的倒排索引

    单词词典

  • 单词字典(Term Dictionary)是倒排索引的重要组成部分

    • 记录所有文档的单词,一般都比较大
    • 记录单词到倒排列表的关联信息
  • 单词字典的实现一般是用B+ Tree

    倒排列表

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

  • 倒排索引项主要包含如下信息:
    • 文档ID,用于获取原始信息
    • 单词频率,记录该单词在该文档中的出现次数,用于后续相关性算分
    • 位置,记录单词在该文档中的分词位置(多个),用于做词语搜索
    • 偏移,记录单词在文档的开始和结束位置,用于做高亮显示

数据类型

  • 核心数据类型
    • 字符串:text,keyword
    • 数值型:long,integer,short,byte,double,float,half_float,scaled_float
    • 布尔:boolean
    • 日期:date
    • 二进制:binary
    • 范围类型:integer_range,float_range,long_range,double_range,date_range
  • 复杂数据类型
    • 数组类型array
    • 对象类型object
    • 嵌套类型nested object
  • 地理位置数据类型
    • geo_point
    • geo_shape
  • 专用类型
    • 记录ip地址ip
    • 实现自动补全completion
    • 记录分词数token_count
    • 记录字符串hash值murmur3
    • percolator
    • join
  • 多字段特性
    • 允许对同一个字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜素,只需要在人名中新增一个子字段为pinyin即可
      Match Query -流程
      首先对查询语句进行分词,分词后分别根据字段的倒排索引进行匹配算分,并会匹配到一个或多个文档,再将匹配到的文档进行汇总得分,根据得分排序返回多个文档