帮助中心 > 新闻资讯 >ES-科普知识篇

ES-科普知识篇

发布时间:2019-01-15

本文主旨是为了让更多的码农朋友了解ES,便于更好的使用。

前言

随着近年来大数据的发展,搜索对于企业以及用户来说已经很是重要了。在搜索引擎的世界中,Lucene是一个Apache的开源搜索引擎工具包,相当于一个发动机,ES是将其封装打包的成品车。同样被打包的还有solr,其各有优缺点,但让互联网公司青睐的是ES的近实时性,所以ES逐步风生水起。

1. ES是什么

ES是一个基于Lucene构建的开源、分布式、RESTful接口全文 搜索引擎
ES可以干什么:

  • 大批数据量的精准搜索;
  • 收集、分析和挖掘日志或者交易信息;
  • 价格提醒;
  • 快速调查、分析和可视化数据;
  • GitHub。
    ES的特点
  • (横向)可扩展性;
  • 分布性;
  • 高可用;
  • 简单易用。

2. 全文搜索

全文搜索是指计算机搜索程序通过扫描文章的每一个词,并对其简历索引,指明该词在文章中出现的次数和位置,当用户查询时,搜索程序根据事先建立好的索引进行查找,并将结果返回给用户。
倒排索引
因为Lucene采用的是倒排索引,此处简单介绍下倒排索引。

开发中常见的索引是根据记录来查找属性,如根据ID来获取文章,然后看文章里面都讲的是什么。而实际生活中更多的是需要根据属性来查找值,比如你在搜索本文时,是根据关键字“ES”查询文章的标题、内容等,来获取文章的。这也就是倒排索引的起源。

倒排索引的建立大致分为三步:

  1. 取关键字:取一些偏向有实际意义的关键字,剔除的、地、得、是之类的字;
  2. 建立倒排索引:以关键字,文章ID,出现频次,出现位置组成索引;
  3. 实现:将关键字作为词典文件(Term Dictionary),文章ID和出现频次作为频率文件(frequencies),出现位置作为位置文件(positions)保存。其中词典文件中有指针指向后两者。

Tips:关键字以字符顺序来排,所以可以使用二元搜索法快速定位。一般索引采用的B-tree结构。

压缩算法

3. ES术语

以下只是对术语的概述,如想更深入的了解,看完概述后,参见Tips部分。
底层分析部分术语

索引词(term):一个能够被索引的精确值。
文本(text):一段非常普通的文字。
分析(analysis):将文本转换为索引词的过程,分析的结果依赖于分词器。

配置部分术语

节点(node):一个逻辑上独立的服务,可以有储存数据、服务管理、负载等功能。
集群(cluster):至少有一个ES节点的对外提供服务的ES群体。
分片(shard):单个Lucene实例。ES中存储数据的地方,也是比较底层的功能。
路由(routing):文档存储到主分片中的过程。
主分片(primary shard):系统存储数据文档的地方。
副分片(replica shard):主分片的复制。
复制(replica):主分片到副分片的过程。

开发部分术语

索引(index):具有相同结构的文档集合。
类型(type):索引的逻辑分区。
字段(field):每个字段对应一个字段类型,如整数、字符串等。
主键(ID):文件的唯一标识。
文档(document):存储在ES中的一个JSON字符串。
映射(mapping):定义了每一个索引type 的字段类型和索引范围内的设置。

为了更好的理解开发部分术语,在此引入ES和RDBMS的比较。

Relational DB  ⇒ Databases  ⇒ Tables ⇒ Rows      ⇒ Columns
关系型数据库        数据库        表      行            列  
Elasticsearch  ⇒ Indexes    ⇒ Types  ⇒ Documents ⇒ Fields
Elasticsearch      索引          类型      文档       域(字段)

Tips:

  • 分词器会将文本分析成索引词。
  • 集群的名称必须唯一,当集群名称一样时,会自动加入集群。多个集群时,注意修改集群名称。如不修改默认为“Elasticsearch”。
    节点名字也必须唯一,启动自分配。节点可以存储数据、参与索引和搜索功能。ES通过名称来对节点进行管理和通信。
  • 在存储文档时,会将其存在唯一的主分片中,一般通过文档ID散列来选择。默认的主分片有5个,副分片也有5个。当主分片失败时,会副分片中选一个作为主分片。
    分片有主副是为了更好的水平扩展和并行操作。
  • 字段还可以指定如何分析该字段的值。

以下内容建议在搭建完一个ES服务器之后再进行阅读:

自动选举
elasticsearch集群一旦建立起来以后,会选举出一个master,其他都为slave节点。
当主节点挂了,从节点会自己选举出一个主节点。
当机器分布在两个机房时,两个机房断开连接,每个机房会自己选举出一个master。当连接回复,此时会出现数据冲突。
解决办法discovery.zen.minimum_master_nodes属性设置为超过一半的节点数。
如5台master,A机房3台master,B机房2台master,A、B机房失连,此时两个机房会自己选举出自己的master,恢复连接后,会出现脑裂现象,此时可以设置discovery.zen.minimum_master_nodes = 3,就会以A机房(大于等于3的)的master为主,B机房的节点会停止服务(处于一直寻找集群状态,直到AB连通)。

自动发现
elasticsearch的集群是内嵌自动发现功能的。
意思就是说,你只需要在每个节点配置好了集群名称,节点名称,互相通信的节点会根据es自定义的服务发现协议去按照多播的方式来寻找网络上配置在同样集群内的节点。

脑裂
也叫区间集群(partitioned cluster),当两(多)个节点同时认为自已是唯一处于活动状态的服务器从而出现争用资源的场景。所以为了防止脑裂,无论集群还是分布式,节点总个数一定要有事先的规划。

单播(unicast)协议:只能指定要发现的节点信息,指定集群地址discovery.zen.ping.unicast.hosts。

组播(multicast)协议:自动发现同一网段的节点集群。

相关推荐