文章目录
Elasticsearch介绍
优势
- 高可用
- 海量数据搜索、PB级
- 便于扩展,可以很方便增加一个节点
- 实时的,延时低于1ms
全文检索
Lucene词汇表和架构
- 文档(
Document
): 索引和搜索时的主要数据载体,包含一个或多个现存有数据的字段 - 字段(
field
): 文档的一部分,包含名称和值两部分 - 词(
term
): 一个搜索单元,表示文本中得一个单词 - 标记(
token
): 表示在字段中出现词得属性,又词得文本、开始和结束偏移量以及类型组成
使用案例
- Github
- 维基百科
- 百度
对比Elasticsearch和Solr
- Solr利用zookeeper分布式管理,Elasticsearch自带分布式协调管理能力
- Solr支持更多的数据,ES仅支持json
- Solr官方提供的功能更多,es有很多第三方插件
- Solr在传统的搜索应用好于es,es处理实时应用搜索效率更好
对比Elasticsearch和splunk
JSON
- JSON(
JavaScript Object Notation
)是一种轻量级的数据交换格式,不仅易于人们阅读和编写 - json基本数据类型
- 数字:有符号的十进制数字,可能包含小数部分,也可能使用指数E表示法,但不能包括非数字,如NaN。该格式不区分整数和浮点数。
- 字符串:0个或多个Unicode字符的序列。字符串用双引号分隔,并支持反斜杠转义语法。
- 布尔值:为true或false的任一值。
- 数组:0个或多个值的有序列表,每个值可以是任何类型。数组使用方括号符号,元素以逗号分隔。
- 对象:名称/值对的无序集合,其中名称(也称为键)是字符串。由于对象旨在表示关联数组,推荐每个键在对象内是唯一的。对象用大括号分隔,并使用逗号分隔每对,而在每一对中,用冒号(:)将键或名称与其值分隔开
- null:一个空值,使用单词null
ES基础
-
ES把输入文档和复杂的查询语法及输出的查询结果封装为XContent,数据就可以采用XML和JSON格式表示成可读的形式
-
使用
RESTFul API
隐藏Lucene的复杂性 -
Lucene是由一个Java语言开发的开源全文检索引擎工具包。把Lucene用Netty封装成服务,使用JSON访问就是Elasticsearch,底层是Luecen
-
内置了对分布式集群和分布式索引的管理,所以相对Solr来说,不需要额外安装ZooKeeper,其更容易分布式部署
-
搜索系统整体架构
ES结构主要特征
- 每一个运行的实例称之为一个节点,可以在同一台计算机上运行多个实例,也可以在每台计算机上只运行一个实例
- 多个运行的实例可以组成一个集群,集群中存在一个动态选举出的一个主节点(
master
),主节点宕机,会自动选出新的主节点,所以不存在单点故障 - 为了实现容错,Elasticsearch把查询文档集合分解为多个小的索引,每一个小的索引称之为==分片(
shard
),每一个分片都可以有0到多个副本(replicas
),每一个副本==都是分片的完整复制品,这样提高了查询速度 - 通过**
Gateway
来管理集群恢复,可以配置集群加入多个节点才能启动恢复数据。网关配置用于恢复任何失败的索引,当节点崩溃重新启动时,Elasticsearch将网关读取所有的索引和元数据** Transport
:内部节点或者集群客户端之间的交互方式,默认使用TCP协议进行交互,同时支持HTTP协议(JSON格式)
、Thrift
,Servlet
,Memcached
,ZeroMQ
等多种传输协议- 支持多种扩展插件
数据架构的主要概念
-
索引(
Index
)- 逻辑数据的存储单元,相当于
RDBMS
的数据库 - 其结构为快速有效的全文索引准备,不存储原始值
- ES把索引放在一台或多台服务器上
- 逻辑数据的存储单元,相当于
- 每个索引有一个多个分片(
Shards
),每个分片可以有多个副本(replica
)
-
文档(
document
)- 存储在ES中的主要实体,相当于
RDBMS
中的一行记录 - 在文档中,相同字段必须有相同类型
- 多值字段(
multivalued)
:文档由多个字段组成,每个字段多次出现在一个文档里
- 存储在ES中的主要实体,相当于
-
文档类型
-
一个索引对象可以存储很多不同用途的对象
-
相当于Mysql中的表
-
-
映射
- ES在映射中存储有关字段的信息,每一个文档类型都有自己的映射
Elasticsearch主要概念
-
节点和集群
-
分片
- 作用:解决遇到大量文档时,内存限制、硬盘能力、处理能力不足、无法快速响应,可以把数据拆分成
shard
,存放在不同节点上,其中每个分片都是一个独立的索引, - 查询的索引分布在多个**
分片
**上,ES会把查询发送给每个相关的分片,并将结果合并在一起 - 应用程序并不知道分片的存在,多个分片可以加快索引
- 作用:解决遇到大量文档时,内存限制、硬盘能力、处理能力不足、无法快速响应,可以把数据拆分成
-
副本(
replica
)- 作用:为了提高查询吞吐量和实现可用性
replica
是一个分片的精确复制,每个分片有零个或多个副本- 主分片(
primary
):被动选择更改索引操作,其余成为副本分片(replica shard
) - 主分片丢失,该分片数据在集群不可用,集群将提升副本为新的主分片
-
Query DSL
- 查询语言
-
时光之门
索引建立和搜索
-
Elasticsearch使用文档的唯一标识符来计算文档应该被放到哪个分片中
-
执行搜索请求
ES与关系型数据库(RDBMS
)对比
Elasticsearch | RDBMS |
---|---|
Cluster | Database |
Shard | Shard |
Index | table |
Field | Column |
Documnet | Row |
分词器
-
从一串文本切分出一个一个的词条,对词条进行标准化
-
包括三部分
character filter
: 分词前的预处理,过滤HTML标签,特俗符号转换- tokenzier:分词
- token filter:标准化
-
内置分词器
HTTP协议
- 客户端发起一个到服务器指定端口的http请求,服务器端按指定格式返回网页或者其他网络资源
-
URL