阅读 2387

Elasticsearch-核心篇(1)-基础知识

一、Elasticsearch Stack

  1. The Elastic Stack包括 Elasticsearch、Kibana、Beats 和 Logstash(也称为 ELK Stack),能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化
  2. Elaticsearch简称为ES,ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据
  3. Elasticsearch是一个开源的搜索引擎,建立在一个全文搜索引擎库Apache Lucene基础之上
  4. Elasticsearch使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API
  5. Elasticsearch形容
    • 一个分布式的实时文档存储,每个字段可以被索引与搜索
    • 一个分布式实时分析搜索引擎
    • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
    • 跨平台、跨系统、跨语言,只需要通过http发出请求即可获取数据
  6. GitHub源码地址:github.com/elastic/ela…
  7. Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比
关系型数据库ELasticsearch
database(数据库)index(索引库)
table(数据表)type(类型)
row(数据行)document(文档)
Field(数据列)field(字段)
  1. 基本格式:协议://ip:port/索引/类型/记录
  2. 一个ES集群可以包含多个索引库,每个索引库又包含了很多类型(ES7后已经作废),类型中可以包含多个文档,每个文档又可以包含多个字段
    • ES7后类型只有一个就是 _doc ,用于解决搜索一个关键词需要到不同的类型中查找文档
    • 相当于所有的数据全部都在一个数据表中,这样就不会存在跨类型查询,可以加快检索速度
  3. JSON作为文档序列化的格式,比如一条用户信息
{
    "name" : "TianXinCoord",
    "email" : "tianxincoord@163.com",
    "about" : "Elasticsearch",
    "interests": [ "code", "music" ]
}
复制代码

二、倒排索引

2.1 倒排索引

  1. 倒排索引源于实际应用中需要根据属性的值来查找记录,这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址
  2. 由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)
  3. 带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)
  4. 倒排索引中的索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制
  5. 搜索引擎的关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的频度(出现的次数)、位置(出现在哪一篇文章或网页中,及有关的日期,作者等信息),好比一本书的目录、标签一般,读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面,不必再从书的第一页到最后一页,一页一页地查找
  6. Lucene使用的是倒排文件索引结构,下面用例子介绍该结构及相应的生成算法,假设有两篇文章,文章1和文章2
    • 文章1的内容为∶ Tom lives in Guangzhou,I live in Guangzhou too.
    • 文章2的内容为∶ He once lived in Shanghai.

2.2 取得关键词

  1. 由于Lucene是基于关键词索引和查询,首先要取得这两篇文章的关键词,通常需要如下处理措施
    • 现在有的是文章内容,即一个字符串,先要找出字符串中的所有单词,即分词
    • 英文单词由于用空格分隔,比较好处理,中文单词间由于是连在一起的,所以需要特殊的分词处理
    • 文章中的"in""once""too"等词没有什么实际意义,中文中的"的""是"等字通常也无具体含义,这些不代表概念的词可以过滤掉
    • 用户通常希望查"He"时能把含"he"和"HE"的文章也找出来,所以所有单词需要统一大小写
    • 用户通常希望查"live"时能把含"lives"和"lived"的文章也找出来,所以需要把"lives","lived"还原成"live"
    • 文章中的标点符号通常不表示某种概念,也可以过滤掉
    • 在Lucene 中以上措施由 Analyzer类完成,经过上面处理后,得到如下结果
      • 文章1的所有关键词为∶【tom】【live】【guangzhou】【i】【live】【guangzhou
      • 文章2的所有关键词为∶【he】【live】【shanghai】

2.3 建立倒排索引

  1. 有了关键词后就可以建立倒排索引了
    • 上面的对应关系是:"文章号"对"文章中所有关键词"
    • 倒排索引把这个关系倒过来,变成"关键词"对"拥有该关键词的所有文章号"
  2. 仅知道有哪些关键词还不够,还需要知道关键词在文中出现的次数和位置,通常有两种位置
    • 字符位置,即记录该词是文章中第几个字符(优点是显示并定位关键词快)
    • 关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组查询快),Lucene 中记录的就是这种位置
    • 加上"出现频率"和"出现位置"信息后,索引结构如下
    • 【关键词】在文章中出现的【文章号】出现了【几次(出现频率)】,位置分别是【出现位置】

  1. 实现时,Lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)位置文件(positions)保存
  2. 其中词典文件不仅保存了每个关键词,还保留了指向频率文件秆位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息
  3. Lucene中使用了feild的概念,用于表达信息所在位置(如标题中、文章中、URL中)在建索引中,该feild信息也记录在词典文件中,每个关键词都有一个field信息,因为每个关键字一定属于一个或多个feild

三、名词术语

3.1 索引词(term)

  1. 在 Elasticsearch中索引词(term)是一个能够被索引的精确值
  2. methodRefrence、Foo、FOO 几个单司是不同的索引词
  3. 索引词(term)是可以通过 term 查询进行准确的搜索

3.2 文本(text)

  1. 文本是一段普通的非结构化文字,相当于原始数据
  2. 通常文本会被分析成一个个的索引词,存储在 Elasticsearch的索引库中
  3. 为了让文本能够进行搜索,文本字段需要事先进行分析
  4. 当对文本中的关键词进行查询的时候,搜索引擎应该根据搜索条件搜索出原文本

3.3 分析(analysis)

  1. 分析是将文本转换为索引词的过程,分析的结果依赖于分词器,比如:FOO BAR、 Foo-Bar 和foo bar这几个单词有可能会被分析成相同的索引词foo和bar,这些索引词存储在Elasticsearch的索引库中
  2. 当用FoO:bAR进行全文搜索的时候,搜索引擎根据匹配计算也能在索引库中搜索出之前的内容,这就是Elasticsearch 的搜索分析

3.4 集群(cluster)

  1. 集群由一个或多个节点组成,对外提供服务、索引、搜索功能
  2. 在所有节点,一个集群有一个唯一的名称默认为"elasticsearch",此名称很重要,因为每个节点只能是集群的一部分,当该节点被设置为相同的集群名称时,就会自动加入集群
  3. 当需要有多个集群的时候,要确保每个集群的名称不能重复,否则,节点可能会加入错误的集群
  4. 请注意,一个节点只能加入一个集群。此外,还可以拥有多个独立的集群,每个集群都有其不同的集群名称。例如,在开发过程中,你可以建立开发集群库和测试集群库,分别为开发、测试服务

3.5 节点(node)

  1. 一个节点是一个逻辑上独立的服务,它是集群的一部分,可以存储数据,并参与集群的索引和搜索功能。就像集群一样,节点也有唯一的名字,在启动的时候分配。如果你不想要默认名称,你可以定义任何你想要的节点名
  2. 这个名字在管理中很重要,在网络中 Elasticsearch集群通过节点名称进行管理和通信
  3. 一个节点可以被配置加入一个特定的集群。默认情况下,每个节点会加入名为Elasticsearch的集群中,这意味着如果你在网络上启动多个节点,如果网络畅通,他们能彼此发现并自动加入一个名为Elasticsearch的集群中
  4. 在一个集群中,可以拥有多个想要的节点,当网络没有集群运行的时候,只要启动任何一个节点,这个节点会默认生成一个新的集群,这个集群会有一个节点

3.6 路由(routing)

  1. 当存储一个文档的时候,它会存储在唯一的主分片中,具体哪个分片是通过散列值进行选择
  2. 默认情况下,这个值是由文档的ID生成。如果文档有一个指定的父文档,则从父文档 ID 中生成,该值可以在存储文档的时候进行修改

3.7 分片(shard)

  1. 分片是单个Lucene 实例,这是 Elasticsearch管理的比较底层的功能
  2. 索引是指向主分片和副本分片的逻辑空间,对于使用,只需要指定分片的数量,其他不需要做过多的事情
  3. 在开发使用的过程中,我们对应的对象都是索引,Elasticsearch会自动管理集群中所有的分片,当发生故障的时候,Elasticsearch 会把分片移动到不同的节点或者添加新的节点
  4. 一个索引可以存储很大的数据,这些空间可以超过一个节点的物理存储的限制。例如,十亿个文档占用磁盘空间为 1TB,仅从单个节点搜索可能会很慢,还有一台物理机器也不一定能存储这么多的数据
  5. 为了解决这一问题,Elasticsearch将索引分解成多个分片,当创建一个索引,可以简单地定义想要的分片数量
  6. 每个分片本身是一个全功能的、独立的单元,可以托管在集群中的任何节点

3.8 主分片(primary shard)

  1. 每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中
  2. 可以事先制定分片的数量,当分片一旦建立,则分片的数量不能修改

3.9 副本分片(replica shard)

  1. 每一个分片有零个或多个副本,副本主要是主分片的复制,其中有两个目的
    • 高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片
    • 提高性能:当查询的时候可以到主分片或者副本分片中进行查询
  2. 默认情况下,一个主分片配有一个副本,但副本的数量可以在后面动态地配置增加
  3. 副本分片必须部署在不同的节点上,不能部署在和主分片相同的节点上
  4. 分片主要有两个很重要的原因
    1. 允许水平分割
    2. 扩展数据

3.10 索引(Index)

  1. 一个索引就是一个拥有几分相似特征的文档的集合,比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引
  2. 一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字
  3. 在一个集群中,可以定义任意多的索引,能搜索的数据必须索引,这样的好处是可以提高查询速度,比如:新华字典前面的目录就是索引的意思,目录可以提高查询速度
  4. Elasticsearch索引的精髓:一切设计都是为了提高搜索的性能

3.11 类型(Type)

  1. 在一个索引中,可以定义一种或多种类型
  2. 一个类型是索引的一个逻辑上的分类/分区,其语义完全可以自主来定
  3. 通常会为具有一组共同字段的文档定义一个类型,不同的版本,类型发生了不同的变化
版本Type
5.x支持多种type
6.x只能有一种type
7.x默认不再支持自定义索引类型(默认类型为:_doc)

3.12 文档(Document)

  1. 一个文档是一个可被索引的基础信息单元,也就是一条数据比如:可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档
  2. 文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式
  3. 在一个index/type里面,你可以存储任意多的文档

3.13 字段(Field)

  1. 相当于是数据表的字段,对文档数据根据不同属性进行的分类标识

3.14 映射(Mapping)

  1. mapping是处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等等
  2. 这些都是映射里面可以设置的,其它就是处理ES里面数据的一些使用规则设置也叫做映射,按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能更好

3.15 分配(Allocation)

  1. 将分片分配给某个节点的过程,包括分配主分片或者副本
  2. 如果是副本,还包含从主分片复制数据的过程,这个过程是由master节点完成
文章分类
后端